From e149b35fcc6a882ad812d9a7ca9c4b7cf4cfd0f7 Mon Sep 17 00:00:00 2001 From: mcfly Date: Sat, 2 Dec 2006 04:36:16 +0000 Subject: [PATCH] new module creation --- article.php | 41 + backend.php | 105 + banner.php | 125 + class2.php | 1612 ++++ comment.php | 326 + contact.php | 160 + content.php | 73 + download.php | 739 ++ e107.htaccess | 5 + e107_admin/ad_links.php | 465 ++ e107_admin/admin.php | 269 + e107_admin/admin_classis.php | 27 + e107_admin/admin_combo.php | 27 + e107_admin/admin_etalkers.php | 27 + e107_admin/admin_log.php | 114 + e107_admin/adminb.php | 27 + e107_admin/administrator.php | 377 + e107_admin/article.php | 23 + e107_admin/auth.php | 175 + e107_admin/banlist.php | 131 + e107_admin/banner.php | 677 ++ e107_admin/cache.php | 87 + e107_admin/cascade.php | 27 + e107_admin/categories.php | 27 + e107_admin/classis.php | 27 + e107_admin/combo.php | 27 + e107_admin/comment.php | 47 + e107_admin/compact.php | 27 + e107_admin/content.php | 23 + e107_admin/core_image.php | 5711 +++++++++++++ e107_admin/cpage.php | 453 + e107_admin/credits.php | 257 + e107_admin/db.php | 281 + e107_admin/db_verify.php | 402 + e107_admin/docs.php | 58 + e107_admin/download.php | 1646 ++++ e107_admin/e107_update.php | 117 + e107_admin/emoticon.php | 353 + e107_admin/fileinspector.php | 785 ++ e107_admin/filemanager.php | 377 + e107_admin/filetypes_.php | 1 + e107_admin/fla.php | 157 + e107_admin/footer.php | 99 + e107_admin/frontpage.php | 266 + e107_admin/header.php | 336 + e107_admin/image.php | 385 + e107_admin/includes/beginner.php | 89 + e107_admin/includes/cascade.php | 59 + e107_admin/includes/categories.php | 83 + e107_admin/includes/classis.php | 66 + e107_admin/includes/combo.php | 70 + e107_admin/includes/compact.php | 73 + e107_admin/index.php | 23 + e107_admin/lancheck.php | 680 ++ e107_admin/language.php | 465 ++ e107_admin/links.php | 790 ++ e107_admin/mailout.php | 848 ++ e107_admin/menus.php | 522 ++ e107_admin/message.php | 191 + e107_admin/meta.php | 141 + e107_admin/modcomment.php | 179 + e107_admin/newspost.php | 1105 +++ e107_admin/notify.php | 187 + e107_admin/phpinfo.php | 34 + e107_admin/plugin.php | 575 ++ e107_admin/prefs.php | 981 +++ e107_admin/review.php | 23 + e107_admin/search.php | 410 + e107_admin/sql/core_pg.php | 300 + e107_admin/sql/core_sql.php | 569 ++ e107_admin/sql/db_update/index.html | 0 e107_admin/sql/extended_country.php | 271 + e107_admin/theme.php | 39 + e107_admin/ugflag.php | 80 + e107_admin/update_routines.php | 1686 ++++ e107_admin/updateadmin.php | 73 + e107_admin/upload.php | 333 + e107_admin/userclass.php | 135 + e107_admin/userclass2.php | 400 + e107_admin/userinfo.php | 71 + e107_admin/users.php | 1083 +++ e107_admin/users_extended.php | 1011 +++ e107_admin/users_extended_predefined.php | 56 + e107_admin/ver.php | 24 + e107_admin/wmessage.php | 231 + e107_docs/README.html | 210 + e107_docs/README_UPGRADE.html | 150 + e107_docs/gpl.txt | 342 + e107_docs/help/English/Administrators | 6 + e107_docs/help/English/BBCode | 12 + e107_docs/help/English/Banlist | 6 + e107_docs/help/English/Banners | 18 + e107_docs/help/English/Cache | 9 + e107_docs/help/English/Chatbox | 9 + e107_docs/help/English/Classes | 5 + e107_docs/help/English/Downloads | 6 + e107_docs/help/English/Emoticons | 6 + e107_docs/help/English/Errors | 3 + e107_docs/help/English/Forums | 15 + e107_docs/help/English/Front_Page | 6 + e107_docs/help/English/Help! | 9 + e107_docs/help/English/Links | 6 + e107_docs/help/English/Maintainance | 6 + e107_docs/help/English/Menus | 12 + e107_docs/help/English/News | 12 + e107_docs/help/English/Preferences | 15 + e107_docs/help/English/Uploads | 6 + e107_docs/help/English/Users | 3 + e107_docs/help/English/Welcome_Message | 3 + e107_docs/index.html | 0 e107_docs/style.css | 40 + e107_files/bbcode/b.bb | 1 + e107_files/bbcode/blockquote.bb | 1 + e107_files/bbcode/br.bb | 1 + e107_files/bbcode/center.bb | 1 + e107_files/bbcode/code.bb | 38 + e107_files/bbcode/color.bb | 38 + e107_files/bbcode/email.bb | 5 + e107_files/bbcode/file.bb | 15 + e107_files/bbcode/flash.bb | 21 + e107_files/bbcode/hide.bb | 24 + e107_files/bbcode/html.bb | 3 + e107_files/bbcode/i.bb | 1 + e107_files/bbcode/img.bb | 62 + e107_files/bbcode/index.html | 0 e107_files/bbcode/justify.bb | 1 + e107_files/bbcode/left.bb | 1 + e107_files/bbcode/link.bb | 26 + e107_files/bbcode/list.bb | 48 + e107_files/bbcode/php.bb | 4 + e107_files/bbcode/quote.bb | 2 + e107_files/bbcode/right.bb | 1 + e107_files/bbcode/size.bb | 8 + e107_files/bbcode/spoiler.bb | 2 + e107_files/bbcode/stream.bb | 51 + e107_files/bbcode/textarea.bb | 20 + e107_files/bbcode/time.bb | 2 + e107_files/bbcode/u.bb | 1 + e107_files/bbcode/url.bb | 14 + e107_files/cache/index.html | 0 e107_files/cache/user_extended.xml | 67 + e107_files/def_e107_prefs.php | 161 + e107_files/downloadimages/index.html | 0 e107_files/downloadimages/null.txt | 0 e107_files/downloads/index.html | 0 e107_files/downloads/null.txt | 0 e107_files/downloadthumbs/index.html | 0 e107_files/downloadthumbs/null.txt | 0 e107_files/e107.css | 44 + e107_files/e107.js | 322 + e107_files/e_ajax.js | 250 + e107_files/images/index.html | 0 e107_files/images/null.txt | 0 e107_files/import/import_mapper.php | 149 + e107_files/import/import_readme.txt | 135 + e107_files/import/index.html | 0 e107_files/import/mambo.php | 156 + e107_files/import/phpbb2.php | 471 ++ e107_files/import/phpnuke.php | 393 + e107_files/index.html | 0 e107_files/misc/index.html | 0 e107_files/misc/null.txt | 0 e107_files/nav_menu.css | 108 + e107_files/nav_menu.js | 511 ++ e107_files/nav_menu_alt.js | 588 ++ e107_files/popup.js | 157 + e107_files/public/avatars/index.html | 0 e107_files/public/index.html | 0 e107_files/resetcore.php | 23 + e107_files/resetcore/index.html | 0 e107_files/resetcore/resetcore.php | 349 + e107_files/resetcore/style.css | 58 + e107_files/shortcode/admin_alt_nav.sc | 130 + e107_files/shortcode/admin_credits.sc | 5 + e107_files/shortcode/admin_docs.sc | 24 + e107_files/shortcode/admin_help.sc | 30 + e107_files/shortcode/admin_icon.sc | 12 + e107_files/shortcode/admin_lang.sc | 116 + e107_files/shortcode/admin_latest.sc | 44 + e107_files/shortcode/admin_log.sc | 40 + e107_files/shortcode/admin_logged.sc | 10 + e107_files/shortcode/admin_logo.sc | 33 + e107_files/shortcode/admin_menu.sc | 28 + e107_files/shortcode/admin_msg.sc | 15 + e107_files/shortcode/admin_nav.sc | 54 + e107_files/shortcode/admin_plugins.sc | 44 + e107_files/shortcode/admin_preset.sc | 38 + e107_files/shortcode/admin_pword.sc | 7 + e107_files/shortcode/admin_sel_lan.sc | 8 + e107_files/shortcode/admin_siteinfo.sc | 63 + e107_files/shortcode/admin_status.sc | 44 + e107_files/shortcode/admin_userlan.sc | 4 + e107_files/shortcode/banner.sc | 44 + .../shortcode/batch/bbcode_shortcodes.php | 142 + .../shortcode/batch/comment_shortcodes.php | 148 + .../shortcode/batch/contact_shortcodes.php | 65 + .../shortcode/batch/download_shortcodes.php | 504 ++ e107_files/shortcode/batch/index.html | 0 e107_files/shortcode/batch/news_archives.php | 48 + .../shortcode/batch/news_shortcodes.php | 292 + .../shortcode/batch/signup_shortcodes.php | 289 + .../shortcode/batch/sitedown_shortcodes.php | 39 + .../shortcode/batch/user_shortcodes.php | 551 ++ .../batch/usersettings_shortcodes.php | 358 + e107_files/shortcode/breadcrumb.sc | 17 + e107_files/shortcode/custom.sc | 91 + e107_files/shortcode/e_image.sc | 2 + e107_files/shortcode/email.sc | 15 + e107_files/shortcode/email_item.sc | 11 + e107_files/shortcode/emailto.sc | 17 + e107_files/shortcode/extended.sc | 5 + e107_files/shortcode/extended_icon.sc | 5 + e107_files/shortcode/extended_text.sc | 5 + e107_files/shortcode/extended_value.sc | 6 + e107_files/shortcode/imageselector.sc | 41 + e107_files/shortcode/index.html | 0 e107_files/shortcode/languagelinks.sc | 43 + e107_files/shortcode/linkstyle.sc | 2 + e107_files/shortcode/logo.sc | 33 + e107_files/shortcode/menu.sc | 115 + e107_files/shortcode/news_alt.sc | 3 + e107_files/shortcode/news_categories.sc | 124 + e107_files/shortcode/news_category.sc | 3 + e107_files/shortcode/newsfile.sc | 5 + e107_files/shortcode/newsimage.sc | 4 + e107_files/shortcode/nextprev.sc | 196 + e107_files/shortcode/picture.sc | 33 + e107_files/shortcode/plugin.sc | 56 + e107_files/shortcode/print_item.sc | 10 + e107_files/shortcode/profile.sc | 2 + e107_files/shortcode/search.sc | 47 + e107_files/shortcode/setstyle.sc | 2 + e107_files/shortcode/sitecontactinfo.sc | 1 + e107_files/shortcode/sitedescription.sc | 1 + e107_files/shortcode/sitedisclaimer.sc | 4 + e107_files/shortcode/sitelinks.sc | 20 + e107_files/shortcode/sitelinks_alt.sc | 172 + e107_files/shortcode/sitename.sc | 2 + e107_files/shortcode/sitetag.sc | 1 + e107_files/shortcode/stylesheet.sc | 11 + e107_files/shortcode/uploadfile.sc | 37 + e107_files/shortcode/user_avatar.sc | 28 + e107_files/shortcode/user_extended.sc | 106 + e107_files/shortcode/wmessage.sc | 87 + e107_files/sleight_img.gif | Bin 0 -> 49 bytes e107_files/sleight_js.php | 73 + e107_files/thumb.php | 45 + e107_files/user.js | 0 e107_handlers/admin_handler.php | 39 + e107_handlers/admin_log_class.php | 130 + e107_handlers/arraystorage_class.php | 68 + e107_handlers/avatar_handler.php | 39 + e107_handlers/bbcode_handler.php | 205 + e107_handlers/cache_handler.php | 165 + e107_handlers/calendar/cal.gif | Bin 0 -> 223 bytes e107_handlers/calendar/calendar-setup.js | 200 + .../calendar/calendar-setup_stripped.js | 21 + e107_handlers/calendar/calendar.css | 274 + e107_handlers/calendar/calendar.js | 1806 ++++ e107_handlers/calendar/calendar_class.php | 141 + e107_handlers/calendar/calendar_stripped.js | 14 + e107_handlers/calendar/index.html | 0 e107_handlers/calendar/language/English.js | 127 + e107_handlers/calendar/menuarrow.gif | Bin 0 -> 68 bytes e107_handlers/calendar/menuarrow2.gif | Bin 0 -> 49 bytes e107_handlers/calendar/sample.php | 49 + e107_handlers/comment_class.php | 852 ++ e107_handlers/date_handler.php | 107 + e107_handlers/db_debug_class.php | 462 ++ e107_handlers/debug_handler.php | 137 + e107_handlers/e107_Compat_handler.php | 172 + e107_handlers/e107_class.php | 229 + e107_handlers/e_parse_class.php | 630 ++ e107_handlers/emailprint_class.php | 65 + e107_handlers/emote.php | 46 + e107_handlers/emote_filter.php | 93 + e107_handlers/encrypt_handler.php | 37 + e107_handlers/equery_secure.php | 52 + e107_handlers/event_class.php | 55 + e107_handlers/file_class.php | 178 + e107_handlers/form_handler.php | 135 + e107_handlers/forum.php | 593 ++ e107_handlers/forum_include.php | 61 + e107_handlers/forum_mod.php | 101 + e107_handlers/index.html | 0 e107_handlers/input_class.php | 78 + e107_handlers/language_class.php | 248 + e107_handlers/level_handler.php | 119 + e107_handlers/login.php | 205 + e107_handlers/magpie_rss.php | 630 ++ e107_handlers/mail.php | 194 + e107_handlers/mail_validation_class.php | 232 + e107_handlers/message_handler.php | 95 + e107_handlers/mysql_class.php | 734 ++ e107_handlers/news_class.php | 203 + e107_handlers/notify_class.php | 158 + e107_handlers/np_class.php | 99 + e107_handlers/override_class.php | 65 + e107_handlers/parser_functions.php | 28 + e107_handlers/parser_handler.php | 69 + e107_handlers/pclerror.lib.php | 134 + e107_handlers/pcltar.lib.php | 3559 ++++++++ e107_handlers/pcltrace.lib.php | 456 ++ e107_handlers/pclzip.lib.php | 5209 ++++++++++++ e107_handlers/php_compatibility_handler.php | 79 + e107_handlers/phpmailer/class.phpmailer.php | 1499 ++++ e107_handlers/phpmailer/class.pop3.php | 389 + e107_handlers/phpmailer/class.smtp.php | 1045 +++ e107_handlers/phpmailer/e107.htaccess | 1 + .../phpmailer/language/phpmailer.lang-en.php | 21 + e107_handlers/phpmailer/mailout_process.php | 364 + e107_handlers/plugin_class.php | 601 ++ e107_handlers/pop3_class.php | 182 + e107_handlers/popup_handler.php | 91 + e107_handlers/pref_class.php | 190 + e107_handlers/preset_class.php | 80 + e107_handlers/profanity_filter.php | 69 + e107_handlers/rate_class.php | 227 + e107_handlers/ren_help.php | 328 + e107_handlers/resize_handler.php | 155 + e107_handlers/search/advanced_comment.php | 44 + e107_handlers/search/advanced_download.php | 47 + e107_handlers/search/advanced_news.php | 44 + e107_handlers/search/advanced_pages.php | 25 + e107_handlers/search/advanced_user.php | 25 + e107_handlers/search/comments_download.php | 38 + e107_handlers/search/comments_news.php | 38 + e107_handlers/search/comments_page.php | 38 + e107_handlers/search/comments_user.php | 38 + e107_handlers/search/index.html | 0 e107_handlers/search/search_comment.php | 70 + e107_handlers/search/search_download.php | 66 + e107_handlers/search/search_event.php | 66 + e107_handlers/search/search_news.php | 62 + e107_handlers/search/search_pages.php | 52 + e107_handlers/search/search_user.php | 50 + e107_handlers/search_class.php | 307 + e107_handlers/secure_img_handler.php | 69 + e107_handlers/secure_img_render.php | 145 + e107_handlers/session_handler.php | 118 + e107_handlers/shortcode_handler.php | 202 + e107_handlers/sitelinks_class.php | 382 + e107_handlers/smtp.php | 210 + e107_handlers/theme_handler.php | 468 ++ e107_handlers/tiny_mce/blank.htm | 9 + e107_handlers/tiny_mce/filelist.php | 33 + e107_handlers/tiny_mce/index.html | 0 e107_handlers/tiny_mce/langs/en.js | 41 + .../plugins/contextmenu/contextmenu.css | 60 + .../plugins/contextmenu/css/contextmenu.css | 74 + .../plugins/contextmenu/editor_plugin.js | 1 + .../plugins/contextmenu/editor_plugin_src.js | 357 + .../plugins/contextmenu/images/spacer.gif | Bin 0 -> 43 bytes .../plugins/emoticons/editor_plugin.js | 56 + .../tiny_mce/plugins/emoticons/emoticons.php | 48 + .../plugins/emoticons/images/emoticons.png | Bin 0 -> 280 bytes .../tiny_mce/plugins/emoticons/index.html | 0 .../tiny_mce/plugins/emoticons/langs/en.js | 5 + .../tiny_mce/plugins/ibrowser/config.php | 59 + .../plugins/ibrowser/editor_plugin.js | 92 + .../tiny_mce/plugins/ibrowser/ibrowser.php | 476 ++ .../plugins/ibrowser/images/constrain.gif | Bin 0 -> 618 bytes .../plugins/ibrowser/images/ibrowser.gif | Bin 0 -> 917 bytes .../plugins/ibrowser/images/textflow.gif | Bin 0 -> 1624 bytes .../tiny_mce/plugins/ibrowser/langs/en.js | 38 + .../tiny_mce/plugins/iespell/editor_plugin.js | 1 + .../plugins/iespell/editor_plugin_src.js | 58 + .../plugins/iespell/images/iespell.gif | Bin 0 -> 124 bytes .../tiny_mce/plugins/iespell/langs/en.js | 7 + .../tiny_mce/plugins/media/css/content.css | 26 + .../tiny_mce/plugins/media/css/media.css | 68 + .../tiny_mce/plugins/media/editor_plugin.js | 1 + .../plugins/media/editor_plugin_src.js | 428 + .../tiny_mce/plugins/media/images/flash.gif | Bin 0 -> 241 bytes .../tiny_mce/plugins/media/images/media.gif | Bin 0 -> 280 bytes .../plugins/media/images/quicktime.gif | Bin 0 -> 303 bytes .../plugins/media/images/realmedia.gif | Bin 0 -> 439 bytes .../plugins/media/images/shockwave.gif | Bin 0 -> 387 bytes .../plugins/media/images/windowsmedia.gif | Bin 0 -> 415 bytes .../tiny_mce/plugins/media/jscripts/embed.js | 73 + .../tiny_mce/plugins/media/jscripts/media.js | 572 ++ .../tiny_mce/plugins/media/langs/en.js | 85 + .../tiny_mce/plugins/media/media.htm | 723 ++ e107_handlers/tiny_mce/plugins/table/cell.htm | 182 + .../tiny_mce/plugins/table/css/cell.css | 17 + .../tiny_mce/plugins/table/css/row.css | 25 + .../tiny_mce/plugins/table/css/table.css | 13 + .../tiny_mce/plugins/table/editor_plugin.js | 1 + .../plugins/table/editor_plugin_src.js | 1073 +++ .../tiny_mce/plugins/table/images/buttons.gif | Bin 0 -> 1765 bytes .../tiny_mce/plugins/table/images/table.gif | Bin 0 -> 287 bytes .../plugins/table/images/table_cell_props.gif | Bin 0 -> 189 bytes .../plugins/table/images/table_delete.gif | Bin 0 -> 372 bytes .../plugins/table/images/table_delete_col.gif | Bin 0 -> 163 bytes .../plugins/table/images/table_delete_row.gif | Bin 0 -> 171 bytes .../table/images/table_insert_col_after.gif | Bin 0 -> 165 bytes .../table/images/table_insert_col_before.gif | Bin 0 -> 165 bytes .../table/images/table_insert_row_after.gif | Bin 0 -> 163 bytes .../table/images/table_insert_row_before.gif | Bin 0 -> 159 bytes .../table/images/table_merge_cells.gif | Bin 0 -> 198 bytes .../plugins/table/images/table_row_props.gif | Bin 0 -> 187 bytes .../table/images/table_split_cells.gif | Bin 0 -> 210 bytes .../tiny_mce/plugins/table/jscripts/cell.js | 249 + .../plugins/table/jscripts/merge_cells.js | 24 + .../tiny_mce/plugins/table/jscripts/row.js | 200 + .../tiny_mce/plugins/table/jscripts/table.js | 349 + .../tiny_mce/plugins/table/langs/en.js | 78 + .../tiny_mce/plugins/table/merge_cells.htm | 38 + e107_handlers/tiny_mce/plugins/table/row.htm | 159 + .../tiny_mce/plugins/table/table.htm | 156 + .../tiny_mce/plugins/zoom/editor_plugin.js | 1 + .../plugins/zoom/editor_plugin_src.js | 56 + .../tiny_mce/themes/advanced/about.htm | 52 + .../tiny_mce/themes/advanced/anchor.htm | 33 + .../tiny_mce/themes/advanced/charmap.htm | 53 + .../tiny_mce/themes/advanced/color_picker.htm | 13 + .../themes/advanced/css/editor_content.css | 58 + .../themes/advanced/css/editor_popup.css | 331 + .../themes/advanced/css/editor_ui.css | 97 + .../themes/advanced/editor_content.css | 27 + .../tiny_mce/themes/advanced/editor_popup.css | 121 + .../themes/advanced/editor_template.js | 1 + .../themes/advanced/editor_template_src.js | 1534 ++++ .../tiny_mce/themes/advanced/editor_ui.css | 199 + .../tiny_mce/themes/advanced/image.htm | 100 + .../themes/advanced/images/anchor.gif | Bin 0 -> 171 bytes .../themes/advanced/images/anchor_symbol.gif | Bin 0 -> 70 bytes .../themes/advanced/images/backcolor.gif | Bin 0 -> 359 bytes .../tiny_mce/themes/advanced/images/bold.gif | Bin 0 -> 76 bytes .../themes/advanced/images/bold_de_se.gif | Bin 0 -> 73 bytes .../themes/advanced/images/bold_es.gif | Bin 0 -> 80 bytes .../themes/advanced/images/bold_fr.gif | Bin 0 -> 78 bytes .../themes/advanced/images/bold_ru.gif | Bin 0 -> 77 bytes .../themes/advanced/images/browse.gif | Bin 0 -> 113 bytes .../themes/advanced/images/bullist.gif | Bin 0 -> 108 bytes .../themes/advanced/images/button_menu.gif | Bin 0 -> 57 bytes .../themes/advanced/images/buttons.gif | Bin 0 -> 5662 bytes .../advanced/images/cancel_button_bg.gif | Bin 0 -> 677 bytes .../themes/advanced/images/center.gif | Bin 0 -> 70 bytes .../themes/advanced/images/charmap.gif | Bin 0 -> 245 bytes .../themes/advanced/images/cleanup.gif | Bin 0 -> 256 bytes .../tiny_mce/themes/advanced/images/close.gif | Bin 0 -> 102 bytes .../tiny_mce/themes/advanced/images/code.gif | Bin 0 -> 110 bytes .../tiny_mce/themes/advanced/images/color.gif | Bin 0 -> 125 bytes .../tiny_mce/themes/advanced/images/copy.gif | Bin 0 -> 263 bytes .../themes/advanced/images/custom_1.gif | Bin 0 -> 76 bytes .../tiny_mce/themes/advanced/images/cut.gif | Bin 0 -> 187 bytes .../tiny_mce/themes/advanced/images/ecode.gif | Bin 0 -> 80 bytes .../themes/advanced/images/forecolor.gif | Bin 0 -> 342 bytes .../tiny_mce/themes/advanced/images/full.gif | Bin 0 -> 71 bytes .../tiny_mce/themes/advanced/images/help.gif | Bin 0 -> 295 bytes .../tiny_mce/themes/advanced/images/hr.gif | Bin 0 -> 63 bytes .../tiny_mce/themes/advanced/images/image.gif | Bin 0 -> 194 bytes .../themes/advanced/images/indent.gif | Bin 0 -> 112 bytes .../advanced/images/insert_button_bg.gif | Bin 0 -> 703 bytes .../themes/advanced/images/italic.gif | Bin 0 -> 79 bytes .../themes/advanced/images/italic_de_se.gif | Bin 0 -> 75 bytes .../themes/advanced/images/italic_es.gif | Bin 0 -> 74 bytes .../themes/advanced/images/italic_ru.gif | Bin 0 -> 78 bytes .../themes/advanced/images/justifycenter.gif | Bin 0 -> 70 bytes .../themes/advanced/images/justifyfull.gif | Bin 0 -> 71 bytes .../themes/advanced/images/justifyleft.gif | Bin 0 -> 71 bytes .../themes/advanced/images/justifyright.gif | Bin 0 -> 70 bytes .../tiny_mce/themes/advanced/images/left.gif | Bin 0 -> 71 bytes .../tiny_mce/themes/advanced/images/link.gif | Bin 0 -> 175 bytes .../themes/advanced/images/menu_check.gif | Bin 0 -> 51 bytes .../themes/advanced/images/newdocument.gif | Bin 0 -> 170 bytes .../themes/advanced/images/numlist.gif | Bin 0 -> 111 bytes .../themes/advanced/images/opacity.png | Bin 0 -> 147 bytes .../themes/advanced/images/outdent.gif | Bin 0 -> 110 bytes .../tiny_mce/themes/advanced/images/paste.gif | Bin 0 -> 286 bytes .../tiny_mce/themes/advanced/images/quote.gif | Bin 0 -> 75 bytes .../tiny_mce/themes/advanced/images/redo.gif | Bin 0 -> 169 bytes .../themes/advanced/images/removeformat.gif | Bin 0 -> 168 bytes .../tiny_mce/themes/advanced/images/right.gif | Bin 0 -> 70 bytes .../themes/advanced/images/separator.gif | Bin 0 -> 57 bytes .../themes/advanced/images/spacer.gif | Bin 0 -> 43 bytes .../advanced/images/statusbar_resize.gif | Bin 0 -> 79 bytes .../themes/advanced/images/strikethrough.gif | Bin 0 -> 83 bytes .../tiny_mce/themes/advanced/images/sub.gif | Bin 0 -> 148 bytes .../tiny_mce/themes/advanced/images/sup.gif | Bin 0 -> 147 bytes .../tiny_mce/themes/advanced/images/table.gif | Bin 0 -> 287 bytes .../advanced/images/table_delete_col.gif | Bin 0 -> 163 bytes .../advanced/images/table_delete_row.gif | Bin 0 -> 171 bytes .../images/table_insert_col_after.gif | Bin 0 -> 165 bytes .../images/table_insert_col_before.gif | Bin 0 -> 165 bytes .../images/table_insert_row_after.gif | Bin 0 -> 163 bytes .../images/table_insert_row_before.gif | Bin 0 -> 159 bytes .../themes/advanced/images/underline.gif | Bin 0 -> 88 bytes .../themes/advanced/images/underline_es.gif | Bin 0 -> 79 bytes .../themes/advanced/images/underline_fr.gif | Bin 0 -> 79 bytes .../themes/advanced/images/underline_ru.gif | Bin 0 -> 77 bytes .../tiny_mce/themes/advanced/images/undo.gif | Bin 0 -> 175 bytes .../themes/advanced/images/unlink.gif | Bin 0 -> 190 bytes .../themes/advanced/images/visualaid.gif | Bin 0 -> 206 bytes .../themes/advanced/images/xp/tab_bg.gif | Bin 0 -> 694 bytes .../themes/advanced/images/xp/tab_end.gif | Bin 0 -> 169 bytes .../themes/advanced/images/xp/tab_sel_bg.gif | Bin 0 -> 428 bytes .../themes/advanced/images/xp/tab_sel_end.gif | Bin 0 -> 101 bytes .../themes/advanced/images/xp/tabs_bg.gif | Bin 0 -> 48 bytes .../themes/advanced/jscripts/about.js | 75 + .../themes/advanced/jscripts/anchor.js | 74 + .../themes/advanced/jscripts/charmap.js | 326 + .../themes/advanced/jscripts/color_picker.js | 108 + .../themes/advanced/jscripts/image.js | 81 + .../tiny_mce/themes/advanced/jscripts/link.js | 70 + .../themes/advanced/jscripts/source_editor.js | 60 + .../tiny_mce/themes/advanced/langs/en.js | 82 + .../tiny_mce/themes/advanced/link.htm | 100 + .../themes/advanced/source_editor.htm | 32 + e107_handlers/tiny_mce/tiny_mce.js | 1 + e107_handlers/tiny_mce/tiny_mce_gzip.php | 229 + e107_handlers/tiny_mce/tiny_mce_popup.js | 288 + e107_handlers/tiny_mce/tiny_mce_src.js | 7284 +++++++++++++++++ .../tiny_mce/utils/editable_selects.js | 61 + e107_handlers/tiny_mce/utils/form_utils.js | 210 + e107_handlers/tiny_mce/utils/mclayer.js | 210 + e107_handlers/tiny_mce/utils/mctabs.js | 74 + e107_handlers/tiny_mce/utils/validate.js | 219 + e107_handlers/tiny_mce/wysiwyg.php | 166 + e107_handlers/traffic_class.php | 208 + e107_handlers/traffic_class_display.php | 121 + e107_handlers/upload_handler.php | 202 + e107_handlers/user_extended_class.php | 488 ++ e107_handlers/user_func.php | 51 + e107_handlers/user_select_class.php | 227 + e107_handlers/userclass_class.php | 323 + e107_handlers/usersession_class.php | 243 + e107_handlers/xml_class.php | 238 + e107_images/admin_images/adminlogs_16.png | Bin 0 -> 992 bytes e107_images/admin_images/adminlogs_32.png | Bin 0 -> 1796 bytes e107_images/admin_images/adminpass_16.png | Bin 0 -> 1285 bytes e107_images/admin_images/adminpass_32.png | Bin 0 -> 2023 bytes e107_images/admin_images/admins_16.png | Bin 0 -> 1043 bytes e107_images/admin_images/admins_32.png | Bin 0 -> 1887 bytes e107_images/admin_images/arrow_16.png | Bin 0 -> 743 bytes e107_images/admin_images/arrow_32.png | Bin 0 -> 1677 bytes e107_images/admin_images/arrow_over_16.png | Bin 0 -> 706 bytes e107_images/admin_images/arrow_over_32.png | Bin 0 -> 1679 bytes e107_images/admin_images/articles_16.png | Bin 0 -> 887 bytes e107_images/admin_images/articles_32.png | Bin 0 -> 1788 bytes e107_images/admin_images/banlist_16.png | Bin 0 -> 1063 bytes e107_images/admin_images/banlist_32.png | Bin 0 -> 1869 bytes e107_images/admin_images/banners_16.png | Bin 0 -> 1278 bytes e107_images/admin_images/banners_32.png | Bin 0 -> 1948 bytes e107_images/admin_images/blocked.png | Bin 0 -> 1235 bytes e107_images/admin_images/cache_16.png | Bin 0 -> 1140 bytes e107_images/admin_images/cache_32.png | Bin 0 -> 1849 bytes e107_images/admin_images/cat_content_16.png | Bin 0 -> 1205 bytes e107_images/admin_images/cat_content_32.png | Bin 0 -> 2034 bytes e107_images/admin_images/cat_files_16.png | Bin 0 -> 1199 bytes e107_images/admin_images/cat_files_32.png | Bin 0 -> 1953 bytes e107_images/admin_images/cat_plugins_16.png | Bin 0 -> 987 bytes e107_images/admin_images/cat_plugins_32.png | Bin 0 -> 1844 bytes e107_images/admin_images/cat_settings_16.png | Bin 0 -> 1048 bytes e107_images/admin_images/cat_settings_32.png | Bin 0 -> 1778 bytes e107_images/admin_images/cat_tools_16.png | Bin 0 -> 1074 bytes e107_images/admin_images/cat_tools_32.png | Bin 0 -> 1928 bytes e107_images/admin_images/cat_users_16.png | Bin 0 -> 1233 bytes e107_images/admin_images/cat_users_32.png | Bin 0 -> 1927 bytes e107_images/admin_images/chatbox_16.png | Bin 0 -> 1062 bytes e107_images/admin_images/chatbox_32.png | Bin 0 -> 1857 bytes e107_images/admin_images/comments_16.png | Bin 0 -> 1044 bytes e107_images/admin_images/comments_32.png | Bin 0 -> 1877 bytes e107_images/admin_images/content_16.png | Bin 0 -> 1277 bytes e107_images/admin_images/content_32.png | Bin 0 -> 1917 bytes e107_images/admin_images/credits_16.png | Bin 0 -> 912 bytes e107_images/admin_images/credits_32.png | Bin 0 -> 1810 bytes e107_images/admin_images/custom_16.png | Bin 0 -> 1285 bytes e107_images/admin_images/custom_32.png | Bin 0 -> 1911 bytes e107_images/admin_images/database_16.png | Bin 0 -> 777 bytes e107_images/admin_images/database_32.png | Bin 0 -> 1648 bytes e107_images/admin_images/delete_16.png | Bin 0 -> 945 bytes e107_images/admin_images/delete_32.png | Bin 0 -> 1790 bytes e107_images/admin_images/docs_16.png | Bin 0 -> 966 bytes e107_images/admin_images/docs_32.png | Bin 0 -> 1784 bytes e107_images/admin_images/down.png | Bin 0 -> 235 bytes e107_images/admin_images/downloads_16.png | Bin 0 -> 616 bytes e107_images/admin_images/downloads_32.png | Bin 0 -> 1558 bytes e107_images/admin_images/edit_16.png | Bin 0 -> 1089 bytes e107_images/admin_images/edit_32.png | Bin 0 -> 1859 bytes e107_images/admin_images/emoticons_16.png | Bin 0 -> 1149 bytes e107_images/admin_images/emoticons_32.png | Bin 0 -> 1870 bytes e107_images/admin_images/extended_16.png | Bin 0 -> 1066 bytes e107_images/admin_images/extended_32.png | Bin 0 -> 1812 bytes e107_images/admin_images/failedlogin_16.png | Bin 0 -> 771 bytes e107_images/admin_images/fileinspector_16.png | Bin 0 -> 1218 bytes e107_images/admin_images/fileinspector_32.png | Bin 0 -> 1997 bytes e107_images/admin_images/filemanager_16.png | Bin 0 -> 1199 bytes e107_images/admin_images/filemanager_32.png | Bin 0 -> 1953 bytes e107_images/admin_images/forums_16.png | Bin 0 -> 1242 bytes e107_images/admin_images/forums_32.png | Bin 0 -> 1990 bytes e107_images/admin_images/frontpage_16.png | Bin 0 -> 1245 bytes e107_images/admin_images/frontpage_32.png | Bin 0 -> 1942 bytes e107_images/admin_images/images_16.png | Bin 0 -> 968 bytes e107_images/admin_images/images_32.png | Bin 0 -> 1822 bytes e107_images/admin_images/installed.png | Bin 0 -> 392 bytes e107_images/admin_images/language_16.png | Bin 0 -> 1107 bytes e107_images/admin_images/language_32.png | Bin 0 -> 1911 bytes e107_images/admin_images/leave_16.png | Bin 0 -> 752 bytes e107_images/admin_images/leave_32.png | Bin 0 -> 1615 bytes e107_images/admin_images/links_16.png | Bin 0 -> 1034 bytes e107_images/admin_images/links_32.png | Bin 0 -> 1919 bytes e107_images/admin_images/logout_16.png | Bin 0 -> 823 bytes e107_images/admin_images/logout_32.png | Bin 0 -> 1741 bytes e107_images/admin_images/mail_16.png | Bin 0 -> 917 bytes e107_images/admin_images/mail_32.png | Bin 0 -> 1773 bytes e107_images/admin_images/main_16.png | Bin 0 -> 1039 bytes e107_images/admin_images/main_32.png | Bin 0 -> 1860 bytes e107_images/admin_images/maintain_16.png | Bin 0 -> 772 bytes e107_images/admin_images/maintain_32.png | Bin 0 -> 1696 bytes e107_images/admin_images/menus_16.png | Bin 0 -> 1258 bytes e107_images/admin_images/menus_32.png | Bin 0 -> 1864 bytes e107_images/admin_images/meta_16.png | Bin 0 -> 1096 bytes e107_images/admin_images/meta_32.png | Bin 0 -> 1896 bytes e107_images/admin_images/news_16.png | Bin 0 -> 864 bytes e107_images/admin_images/news_32.png | Bin 0 -> 1795 bytes e107_images/admin_images/newsfeeds_16.png | Bin 0 -> 1024 bytes e107_images/admin_images/newsfeeds_32.png | Bin 0 -> 1878 bytes e107_images/admin_images/noinstall.png | Bin 0 -> 402 bytes e107_images/admin_images/nopreview.png | Bin 0 -> 1419 bytes e107_images/admin_images/notify_16.png | Bin 0 -> 988 bytes e107_images/admin_images/notify_32.png | Bin 0 -> 1823 bytes e107_images/admin_images/phpinfo_16.png | Bin 0 -> 1160 bytes e107_images/admin_images/phpinfo_32.png | Bin 0 -> 2037 bytes e107_images/admin_images/plugins_16.png | Bin 0 -> 987 bytes e107_images/admin_images/plugins_32.png | Bin 0 -> 1844 bytes e107_images/admin_images/plugmanager_16.png | Bin 0 -> 1019 bytes e107_images/admin_images/plugmanager_32.png | Bin 0 -> 1866 bytes e107_images/admin_images/polls_16.png | Bin 0 -> 788 bytes e107_images/admin_images/polls_32.png | Bin 0 -> 1615 bytes e107_images/admin_images/prefs_16.png | Bin 0 -> 1131 bytes e107_images/admin_images/prefs_32.png | Bin 0 -> 1983 bytes e107_images/admin_images/reviews_16.png | Bin 0 -> 907 bytes e107_images/admin_images/reviews_32.png | Bin 0 -> 1715 bytes e107_images/admin_images/search_16.png | Bin 0 -> 912 bytes e107_images/admin_images/search_32.png | Bin 0 -> 1759 bytes e107_images/admin_images/stats_16.png | Bin 0 -> 1122 bytes e107_images/admin_images/stats_32.png | Bin 0 -> 1758 bytes e107_images/admin_images/sub_forums_16.png | Bin 0 -> 1068 bytes e107_images/admin_images/sublink.png | Bin 0 -> 383 bytes e107_images/admin_images/sublink_16.png | Bin 0 -> 1025 bytes e107_images/admin_images/themes_16.png | Bin 0 -> 897 bytes e107_images/admin_images/themes_32.png | Bin 0 -> 1592 bytes e107_images/admin_images/uninstalled.png | Bin 0 -> 375 bytes e107_images/admin_images/up.png | Bin 0 -> 235 bytes e107_images/admin_images/upgrade.png | Bin 0 -> 396 bytes e107_images/admin_images/uploads_16.png | Bin 0 -> 614 bytes e107_images/admin_images/uploads_32.png | Bin 0 -> 1553 bytes e107_images/admin_images/userclass_16.png | Bin 0 -> 1015 bytes e107_images/admin_images/userclass_32.png | Bin 0 -> 1846 bytes e107_images/admin_images/users_16.png | Bin 0 -> 1233 bytes e107_images/admin_images/users_32.png | Bin 0 -> 1927 bytes e107_images/admin_images/welcome_16.png | Bin 0 -> 1024 bytes e107_images/admin_images/welcome_32.png | Bin 0 -> 1970 bytes e107_images/adminlogo.png | Bin 0 -> 4271 bytes e107_images/advanced.png | Bin 0 -> 4987 bytes e107_images/avatars/avatar_1.png | Bin 0 -> 4377 bytes e107_images/avatars/index.html | 0 e107_images/banners/banner1.png | Bin 0 -> 30779 bytes e107_images/banners/banner2.png | Bin 0 -> 19137 bytes e107_images/banners/banner3.png | Bin 0 -> 16368 bytes e107_images/button.png | Bin 0 -> 2250 bytes e107_images/custom/index.html | 0 e107_images/e107_icon_16.png | Bin 0 -> 1113 bytes e107_images/e107_icon_32.png | Bin 0 -> 1911 bytes e107_images/emotes/default/alien.png | Bin 0 -> 467 bytes e107_images/emotes/default/amazed.png | Bin 0 -> 568 bytes e107_images/emotes/default/angry.png | Bin 0 -> 588 bytes e107_images/emotes/default/biglaugh.png | Bin 0 -> 586 bytes e107_images/emotes/default/cheesey.png | Bin 0 -> 586 bytes e107_images/emotes/default/confused.png | Bin 0 -> 604 bytes e107_images/emotes/default/cry.png | Bin 0 -> 613 bytes e107_images/emotes/default/dead.png | Bin 0 -> 609 bytes e107_images/emotes/default/dodge.png | Bin 0 -> 591 bytes e107_images/emotes/default/frown.png | Bin 0 -> 591 bytes e107_images/emotes/default/gah.png | Bin 0 -> 588 bytes e107_images/emotes/default/grin.png | Bin 0 -> 584 bytes e107_images/emotes/default/heart.png | Bin 0 -> 410 bytes e107_images/emotes/default/idea.png | Bin 0 -> 474 bytes e107_images/emotes/default/ill.png | Bin 0 -> 603 bytes e107_images/emotes/default/mad.png | Bin 0 -> 598 bytes e107_images/emotes/default/mistrust.png | Bin 0 -> 585 bytes e107_images/emotes/default/neutral.png | Bin 0 -> 580 bytes e107_images/emotes/default/question.png | Bin 0 -> 501 bytes e107_images/emotes/default/rolleyes.png | Bin 0 -> 595 bytes e107_images/emotes/default/sad.png | Bin 0 -> 591 bytes e107_images/emotes/default/shades.png | Bin 0 -> 588 bytes e107_images/emotes/default/shy.png | Bin 0 -> 594 bytes e107_images/emotes/default/smile.png | Bin 0 -> 586 bytes e107_images/emotes/default/special.png | Bin 0 -> 584 bytes e107_images/emotes/default/suprised.png | Bin 0 -> 597 bytes e107_images/emotes/default/tongue.png | Bin 0 -> 597 bytes e107_images/emotes/default/wink.png | Bin 0 -> 587 bytes e107_images/fileinspector/blank.png | Bin 0 -> 155 bytes e107_images/fileinspector/close.png | Bin 0 -> 911 bytes e107_images/fileinspector/contract.png | Bin 0 -> 308 bytes e107_images/fileinspector/expand.png | Bin 0 -> 306 bytes e107_images/fileinspector/file.png | Bin 0 -> 619 bytes e107_images/fileinspector/file_check.png | Bin 0 -> 826 bytes e107_images/fileinspector/file_core.png | Bin 0 -> 791 bytes e107_images/fileinspector/file_fail.png | Bin 0 -> 1034 bytes e107_images/fileinspector/file_missing.png | Bin 0 -> 862 bytes e107_images/fileinspector/file_old.png | Bin 0 -> 1095 bytes e107_images/fileinspector/file_uncalc.png | Bin 0 -> 925 bytes e107_images/fileinspector/file_unknown.png | Bin 0 -> 1048 bytes e107_images/fileinspector/file_warning.png | Bin 0 -> 967 bytes e107_images/fileinspector/fileinspector.png | Bin 0 -> 1218 bytes e107_images/fileinspector/folder.png | Bin 0 -> 1202 bytes e107_images/fileinspector/folder_check.png | Bin 0 -> 1202 bytes e107_images/fileinspector/folder_core.png | Bin 0 -> 1199 bytes e107_images/fileinspector/folder_fail.png | Bin 0 -> 1236 bytes e107_images/fileinspector/folder_missing.png | Bin 0 -> 1244 bytes e107_images/fileinspector/folder_old.png | Bin 0 -> 1238 bytes e107_images/fileinspector/folder_old_dir.png | Bin 0 -> 1222 bytes e107_images/fileinspector/folder_root.png | Bin 0 -> 1156 bytes e107_images/fileinspector/folder_unknown.png | Bin 0 -> 1235 bytes e107_images/fileinspector/folder_up.png | Bin 0 -> 1248 bytes e107_images/fileinspector/folder_warning.png | Bin 0 -> 1236 bytes e107_images/fileinspector/forward.png | Bin 0 -> 1231 bytes e107_images/fileinspector/info.png | Bin 0 -> 969 bytes e107_images/fileinspector/integrity_fail.png | Bin 0 -> 933 bytes e107_images/fileinspector/integrity_pass.png | Bin 0 -> 571 bytes e107_images/fileinspector/warning.png | Bin 0 -> 886 bytes e107_images/filemanager/css.png | Bin 0 -> 783 bytes e107_images/filemanager/def.png | Bin 0 -> 396 bytes e107_images/filemanager/default.png | Bin 0 -> 803 bytes e107_images/filemanager/del.png | Bin 0 -> 864 bytes e107_images/filemanager/exe.png | Bin 0 -> 699 bytes e107_images/filemanager/folder.png | Bin 0 -> 559 bytes e107_images/filemanager/gif.png | Bin 0 -> 768 bytes e107_images/filemanager/home.png | Bin 0 -> 717 bytes e107_images/filemanager/htm.png | Bin 0 -> 796 bytes e107_images/filemanager/jpg.png | Bin 0 -> 912 bytes e107_images/filemanager/js.png | Bin 0 -> 804 bytes e107_images/filemanager/link.png | Bin 0 -> 527 bytes e107_images/filemanager/mp3.png | Bin 0 -> 788 bytes e107_images/filemanager/pdf.png | Bin 0 -> 731 bytes e107_images/filemanager/php.png | Bin 0 -> 813 bytes e107_images/filemanager/png.png | Bin 0 -> 768 bytes e107_images/filemanager/txt.png | Bin 0 -> 694 bytes e107_images/filemanager/updir.png | Bin 0 -> 798 bytes e107_images/filemanager/xml.png | Bin 0 -> 662 bytes e107_images/filemanager/zip.png | Bin 0 -> 923 bytes e107_images/generic/bar.png | Bin 0 -> 182 bytes e107_images/generic/bbcode/blockquote.png | Bin 0 -> 484 bytes e107_images/generic/bbcode/bold.png | Bin 0 -> 498 bytes e107_images/generic/bbcode/center.png | Bin 0 -> 399 bytes e107_images/generic/bbcode/code.png | Bin 0 -> 637 bytes e107_images/generic/bbcode/emotes.png | Bin 0 -> 4100 bytes e107_images/generic/bbcode/flash.png | Bin 0 -> 558 bytes e107_images/generic/bbcode/fontcol.png | Bin 0 -> 935 bytes e107_images/generic/bbcode/fontsize.png | Bin 0 -> 869 bytes e107_images/generic/bbcode/image.png | Bin 0 -> 454 bytes e107_images/generic/bbcode/italic.png | Bin 0 -> 415 bytes e107_images/generic/bbcode/left.png | Bin 0 -> 382 bytes e107_images/generic/bbcode/link.png | Bin 0 -> 671 bytes e107_images/generic/bbcode/list.png | Bin 0 -> 407 bytes e107_images/generic/bbcode/newpage.png | Bin 0 -> 1018 bytes e107_images/generic/bbcode/prefile.png | Bin 0 -> 790 bytes e107_images/generic/bbcode/preimage.png | Bin 0 -> 790 bytes e107_images/generic/bbcode/right.png | Bin 0 -> 389 bytes e107_images/generic/bbcode/shortcode.png | Bin 0 -> 440 bytes e107_images/generic/bbcode/template.png | Bin 0 -> 379 bytes e107_images/generic/bbcode/underline.png | Bin 0 -> 413 bytes e107_images/generic/blank.gif | Bin 0 -> 807 bytes e107_images/generic/code_bg.gif | Bin 0 -> 2093 bytes e107_images/generic/code_bg.jpg | Bin 0 -> 1550 bytes e107_images/generic/code_bg.png | Bin 0 -> 1490 bytes e107_images/generic/cred.png | Bin 0 -> 51586 bytes e107_images/generic/dark/answer.png | Bin 0 -> 924 bytes e107_images/generic/dark/arrow.png | Bin 0 -> 584 bytes e107_images/generic/dark/download.png | Bin 0 -> 741 bytes e107_images/generic/dark/edit.png | Bin 0 -> 1067 bytes e107_images/generic/dark/email.png | Bin 0 -> 699 bytes e107_images/generic/dark/file.png | Bin 0 -> 777 bytes e107_images/generic/dark/image.png | Bin 0 -> 746 bytes e107_images/generic/dark/new.png | Bin 0 -> 663 bytes e107_images/generic/dark/new_comments.png | Bin 0 -> 357 bytes e107_images/generic/dark/newsedit.png | Bin 0 -> 886 bytes e107_images/generic/dark/nonew_comments.png | Bin 0 -> 341 bytes e107_images/generic/dark/password.png | Bin 0 -> 2132 bytes e107_images/generic/dark/printer.png | Bin 0 -> 794 bytes e107_images/generic/dark/question.png | Bin 0 -> 969 bytes e107_images/generic/dark/search_advanced.png | Bin 0 -> 1077 bytes e107_images/generic/dark/search_basic.png | Bin 0 -> 909 bytes e107_images/generic/dark/search_enhanced.png | Bin 0 -> 1206 bytes e107_images/generic/dark/sticky.png | Bin 0 -> 1473 bytes e107_images/generic/dark/user_select.png | Bin 0 -> 1240 bytes e107_images/generic/lite/answer.png | Bin 0 -> 920 bytes e107_images/generic/lite/arrow.png | Bin 0 -> 587 bytes e107_images/generic/lite/download.png | Bin 0 -> 768 bytes e107_images/generic/lite/edit.png | Bin 0 -> 901 bytes e107_images/generic/lite/email.png | Bin 0 -> 726 bytes e107_images/generic/lite/file.png | Bin 0 -> 804 bytes e107_images/generic/lite/image.png | Bin 0 -> 777 bytes e107_images/generic/lite/new.png | Bin 0 -> 668 bytes e107_images/generic/lite/new_comments.png | Bin 0 -> 357 bytes e107_images/generic/lite/newsedit.png | Bin 0 -> 885 bytes e107_images/generic/lite/nonew_comments.png | Bin 0 -> 341 bytes e107_images/generic/lite/password.png | Bin 0 -> 2186 bytes e107_images/generic/lite/printer.png | Bin 0 -> 820 bytes e107_images/generic/lite/question.png | Bin 0 -> 973 bytes e107_images/generic/lite/search_advanced.png | Bin 0 -> 1086 bytes e107_images/generic/lite/search_basic.png | Bin 0 -> 915 bytes e107_images/generic/lite/search_enhanced.png | Bin 0 -> 1197 bytes e107_images/generic/lite/sticky.png | Bin 0 -> 1455 bytes e107_images/generic/lite/user_select.png | Bin 0 -> 1236 bytes e107_images/generic/php-small-trans-light.gif | Bin 0 -> 2624 bytes e107_images/generic/poweredbymysql-88.png | Bin 0 -> 1681 bytes e107_images/generic/valid-xhtml11.png | Bin 0 -> 1903 bytes e107_images/generic/valid-xhtml11_small.png | Bin 0 -> 517 bytes e107_images/generic/vcss.png | Bin 0 -> 1017 bytes e107_images/generic/vcss_small.png | Bin 0 -> 516 bytes e107_images/icons/download_32.png | Bin 0 -> 1471 bytes e107_images/icons/folder.png | Bin 0 -> 2000 bytes e107_images/icons/folder_32.png | Bin 0 -> 1553 bytes e107_images/icons/folderx.png | Bin 0 -> 2116 bytes e107_images/icons/folderx_32.png | Bin 0 -> 1553 bytes e107_images/icons/html.png | Bin 0 -> 540 bytes e107_images/icons/icon1.png | Bin 0 -> 774 bytes e107_images/icons/icon10.png | Bin 0 -> 747 bytes e107_images/icons/icon11.png | Bin 0 -> 885 bytes e107_images/icons/icon12.png | Bin 0 -> 738 bytes e107_images/icons/icon13.png | Bin 0 -> 829 bytes e107_images/icons/icon14.png | Bin 0 -> 872 bytes e107_images/icons/icon15.png | Bin 0 -> 843 bytes e107_images/icons/icon16.png | Bin 0 -> 1406 bytes e107_images/icons/icon17.png | Bin 0 -> 1313 bytes e107_images/icons/icon18.png | Bin 0 -> 1509 bytes e107_images/icons/icon19.png | Bin 0 -> 1533 bytes e107_images/icons/icon2.png | Bin 0 -> 888 bytes e107_images/icons/icon20.png | Bin 0 -> 1460 bytes e107_images/icons/icon21.png | Bin 0 -> 1642 bytes e107_images/icons/icon22.png | Bin 0 -> 1295 bytes e107_images/icons/icon23.png | Bin 0 -> 1406 bytes e107_images/icons/icon24.png | Bin 0 -> 1358 bytes e107_images/icons/icon25.png | Bin 0 -> 1403 bytes e107_images/icons/icon26.png | Bin 0 -> 864 bytes e107_images/icons/icon3.png | Bin 0 -> 774 bytes e107_images/icons/icon4.png | Bin 0 -> 538 bytes e107_images/icons/icon5.png | Bin 0 -> 728 bytes e107_images/icons/icon6.png | Bin 0 -> 755 bytes e107_images/icons/icon7.png | Bin 0 -> 801 bytes e107_images/icons/icon8.png | Bin 0 -> 870 bytes e107_images/icons/icon9.png | Bin 0 -> 905 bytes e107_images/index.html | 0 e107_images/logo.png | Bin 0 -> 4100 bytes e107_images/logo_template.png | Bin 0 -> 3495 bytes e107_images/logo_template_large.png | Bin 0 -> 7132 bytes e107_images/newspost_images/index.html | 0 e107_images/newspost_images/welcome.png | Bin 0 -> 6612 bytes e107_images/pcmag.png | Bin 0 -> 3751 bytes e107_images/rate/box.png | Bin 0 -> 284 bytes e107_images/rate/box/box1.png | Bin 0 -> 582 bytes e107_images/rate/box/box10.png | Bin 0 -> 1068 bytes e107_images/rate/box/box2.png | Bin 0 -> 597 bytes e107_images/rate/box/box3.png | Bin 0 -> 601 bytes e107_images/rate/box/box4.png | Bin 0 -> 602 bytes e107_images/rate/box/box5.png | Bin 0 -> 598 bytes e107_images/rate/box/box6.png | Bin 0 -> 619 bytes e107_images/rate/box/box7.png | Bin 0 -> 618 bytes e107_images/rate/box/box8.png | Bin 0 -> 620 bytes e107_images/rate/box/box9.png | Bin 0 -> 595 bytes e107_images/rate/boxend.png | Bin 0 -> 189 bytes e107_images/rate/dark/1.png | Bin 0 -> 209 bytes e107_images/rate/dark/2.png | Bin 0 -> 238 bytes e107_images/rate/dark/3.png | Bin 0 -> 304 bytes e107_images/rate/dark/4.png | Bin 0 -> 381 bytes e107_images/rate/dark/5.png | Bin 0 -> 473 bytes e107_images/rate/dark/6.png | Bin 0 -> 553 bytes e107_images/rate/dark/7.png | Bin 0 -> 629 bytes e107_images/rate/dark/8.png | Bin 0 -> 681 bytes e107_images/rate/dark/9.png | Bin 0 -> 701 bytes e107_images/rate/dark/lev1.png | Bin 0 -> 563 bytes e107_images/rate/dark/lev10.png | Bin 0 -> 620 bytes e107_images/rate/dark/lev2.png | Bin 0 -> 616 bytes e107_images/rate/dark/lev3.png | Bin 0 -> 617 bytes e107_images/rate/dark/lev4.png | Bin 0 -> 618 bytes e107_images/rate/dark/lev5.png | Bin 0 -> 618 bytes e107_images/rate/dark/lev6.png | Bin 0 -> 617 bytes e107_images/rate/dark/lev7.png | Bin 0 -> 617 bytes e107_images/rate/dark/lev8.png | Bin 0 -> 618 bytes e107_images/rate/dark/lev9.png | Bin 0 -> 618 bytes e107_images/rate/dark/star.png | Bin 0 -> 666 bytes e107_images/rate/lite/1.png | Bin 0 -> 209 bytes e107_images/rate/lite/2.png | Bin 0 -> 238 bytes e107_images/rate/lite/3.png | Bin 0 -> 311 bytes e107_images/rate/lite/4.png | Bin 0 -> 393 bytes e107_images/rate/lite/5.png | Bin 0 -> 488 bytes e107_images/rate/lite/6.png | Bin 0 -> 575 bytes e107_images/rate/lite/7.png | Bin 0 -> 659 bytes e107_images/rate/lite/8.png | Bin 0 -> 725 bytes e107_images/rate/lite/9.png | Bin 0 -> 758 bytes e107_images/rate/lite/lev1.png | Bin 0 -> 587 bytes e107_images/rate/lite/lev10.png | Bin 0 -> 636 bytes e107_images/rate/lite/lev2.png | Bin 0 -> 632 bytes e107_images/rate/lite/lev3.png | Bin 0 -> 634 bytes e107_images/rate/lite/lev4.png | Bin 0 -> 635 bytes e107_images/rate/lite/lev5.png | Bin 0 -> 635 bytes e107_images/rate/lite/lev6.png | Bin 0 -> 636 bytes e107_images/rate/lite/lev7.png | Bin 0 -> 635 bytes e107_images/rate/lite/lev8.png | Bin 0 -> 636 bytes e107_images/rate/lite/lev9.png | Bin 0 -> 638 bytes e107_images/rate/lite/star.png | Bin 0 -> 699 bytes e107_images/rate/star.png | Bin 0 -> 699 bytes e107_images/splash.jpg | Bin 0 -> 24605 bytes e107_images/thumb.php | 63 + e107_images/user_icons/realname_dark.png | Bin 0 -> 793 bytes e107_images/user_icons/realname_lite.png | Bin 0 -> 807 bytes e107_images/user_icons/user_aim.png | Bin 0 -> 609 bytes e107_images/user_icons/user_birthday_dark.png | Bin 0 -> 821 bytes e107_images/user_icons/user_birthday_lite.png | Bin 0 -> 841 bytes e107_images/user_icons/user_dark.png | Bin 0 -> 820 bytes e107_images/user_icons/user_homepage.png | Bin 0 -> 592 bytes e107_images/user_icons/user_icq.png | Bin 0 -> 312 bytes e107_images/user_icons/user_lite.png | Bin 0 -> 823 bytes e107_images/user_icons/user_location.png | Bin 0 -> 563 bytes e107_images/user_icons/user_msn.png | Bin 0 -> 603 bytes e107_images/user_icons/user_realname_dark.png | Bin 0 -> 793 bytes e107_images/user_icons/user_realname_lite.png | Bin 0 -> 807 bytes e107_images/user_icons/user_star_dark.png | Bin 0 -> 666 bytes e107_images/user_icons/user_star_lite.png | Bin 0 -> 699 bytes e107_languages/English/English.php | 39 + .../English/admin/help/administrator.php | 26 + e107_languages/English/admin/help/article.php | 27 + e107_languages/English/admin/help/banlist.php | 32 + e107_languages/English/admin/help/cache.php | 25 + e107_languages/English/admin/help/chatbox.php | 25 + e107_languages/English/admin/help/content.php | 25 + e107_languages/English/admin/help/cpage.php | 26 + .../English/admin/help/custommenu.php | 26 + e107_languages/English/admin/help/db.php | 24 + .../English/admin/help/download.php | 26 + .../English/admin/help/emoticon.php | 26 + .../English/admin/help/fileinspector.php | 51 + .../English/admin/help/filemanager.php | 24 + e107_languages/English/admin/help/forum.php | 43 + .../English/admin/help/frontpage.php | 25 + e107_languages/English/admin/help/image.php | 24 + e107_languages/English/admin/help/index.html | 0 .../English/admin/help/language.php | 24 + .../English/admin/help/link_category.php | 24 + e107_languages/English/admin/help/links.php | 26 + .../English/admin/help/list_menu_conf.php | 30 + e107_languages/English/admin/help/mailout.php | 24 + e107_languages/English/admin/help/menus.php | 56 + e107_languages/English/admin/help/menus2.php | 28 + e107_languages/English/admin/help/meta.php | 25 + .../English/admin/help/news_category.php | 24 + .../English/admin/help/newsfeed.php | 25 + .../English/admin/help/newspost.php | 36 + e107_languages/English/admin/help/notify.php | 31 + e107_languages/English/admin/help/phpinfo.php | 24 + e107_languages/English/admin/help/poll.php | 26 + e107_languages/English/admin/help/prefs.php | 24 + e107_languages/English/admin/help/review.php | 25 + e107_languages/English/admin/help/search.php | 27 + e107_languages/English/admin/help/theme.php | 24 + e107_languages/English/admin/help/ugflag.php | 25 + .../English/admin/help/updateadmin.php | 24 + e107_languages/English/admin/help/upload.php | 24 + .../English/admin/help/userclass2.php | 25 + e107_languages/English/admin/help/users.php | 25 + .../English/admin/help/users_extended.php | 24 + .../English/admin/help/wmessage.php | 24 + e107_languages/English/admin/lan_admin.php | 272 + .../English/admin/lan_admin_log.php | 27 + .../English/admin/lan_administrator.php | 83 + e107_languages/English/admin/lan_banlist.php | 25 + e107_languages/English/admin/lan_banner.php | 73 + e107_languages/English/admin/lan_cache.php | 23 + e107_languages/English/admin/lan_cpage.php | 55 + e107_languages/English/admin/lan_credits.php | 54 + e107_languages/English/admin/lan_db.php | 45 + .../English/admin/lan_db_verify.php | 33 + e107_languages/English/admin/lan_docs.php | 3 + e107_languages/English/admin/lan_download.php | 143 + .../English/admin/lan_e107_update.php | 25 + e107_languages/English/admin/lan_emoticon.php | 39 + .../English/admin/lan_fileinspector.php | 73 + .../English/admin/lan_filemanager.php | 67 + e107_languages/English/admin/lan_fla.php | 30 + e107_languages/English/admin/lan_footer.php | 30 + .../English/admin/lan_frontpage.php | 40 + e107_languages/English/admin/lan_header.php | 21 + e107_languages/English/admin/lan_image.php | 65 + e107_languages/English/admin/lan_lancheck.php | 35 + e107_languages/English/admin/lan_language.php | 38 + e107_languages/English/admin/lan_links.php | 67 + e107_languages/English/admin/lan_mailout.php | 103 + e107_languages/English/admin/lan_menus.php | 56 + e107_languages/English/admin/lan_message.php | 28 + e107_languages/English/admin/lan_meta.php | 27 + .../English/admin/lan_modcomment.php | 34 + e107_languages/English/admin/lan_newspost.php | 173 + e107_languages/English/admin/lan_notify.php | 38 + e107_languages/English/admin/lan_plugin.php | 88 + e107_languages/English/admin/lan_prefs.php | 190 + e107_languages/English/admin/lan_search.php | 63 + e107_languages/English/admin/lan_theme.php | 62 + e107_languages/English/admin/lan_ugflag.php | 20 + .../English/admin/lan_updateadmin.php | 21 + e107_languages/English/admin/lan_upload.php | 72 + .../English/admin/lan_userclass.php | 24 + .../English/admin/lan_userclass2.php | 41 + e107_languages/English/admin/lan_userinfo.php | 20 + e107_languages/English/admin/lan_users.php | 192 + .../English/admin/lan_users_extended.php | 107 + e107_languages/English/admin/lan_wmessage.php | 34 + e107_languages/English/lan_banner.php | 38 + e107_languages/English/lan_comment.php | 77 + e107_languages/English/lan_contact.php | 35 + e107_languages/English/lan_date.php | 35 + e107_languages/English/lan_download.php | 100 + e107_languages/English/lan_email.php | 37 + e107_languages/English/lan_equery_secure.php | 19 + e107_languages/English/lan_error.php | 49 + e107_languages/English/lan_fpw.php | 48 + e107_languages/English/lan_installer.php | 124 + e107_languages/English/lan_links.php | 50 + e107_languages/English/lan_login.php | 38 + e107_languages/English/lan_mail_handler.php | 21 + e107_languages/English/lan_membersonly.php | 21 + e107_languages/English/lan_news.php | 48 + e107_languages/English/lan_newspost.php | 44 + e107_languages/English/lan_notify.php | 36 + e107_languages/English/lan_np.php | 16 + e107_languages/English/lan_online.php | 64 + e107_languages/English/lan_page.php | 27 + .../English/lan_parser_functions.php | 16 + e107_languages/English/lan_prefs.php | 19 + e107_languages/English/lan_print.php | 27 + e107_languages/English/lan_rate.php | 20 + e107_languages/English/lan_ren_help.php | 66 + e107_languages/English/lan_search.php | 119 + e107_languages/English/lan_signup.php | 119 + e107_languages/English/lan_sitedown.php | 15 + e107_languages/English/lan_sitelinks.php | 15 + e107_languages/English/lan_submitnews.php | 32 + e107_languages/English/lan_top.php | 32 + e107_languages/English/lan_upload.php | 41 + e107_languages/English/lan_upload_handler.php | 25 + e107_languages/English/lan_user.php | 67 + e107_languages/English/lan_user_extended.php | 46 + e107_languages/English/lan_user_select.php | 18 + e107_languages/English/lan_userclass.php | 19 + e107_languages/English/lan_userposts.php | 31 + e107_languages/English/lan_usersettings.php | 110 + e107_languages/index.html | 0 e107_plugins/admin_menu/admin_menu.php | 61 + e107_plugins/alt_auth/alt_auth_adminmenu.php | 42 + e107_plugins/alt_auth/alt_auth_conf.php | 115 + .../alt_auth/alt_auth_login_class.php | 80 + e107_plugins/alt_auth/alt_auth_readme.txt | 52 + e107_plugins/alt_auth/alt_login_class.php | 56 + e107_plugins/alt_auth/images/icon_ldap.png | Bin 0 -> 1948 bytes .../languages/English/lan_alt_auth_conf.php | 15 + .../languages/English/lan_ldap_auth.php | 15 + .../languages/English/lan_otherdb_auth.php | 14 + e107_plugins/alt_auth/ldap_auth.php | 186 + e107_plugins/alt_auth/ldap_conf.php | 133 + e107_plugins/alt_auth/otherdb_auth.php | 147 + e107_plugins/alt_auth/otherdb_conf.php | 143 + e107_plugins/alt_auth/plugin.php | 74 + e107_plugins/alt_news/alt_news.php | 118 + e107_plugins/banner_menu/banner_menu.php | 89 + e107_plugins/banner_menu/config.php | 259 + .../banner_menu/languages/English.php | 34 + e107_plugins/blogcalendar_menu/archive.php | 134 + .../blogcalendar_menu/blogcalendar_menu.php | 131 + e107_plugins/blogcalendar_menu/calendar.php | 102 + e107_plugins/blogcalendar_menu/config.php | 91 + e107_plugins/blogcalendar_menu/functions.php | 31 + .../blogcalendar_menu/languages/English.php | 49 + e107_plugins/blogcalendar_menu/styles.php | 50 + e107_plugins/calendar_menu/admin_config.php | 830 ++ e107_plugins/calendar_menu/calendar.php | 319 + e107_plugins/calendar_menu/calendar_menu.php | 257 + .../calendar_menu/calendar_shortcodes.php | 477 ++ e107_plugins/calendar_menu/calendar_sql.php | 42 + .../calendar_menu/calendar_template.php | 269 + e107_plugins/calendar_menu/e_list.php | 62 + e107_plugins/calendar_menu/e_notify.php | 53 + e107_plugins/calendar_menu/e_rss.php | 59 + e107_plugins/calendar_menu/e_search.php | 11 + e107_plugins/calendar_menu/ecal_class.php | 245 + e107_plugins/calendar_menu/event.php | 854 ++ e107_plugins/calendar_menu/images/b1.png | Bin 0 -> 716 bytes e107_plugins/calendar_menu/images/b10.png | Bin 0 -> 1122 bytes e107_plugins/calendar_menu/images/b11.png | Bin 0 -> 1122 bytes e107_plugins/calendar_menu/images/b12.png | Bin 0 -> 1075 bytes e107_plugins/calendar_menu/images/b13.png | Bin 0 -> 1075 bytes e107_plugins/calendar_menu/images/b14.png | Bin 0 -> 1075 bytes e107_plugins/calendar_menu/images/b15.png | Bin 0 -> 1055 bytes e107_plugins/calendar_menu/images/b16.png | Bin 0 -> 1055 bytes e107_plugins/calendar_menu/images/b2.png | Bin 0 -> 847 bytes e107_plugins/calendar_menu/images/b3.png | Bin 0 -> 720 bytes e107_plugins/calendar_menu/images/b4.png | Bin 0 -> 854 bytes e107_plugins/calendar_menu/images/b5.png | Bin 0 -> 869 bytes e107_plugins/calendar_menu/images/b6.png | Bin 0 -> 823 bytes e107_plugins/calendar_menu/images/b7.png | Bin 0 -> 1075 bytes e107_plugins/calendar_menu/images/b8.png | Bin 0 -> 1075 bytes e107_plugins/calendar_menu/images/b9.png | Bin 0 -> 1122 bytes e107_plugins/calendar_menu/images/cal1.png | Bin 0 -> 275 bytes e107_plugins/calendar_menu/images/cal2.png | Bin 0 -> 275 bytes e107_plugins/calendar_menu/images/cal3.png | Bin 0 -> 275 bytes .../calendar_menu/images/calendar_16.png | Bin 0 -> 1028 bytes .../calendar_menu/images/calendar_32.png | Bin 0 -> 1922 bytes e107_plugins/calendar_menu/images/icon_ec.png | Bin 0 -> 536 bytes e107_plugins/calendar_menu/images/star1.png | Bin 0 -> 1110 bytes e107_plugins/calendar_menu/images/star2.png | Bin 0 -> 1046 bytes e107_plugins/calendar_menu/images/star3.png | Bin 0 -> 1116 bytes e107_plugins/calendar_menu/images/star4.png | Bin 0 -> 1116 bytes e107_plugins/calendar_menu/images/star5.png | Bin 0 -> 1110 bytes e107_plugins/calendar_menu/images/star6.png | Bin 0 -> 1115 bytes e107_plugins/calendar_menu/images/star7.png | Bin 0 -> 1117 bytes e107_plugins/calendar_menu/images/star8.png | Bin 0 -> 1117 bytes e107_plugins/calendar_menu/index.html | 0 .../calendar_menu/languages/English.php | 380 + .../languages/English_search.php | 5 + e107_plugins/calendar_menu/log/index.html | 0 .../calendar_menu/next_event_menu.php | 153 + e107_plugins/calendar_menu/plugin.php | 280 + e107_plugins/calendar_menu/readme.pdf | Bin 0 -> 60782 bytes .../calendar_menu/search/search_parser.php | 40 + e107_plugins/calendar_menu/subs_menu.php | 251 + e107_plugins/calendar_menu/subscribe.php | 110 + e107_plugins/chatbox_menu/admin_chatbox.php | 177 + e107_plugins/chatbox_menu/chat.php | 168 + e107_plugins/chatbox_menu/chat_template.php | 27 + e107_plugins/chatbox_menu/chatbox_menu.php | 266 + e107_plugins/chatbox_menu/chatbox_sql.php | 9 + e107_plugins/chatbox_menu/e_list.php | 41 + e107_plugins/chatbox_menu/e_notify.php | 40 + e107_plugins/chatbox_menu/e_rss.php | 44 + e107_plugins/chatbox_menu/e_search.php | 11 + e107_plugins/chatbox_menu/e_status.php | 6 + e107_plugins/chatbox_menu/images/blocked.png | Bin 0 -> 1235 bytes .../chatbox_menu/images/chatbox_16.png | Bin 0 -> 1062 bytes .../chatbox_menu/images/chatbox_32.png | Bin 0 -> 1857 bytes .../languages/English/English.php | 55 + .../languages/English/English_config.php | 56 + .../languages/English/lan_chatbox_search.php | 15 + e107_plugins/chatbox_menu/plugin.php | 102 + .../chatbox_menu/search/search_advanced.php | 28 + .../chatbox_menu/search/search_parser.php | 57 + e107_plugins/clock_menu/clock.js | 70 + e107_plugins/clock_menu/clock_menu.php | 65 + e107_plugins/clock_menu/config.php | 111 + e107_plugins/clock_menu/languages/English.php | 44 + .../clock_menu/languages/admin/English.php | 44 + e107_plugins/comment_menu/comment_menu.php | 47 + .../comment_menu/comment_menu_shortcodes.php | 73 + .../comment_menu/comment_menu_template.php | 38 + e107_plugins/comment_menu/config.php | 100 + .../comment_menu/languages/English.php | 29 + .../compliance_menu/compliance_menu.php | 11 + .../compliance_menu/images/valid-xhtml11.png | Bin 0 -> 1916 bytes e107_plugins/compliance_menu/images/vcss.png | Bin 0 -> 1134 bytes .../compliance_menu/languages/English.php | 15 + e107_plugins/content/admin_content_config.php | 566 ++ e107_plugins/content/content.js | 0 e107_plugins/content/content.php | 1470 ++++ e107_plugins/content/content_manager.php | 179 + e107_plugins/content/content_shortcodes.php | 1030 +++ e107_plugins/content/content_sql.php | 51 + e107_plugins/content/content_submit.php | 145 + e107_plugins/content/content_update.php | 368 + e107_plugins/content/content_update_check.php | 85 + e107_plugins/content/e_comment.php | 31 + e107_plugins/content/e_emailprint.php | 174 + e107_plugins/content/e_frontpage.php | 21 + e107_plugins/content/e_latest.php | 20 + e107_plugins/content/e_list.php | 111 + e107_plugins/content/e_meta.php | 52 + e107_plugins/content/e_notify.php | 36 + e107_plugins/content/e_rss.php | 76 + e107_plugins/content/e_search.php | 11 + e107_plugins/content/e_status.php | 18 + .../content/handlers/content_class.php | 1513 ++++ .../handlers/content_convert_class.php | 914 +++ .../content/handlers/content_db_class.php | 522 ++ .../content/handlers/content_defines.php | 33 + .../content/handlers/content_form_class.php | 3856 +++++++++ .../content/handlers/content_preset.php | 280 + e107_plugins/content/help.php | 108 + e107_plugins/content/images/cat/16/help.png | Bin 0 -> 1187 bytes .../content/images/cat/16/ledblue.png | Bin 0 -> 957 bytes .../content/images/cat/16/ledgreen.png | Bin 0 -> 1160 bytes .../content/images/cat/16/ledlightblue.png | Bin 0 -> 1025 bytes .../content/images/cat/16/ledlightgreen.png | Bin 0 -> 1074 bytes .../content/images/cat/16/ledorange.png | Bin 0 -> 1033 bytes .../content/images/cat/16/ledpurple.png | Bin 0 -> 1121 bytes e107_plugins/content/images/cat/16/ledred.png | Bin 0 -> 996 bytes .../content/images/cat/16/ledyellow.png | Bin 0 -> 975 bytes .../content/images/cat/16/messagebox_info.png | Bin 0 -> 978 bytes e107_plugins/content/images/cat/48/help.png | Bin 0 -> 4662 bytes .../content/images/cat/48/ledblue.png | Bin 0 -> 4094 bytes .../content/images/cat/48/ledgreen.png | Bin 0 -> 4152 bytes .../content/images/cat/48/ledlightblue.png | Bin 0 -> 3507 bytes .../content/images/cat/48/ledlightgreen.png | Bin 0 -> 3840 bytes .../content/images/cat/48/ledorange.png | Bin 0 -> 3550 bytes .../content/images/cat/48/ledpurple.png | Bin 0 -> 4103 bytes e107_plugins/content/images/cat/48/ledred.png | Bin 0 -> 3246 bytes .../content/images/cat/48/ledyellow.png | Bin 0 -> 3192 bytes .../content/images/cat/48/messagebox_info.png | Bin 0 -> 3829 bytes e107_plugins/content/images/content_16.png | Bin 0 -> 887 bytes e107_plugins/content/images/content_32.png | Bin 0 -> 1788 bytes e107_plugins/content/images/error_16.png | Bin 0 -> 998 bytes e107_plugins/content/images/file/index.html | 0 .../content/images/file/tmp/index.html | 0 e107_plugins/content/images/file_16.png | Bin 0 -> 838 bytes e107_plugins/content/images/icon/blank.gif | Bin 0 -> 61 bytes .../content/images/icon/tmp/index.html | 0 e107_plugins/content/images/image/index.html | 0 .../content/images/image/tmp/index.html | 0 e107_plugins/content/images/manager_16.png | Bin 0 -> 856 bytes e107_plugins/content/images/manager_48.png | Bin 0 -> 4502 bytes e107_plugins/content/images/ok_16.png | Bin 0 -> 786 bytes e107_plugins/content/images/personal.png | Bin 0 -> 945 bytes e107_plugins/content/images/score.png | Bin 0 -> 2809 bytes e107_plugins/content/images/score_empty.png | Bin 0 -> 2809 bytes e107_plugins/content/images/score_end.png | Bin 0 -> 189 bytes e107_plugins/content/images/submit_16.png | Bin 0 -> 708 bytes e107_plugins/content/images/submit_32.png | Bin 0 -> 2228 bytes e107_plugins/content/images/view_remove.png | Bin 0 -> 559 bytes e107_plugins/content/images/warning_16.png | Bin 0 -> 663 bytes e107_plugins/content/images/window_new.png | Bin 0 -> 772 bytes .../content/languages/English/lan_content.php | 215 + .../languages/English/lan_content_admin.php | 706 ++ .../English/lan_content_frontpage.php | 16 + .../languages/English/lan_content_help.php | 81 + .../languages/English/lan_content_search.php | 18 + e107_plugins/content/menus/index.html | 0 e107_plugins/content/plugin.php | 110 + .../content/search/search_advanced.php | 44 + .../content/search/search_comments.php | 21 + e107_plugins/content/search/search_parser.php | 84 + .../templates/content_manager_template.php | 44 + .../content_submit_type_template.php | 46 + .../templates/content_type_template.php | 73 + .../default/content_archive_template.php | 50 + .../default/content_author_template.php | 46 + .../default/content_cat_template.php | 149 + .../default/content_content_template.php | 126 + .../content_content_template_bigtext.php | 120 + .../content_content_template_blackonwhite.php | 120 + .../content_content_template_whiteonblack.php | 120 + .../templates/default/content_np_template.php | 28 + .../default/content_recent_template.php | 84 + .../default/content_score_template.php | 54 + .../default/content_search_template.php | 43 + .../default/content_searchresult_template.php | 65 + .../default/content_top_template.php | 54 + e107_plugins/counter_menu/counter_menu.php | 81 + .../counter_menu/languages/English.php | 22 + e107_plugins/featurebox/admin_config.php | 204 + e107_plugins/featurebox/e_rss.php | 43 + e107_plugins/featurebox/featurebox.php | 64 + .../featurebox/images/featurebox_16.png | Bin 0 -> 774 bytes .../featurebox/images/featurebox_32.png | Bin 0 -> 1318 bytes e107_plugins/featurebox/languages/English.php | 47 + e107_plugins/featurebox/plugin.php | 77 + .../featurebox/templates/centered.php | 30 + e107_plugins/featurebox/templates/default.php | 28 + e107_plugins/forum/e_emailprint.php | 57 + e107_plugins/forum/e_frontpage.php | 10 + e107_plugins/forum/e_latest.php | 15 + e107_plugins/forum/e_linkgen.php | 37 + e107_plugins/forum/e_list.php | 152 + e107_plugins/forum/e_rss.php | 276 + e107_plugins/forum/e_search.php | 17 + e107_plugins/forum/e_status.php | 6 + e107_plugins/forum/forum.php | 525 ++ e107_plugins/forum/forum_admin.php | 1506 ++++ e107_plugins/forum/forum_class.php | 1032 +++ e107_plugins/forum/forum_conf.php | 191 + e107_plugins/forum/forum_mod.php | 142 + e107_plugins/forum/forum_post.php | 653 ++ e107_plugins/forum/forum_post_shortcodes.php | 152 + e107_plugins/forum/forum_shortcodes.php | 255 + e107_plugins/forum/forum_sql.php | 39 + e107_plugins/forum/forum_stats.php | 371 + e107_plugins/forum/forum_test.php | 21 + e107_plugins/forum/forum_update.php | 173 + e107_plugins/forum/forum_update_check.php | 73 + e107_plugins/forum/forum_uploads.php | 121 + e107_plugins/forum/forum_viewforum.php | 521 ++ e107_plugins/forum/forum_viewtopic.php | 512 ++ .../forum/images/dark/English_admin.png | Bin 0 -> 977 bytes .../forum/images/dark/English_main_admin.png | Bin 0 -> 1142 bytes .../forum/images/dark/English_moderator.png | Bin 0 -> 1147 bytes .../forum/images/dark/English_newthread.png | Bin 0 -> 1670 bytes .../forum/images/dark/English_reply.png | Bin 0 -> 1832 bytes e107_plugins/forum/images/dark/admin.png | Bin 0 -> 977 bytes .../forum/images/dark/admin_block.png | Bin 0 -> 897 bytes .../forum/images/dark/admin_delete.png | Bin 0 -> 795 bytes e107_plugins/forum/images/dark/admin_edit.png | Bin 0 -> 904 bytes e107_plugins/forum/images/dark/admin_lock.png | Bin 0 -> 758 bytes e107_plugins/forum/images/dark/admin_move.png | Bin 0 -> 885 bytes .../forum/images/dark/admin_stick.png | Bin 0 -> 1063 bytes .../forum/images/dark/admin_unlock.png | Bin 0 -> 767 bytes .../forum/images/dark/admin_unstick.png | Bin 0 -> 903 bytes e107_plugins/forum/images/dark/aim.png | Bin 0 -> 759 bytes e107_plugins/forum/images/dark/announce.png | Bin 0 -> 1181 bytes .../forum/images/dark/announce_small.png | Bin 0 -> 902 bytes e107_plugins/forum/images/dark/bar.jpg | Bin 0 -> 644 bytes e107_plugins/forum/images/dark/closed.png | Bin 0 -> 1146 bytes .../forum/images/dark/closed_small.png | Bin 0 -> 800 bytes e107_plugins/forum/images/dark/delete.png | Bin 0 -> 861 bytes e107_plugins/forum/images/dark/e.png | Bin 0 -> 1577 bytes e107_plugins/forum/images/dark/edit.png | Bin 0 -> 621 bytes e107_plugins/forum/images/dark/email.png | Bin 0 -> 524 bytes e107_plugins/forum/images/dark/icq.png | Bin 0 -> 890 bytes e107_plugins/forum/images/dark/main_admin.png | Bin 0 -> 1142 bytes e107_plugins/forum/images/dark/moderator.png | Bin 0 -> 1147 bytes e107_plugins/forum/images/dark/msn.png | Bin 0 -> 776 bytes e107_plugins/forum/images/dark/new.png | Bin 0 -> 899 bytes .../forum/images/dark/new_popular.png | Bin 0 -> 1172 bytes .../forum/images/dark/new_popular_small.png | Bin 0 -> 895 bytes e107_plugins/forum/images/dark/new_small.png | Bin 0 -> 867 bytes e107_plugins/forum/images/dark/newthread.png | Bin 0 -> 1670 bytes e107_plugins/forum/images/dark/nonew.png | Bin 0 -> 740 bytes .../forum/images/dark/nonew_popular.png | Bin 0 -> 1077 bytes .../forum/images/dark/nonew_popular_small.png | Bin 0 -> 809 bytes .../forum/images/dark/nonew_small.png | Bin 0 -> 727 bytes e107_plugins/forum/images/dark/pm.png | Bin 0 -> 762 bytes e107_plugins/forum/images/dark/post.png | Bin 0 -> 186 bytes e107_plugins/forum/images/dark/post2.png | Bin 0 -> 257 bytes e107_plugins/forum/images/dark/profile.png | Bin 0 -> 588 bytes e107_plugins/forum/images/dark/quote.png | Bin 0 -> 542 bytes e107_plugins/forum/images/dark/reply.png | Bin 0 -> 1832 bytes e107_plugins/forum/images/dark/report.png | Bin 0 -> 530 bytes e107_plugins/forum/images/dark/sticky.png | Bin 0 -> 1145 bytes .../forum/images/dark/sticky_closed.png | Bin 0 -> 1137 bytes .../forum/images/dark/sticky_closed_small.png | Bin 0 -> 902 bytes .../forum/images/dark/sticky_small.png | Bin 0 -> 900 bytes e107_plugins/forum/images/dark/website.png | Bin 0 -> 530 bytes e107_plugins/forum/images/fcap.png | Bin 0 -> 242 bytes e107_plugins/forum/images/fcap2.png | Bin 0 -> 212 bytes e107_plugins/forum/images/finfobar.png | Bin 0 -> 199 bytes e107_plugins/forum/images/forums_16.png | Bin 0 -> 1242 bytes e107_plugins/forum/images/forums_32.png | Bin 0 -> 1990 bytes .../forum/images/lite/English_admin.png | Bin 0 -> 977 bytes .../forum/images/lite/English_main_admin.png | Bin 0 -> 1142 bytes .../forum/images/lite/English_moderator.png | Bin 0 -> 1147 bytes .../forum/images/lite/English_newthread.png | Bin 0 -> 1717 bytes .../forum/images/lite/English_reply.png | Bin 0 -> 1858 bytes e107_plugins/forum/images/lite/admin.png | Bin 0 -> 977 bytes .../forum/images/lite/admin_block.png | Bin 0 -> 900 bytes .../forum/images/lite/admin_delete.png | Bin 0 -> 822 bytes e107_plugins/forum/images/lite/admin_edit.png | Bin 0 -> 905 bytes e107_plugins/forum/images/lite/admin_lock.png | Bin 0 -> 759 bytes e107_plugins/forum/images/lite/admin_move.png | Bin 0 -> 889 bytes .../forum/images/lite/admin_stick.png | Bin 0 -> 1063 bytes .../forum/images/lite/admin_unlock.png | Bin 0 -> 766 bytes .../forum/images/lite/admin_unstick.png | Bin 0 -> 903 bytes e107_plugins/forum/images/lite/aim.png | Bin 0 -> 759 bytes e107_plugins/forum/images/lite/announce.png | Bin 0 -> 1184 bytes .../forum/images/lite/announce_small.png | Bin 0 -> 904 bytes e107_plugins/forum/images/lite/bar.jpg | Bin 0 -> 644 bytes e107_plugins/forum/images/lite/closed.png | Bin 0 -> 1152 bytes .../forum/images/lite/closed_small.png | Bin 0 -> 811 bytes e107_plugins/forum/images/lite/delete.png | Bin 0 -> 861 bytes e107_plugins/forum/images/lite/e.png | Bin 0 -> 1552 bytes e107_plugins/forum/images/lite/edit.png | Bin 0 -> 642 bytes e107_plugins/forum/images/lite/email.png | Bin 0 -> 1161 bytes e107_plugins/forum/images/lite/icq.png | Bin 0 -> 890 bytes e107_plugins/forum/images/lite/main_admin.png | Bin 0 -> 1142 bytes e107_plugins/forum/images/lite/moderator.png | Bin 0 -> 1147 bytes e107_plugins/forum/images/lite/msn.png | Bin 0 -> 776 bytes e107_plugins/forum/images/lite/new.png | Bin 0 -> 942 bytes .../forum/images/lite/new_popular.png | Bin 0 -> 1181 bytes .../forum/images/lite/new_popular_small.png | Bin 0 -> 895 bytes e107_plugins/forum/images/lite/new_small.png | Bin 0 -> 880 bytes e107_plugins/forum/images/lite/newthread.png | Bin 0 -> 1717 bytes e107_plugins/forum/images/lite/nonew.png | Bin 0 -> 764 bytes .../forum/images/lite/nonew_popular.png | Bin 0 -> 936 bytes .../forum/images/lite/nonew_popular_small.png | Bin 0 -> 781 bytes .../forum/images/lite/nonew_small.png | Bin 0 -> 719 bytes e107_plugins/forum/images/lite/pm.png | Bin 0 -> 762 bytes e107_plugins/forum/images/lite/post.png | Bin 0 -> 186 bytes e107_plugins/forum/images/lite/post2.png | Bin 0 -> 257 bytes e107_plugins/forum/images/lite/profile.png | Bin 0 -> 603 bytes e107_plugins/forum/images/lite/quote.png | Bin 0 -> 562 bytes e107_plugins/forum/images/lite/reply.png | Bin 0 -> 1858 bytes e107_plugins/forum/images/lite/report.png | Bin 0 -> 672 bytes e107_plugins/forum/images/lite/sticky.png | Bin 0 -> 1154 bytes .../forum/images/lite/sticky_closed.png | Bin 0 -> 1141 bytes .../forum/images/lite/sticky_closed_small.png | Bin 0 -> 899 bytes .../forum/images/lite/sticky_small.png | Bin 0 -> 896 bytes e107_plugins/forum/images/lite/website.png | Bin 0 -> 549 bytes e107_plugins/forum/images/sub_forums_16.png | Bin 0 -> 1068 bytes e107_plugins/forum/index.php | 23 + .../forum/languages/English/lan_forum.php | 114 + .../languages/English/lan_forum_admin.php | 208 + .../languages/English/lan_forum_conf.php | 44 + .../languages/English/lan_forum_frontpage.php | 15 + .../languages/English/lan_forum_post.php | 115 + .../languages/English/lan_forum_search.php | 19 + .../languages/English/lan_forum_stats.php | 39 + .../languages/English/lan_forum_uploads.php | 25 + .../languages/English/lan_forum_viewforum.php | 94 + .../languages/English/lan_forum_viewtopic.php | 89 + .../English/lan_newforumposts_menu.php | 32 + e107_plugins/forum/newforumposts_menu.php | 99 + .../forum/newforumposts_menu_config.php | 99 + e107_plugins/forum/plugin.php | 138 + e107_plugins/forum/search/search_advanced.php | 47 + e107_plugins/forum/search/search_parser.php | 78 + .../forum/templates/forum_icons_template.php | 71 + .../forum/templates/forum_post_template.php | 246 + .../forum/templates/forum_posted_template.php | 58 + .../templates/forum_preview_template.php | 36 + .../forum/templates/forum_template.php | 73 + .../templates/forum_viewforum_template.php | 271 + .../templates/forum_viewtopic_template.php | 257 + e107_plugins/gsitemap/admin_config.php | 506 ++ e107_plugins/gsitemap/gsitemap_sql.php | 13 + e107_plugins/gsitemap/images/icon.png | Bin 0 -> 2585 bytes e107_plugins/gsitemap/images/icon_16.png | Bin 0 -> 1125 bytes .../gsitemap/languages/gsitemap_English.php | 61 + e107_plugins/gsitemap/plugin.php | 98 + e107_plugins/index.html | 0 .../integrity_check/admin_integrity_check.php | 521 ++ e107_plugins/integrity_check/images/integ.gif | Bin 0 -> 2616 bytes .../integrity_check/images/integrity_16.png | Bin 0 -> 512 bytes .../integrity_check/images/integrity_32.png | Bin 0 -> 703 bytes .../integrity_check/languages/English.php | 55 + e107_plugins/integrity_check/plugin.php | 73 + e107_plugins/lastseen/languages/English.php | 16 + e107_plugins/lastseen/lastseen_menu.php | 46 + .../links_page/admin_linkspage_config.php | 250 + .../links_page/cat_images/linkspage_16.png | Bin 0 -> 903 bytes e107_plugins/links_page/e_comment.php | 41 + e107_plugins/links_page/e_frontpage.php | 29 + e107_plugins/links_page/e_latest.php | 6 + e107_plugins/links_page/e_list.php | 46 + e107_plugins/links_page/e_notify.php | 44 + e107_plugins/links_page/e_rss.php | 50 + e107_plugins/links_page/e_search.php | 11 + e107_plugins/links_page/e_status.php | 7 + e107_plugins/links_page/help.php | 54 + e107_plugins/links_page/images/blank.gif | Bin 0 -> 807 bytes e107_plugins/links_page/images/generic.png | Bin 0 -> 2614 bytes .../links_page/images/linkspage_16.png | Bin 0 -> 903 bytes .../links_page/images/linkspage_32.png | Bin 0 -> 1806 bytes e107_plugins/links_page/languages/English.php | 361 + e107_plugins/links_page/link_class.php | 1428 ++++ e107_plugins/links_page/link_defines.php | 33 + .../links_page/link_images/button.png | Bin 0 -> 2068 bytes e107_plugins/links_page/link_menu.php | 166 + e107_plugins/links_page/link_shortcodes.php | 478 ++ e107_plugins/links_page/links.php | 516 ++ e107_plugins/links_page/links_page_sql.php | 53 + e107_plugins/links_page/links_template.php | 272 + e107_plugins/links_page/plugin.php | 111 + .../links_page/search/search_advanced.php | 41 + .../links_page/search/search_comments.php | 21 + .../links_page/search/search_parser.php | 55 + e107_plugins/linkwords/admin_config.php | 186 + .../linkwords/images/linkwords_16.png | Bin 0 -> 637 bytes .../linkwords/images/linkwords_32.png | Bin 0 -> 1553 bytes e107_plugins/linkwords/languages/English.php | 31 + e107_plugins/linkwords/linkwords.php | 71 + e107_plugins/linkwords/linkwords_sql.php | 7 + e107_plugins/linkwords/plugin.php | 98 + e107_plugins/list_new/admin_list_config.php | 550 ++ e107_plugins/list_new/icon/list_16.png | Bin 0 -> 922 bytes e107_plugins/list_new/icon/list_32.png | Bin 0 -> 1968 bytes e107_plugins/list_new/images/icon1.gif | Bin 0 -> 48 bytes e107_plugins/list_new/images/icon10.gif | Bin 0 -> 48 bytes e107_plugins/list_new/images/icon11.gif | Bin 0 -> 48 bytes e107_plugins/list_new/images/icon2.gif | Bin 0 -> 48 bytes e107_plugins/list_new/images/icon3.gif | Bin 0 -> 48 bytes e107_plugins/list_new/images/icon4.gif | Bin 0 -> 48 bytes e107_plugins/list_new/images/icon5.gif | Bin 0 -> 48 bytes e107_plugins/list_new/images/icon6.gif | Bin 0 -> 48 bytes e107_plugins/list_new/images/icon7.gif | Bin 0 -> 48 bytes e107_plugins/list_new/images/icon8.gif | Bin 0 -> 48 bytes e107_plugins/list_new/images/icon9.gif | Bin 0 -> 48 bytes e107_plugins/list_new/languages/English.php | 206 + e107_plugins/list_new/list.php | 125 + e107_plugins/list_new/list_class.php | 551 ++ e107_plugins/list_new/list_new_menu.php | 58 + e107_plugins/list_new/list_recent_menu.php | 58 + e107_plugins/list_new/list_shortcodes.php | 38 + e107_plugins/list_new/list_template.php | 86 + e107_plugins/list_new/plugin.php | 76 + .../list_new/section/list_comment.php | 43 + .../list_new/section/list_download.php | 38 + .../list_new/section/list_members.php | 34 + e107_plugins/list_new/section/list_news.php | 62 + e107_plugins/log/admin_config.php | 336 + e107_plugins/log/consolidate.php | 284 + e107_plugins/log/e_meta.php | 35 + e107_plugins/log/images/abrowse.png | Bin 0 -> 786 bytes e107_plugins/log/images/amaya.png | Bin 0 -> 743 bytes e107_plugins/log/images/ant.png | Bin 0 -> 580 bytes e107_plugins/log/images/aol.png | Bin 0 -> 623 bytes e107_plugins/log/images/aol2.png | Bin 0 -> 623 bytes e107_plugins/log/images/avantbrowser.png | Bin 0 -> 941 bytes e107_plugins/log/images/avantgo.png | Bin 0 -> 645 bytes e107_plugins/log/images/aweb.png | Bin 0 -> 508 bytes e107_plugins/log/images/bar.png | Bin 0 -> 220 bytes e107_plugins/log/images/beonex.png | Bin 0 -> 663 bytes e107_plugins/log/images/beos.png | Bin 0 -> 275 bytes e107_plugins/log/images/blazer.png | Bin 0 -> 530 bytes e107_plugins/log/images/camino.png | Bin 0 -> 545 bytes e107_plugins/log/images/chimera.png | Bin 0 -> 545 bytes e107_plugins/log/images/columbus.png | Bin 0 -> 259 bytes e107_plugins/log/images/crazybrowser.png | Bin 0 -> 915 bytes e107_plugins/log/images/curl.png | Bin 0 -> 447 bytes e107_plugins/log/images/deepnet.png | Bin 0 -> 742 bytes e107_plugins/log/images/dillo.png | Bin 0 -> 721 bytes e107_plugins/log/images/doris.png | Bin 0 -> 724 bytes e107_plugins/log/images/epiphany.png | Bin 0 -> 653 bytes e107_plugins/log/images/explorer.png | Bin 0 -> 590 bytes e107_plugins/log/images/firebird.png | Bin 0 -> 516 bytes e107_plugins/log/images/firefox.png | Bin 0 -> 804 bytes e107_plugins/log/images/freebsd.png | Bin 0 -> 598 bytes e107_plugins/log/images/galeon.png | Bin 0 -> 695 bytes e107_plugins/log/images/html.png | Bin 0 -> 540 bytes e107_plugins/log/images/ibrowse.png | Bin 0 -> 259 bytes e107_plugins/log/images/icab.png | Bin 0 -> 432 bytes e107_plugins/log/images/ice.png | Bin 0 -> 511 bytes e107_plugins/log/images/isilox.png | Bin 0 -> 776 bytes e107_plugins/log/images/k-meleon.png | Bin 0 -> 588 bytes e107_plugins/log/images/konqueror.png | Bin 0 -> 282 bytes e107_plugins/log/images/links.png | Bin 0 -> 277 bytes e107_plugins/log/images/linux.png | Bin 0 -> 320 bytes e107_plugins/log/images/logo.png | Bin 0 -> 2390 bytes e107_plugins/log/images/lotus.png | Bin 0 -> 328 bytes e107_plugins/log/images/lunascape.png | Bin 0 -> 912 bytes e107_plugins/log/images/lynx.png | Bin 0 -> 1006 bytes e107_plugins/log/images/mac.png | Bin 0 -> 282 bytes e107_plugins/log/images/maxthon.png | Bin 0 -> 834 bytes e107_plugins/log/images/mbrowser.png | Bin 0 -> 722 bytes e107_plugins/log/images/mosaic.png | Bin 0 -> 657 bytes e107_plugins/log/images/mozilla.png | Bin 0 -> 819 bytes e107_plugins/log/images/mozilla2.png | Bin 0 -> 819 bytes e107_plugins/log/images/multibrowser.png | Bin 0 -> 844 bytes e107_plugins/log/images/nautilus.png | Bin 0 -> 748 bytes e107_plugins/log/images/netbsd.png | Bin 0 -> 329 bytes e107_plugins/log/images/netcaptor.png | Bin 0 -> 558 bytes e107_plugins/log/images/netfront.png | Bin 0 -> 778 bytes e107_plugins/log/images/netpositive.png | Bin 0 -> 843 bytes e107_plugins/log/images/netscape.png | Bin 0 -> 203 bytes e107_plugins/log/images/netscape2.png | Bin 0 -> 203 bytes e107_plugins/log/images/omniweb.png | Bin 0 -> 823 bytes e107_plugins/log/images/openbsd.png | Bin 0 -> 358 bytes e107_plugins/log/images/opera.png | Bin 0 -> 284 bytes e107_plugins/log/images/oregano.png | Bin 0 -> 875 bytes e107_plugins/log/images/phaseout.png | Bin 0 -> 857 bytes e107_plugins/log/images/phoenix.png | Bin 0 -> 684 bytes e107_plugins/log/images/proxomitron.png | Bin 0 -> 560 bytes e107_plugins/log/images/remove.png | Bin 0 -> 790 bytes e107_plugins/log/images/robot.png | Bin 0 -> 406 bytes e107_plugins/log/images/safari.png | Bin 0 -> 759 bytes e107_plugins/log/images/screen.png | Bin 0 -> 545 bytes e107_plugins/log/images/shiira.png | Bin 0 -> 810 bytes e107_plugins/log/images/sleipnir.png | Bin 0 -> 906 bytes e107_plugins/log/images/slimbrowser.png | Bin 0 -> 892 bytes e107_plugins/log/images/spiders.png | Bin 0 -> 865 bytes e107_plugins/log/images/staroffice.png | Bin 0 -> 302 bytes e107_plugins/log/images/stats_16.png | Bin 0 -> 931 bytes e107_plugins/log/images/stats_32.png | Bin 0 -> 1428 bytes e107_plugins/log/images/sunos.png | Bin 0 -> 200 bytes e107_plugins/log/images/sunrise.png | Bin 0 -> 863 bytes e107_plugins/log/images/unix.png | Bin 0 -> 478 bytes e107_plugins/log/images/unknown.png | Bin 0 -> 1013 bytes e107_plugins/log/images/unspecified.png | Bin 0 -> 1013 bytes e107_plugins/log/images/voyager.png | Bin 0 -> 717 bytes e107_plugins/log/images/w3m.png | Bin 0 -> 669 bytes .../log/images/web%20indexing%20robot.png | Bin 0 -> 406 bytes e107_plugins/log/images/webtv.png | Bin 0 -> 295 bytes e107_plugins/log/images/windows.png | Bin 0 -> 752 bytes e107_plugins/log/images/xiino.png | Bin 0 -> 825 bytes e107_plugins/log/languages/English.php | 64 + e107_plugins/log/languages/admin/English.php | 61 + e107_plugins/log/log.php | 122 + e107_plugins/log/log_sql.php | 7 + e107_plugins/log/log_update.php | 330 + e107_plugins/log/log_update_check.php | 39 + e107_plugins/log/loginfo.php | 245 + e107_plugins/log/logs/null.txt | 0 e107_plugins/log/plugin.php | 78 + e107_plugins/log/stats.php | 1212 +++ e107_plugins/login_menu/config.php | 96 + e107_plugins/login_menu/languages/English.php | 65 + e107_plugins/login_menu/login_menu.php | 212 + .../login_menu/login_menu_shortcodes.php | 160 + .../login_menu/login_menu_template.php | 70 + .../newforumposts_main/admin_config.php | 100 + .../newforumposts_main/images/logo.png | Bin 0 -> 331 bytes .../images/new_forum_16.png | Bin 0 -> 760 bytes .../images/new_forum_32.png | Bin 0 -> 1685 bytes .../newforumposts_main/languages/English.php | 29 + .../newforumposts_main/newforumposts.sc | 10 + .../newforumposts_main/newforumposts_main.php | 152 + e107_plugins/newforumposts_main/plugin.php | 85 + e107_plugins/newsfeed/admin_config.php | 198 + e107_plugins/newsfeed/e_frontpage.php | 17 + e107_plugins/newsfeed/help.php | 24 + e107_plugins/newsfeed/images/newsfeed_16.png | Bin 0 -> 851 bytes e107_plugins/newsfeed/images/newsfeed_32.png | Bin 0 -> 1573 bytes e107_plugins/newsfeed/languages/English.php | 91 + .../newsfeed/languages/English_frontpage.php | 16 + e107_plugins/newsfeed/newsfeed.php | 168 + e107_plugins/newsfeed/newsfeed_functions.php | 200 + e107_plugins/newsfeed/newsfeed_menu.php | 27 + e107_plugins/newsfeed/plugin.php | 79 + .../templates/newsfeed_menu_template.php | 42 + .../newsfeed/templates/newsfeed_template.php | 64 + e107_plugins/newsletter/admin_config.php | 518 ++ e107_plugins/newsletter/images/nl_16.png | Bin 0 -> 1000 bytes e107_plugins/newsletter/images/nl_32.png | Bin 0 -> 2381 bytes e107_plugins/newsletter/languages/English.php | 86 + e107_plugins/newsletter/newsletter_menu.php | 91 + e107_plugins/newsletter/plugin.php | 81 + .../online_extended_menu/images/user.png | Bin 0 -> 293 bytes .../languages/English.php | 33 + .../online_extended_menu.php | 88 + .../online_menu/languages/English.php | 27 + e107_plugins/online_menu/online_menu.php | 53 + .../other_news_menu/languages/English.php | 16 + .../other_news_menu/other_news2_menu.php | 137 + .../other_news_menu/other_news_menu.php | 133 + e107_plugins/pdf/admin_pdf_config.php | 188 + e107_plugins/pdf/e107pdf.php | 631 ++ e107_plugins/pdf/font/courier.php | 7 + e107_plugins/pdf/font/helvetica.php | 15 + e107_plugins/pdf/font/helveticab.php | 15 + e107_plugins/pdf/font/helveticabi.php | 15 + e107_plugins/pdf/font/helveticai.php | 15 + e107_plugins/pdf/font/makefont/cp1250.map | 251 + e107_plugins/pdf/font/makefont/cp1251.map | 255 + e107_plugins/pdf/font/makefont/cp1252.map | 251 + e107_plugins/pdf/font/makefont/cp1253.map | 239 + e107_plugins/pdf/font/makefont/cp1254.map | 249 + e107_plugins/pdf/font/makefont/cp1255.map | 233 + e107_plugins/pdf/font/makefont/cp1257.map | 244 + e107_plugins/pdf/font/makefont/cp1258.map | 247 + e107_plugins/pdf/font/makefont/cp874.map | 225 + e107_plugins/pdf/font/makefont/iso-8859-1.map | 256 + .../pdf/font/makefont/iso-8859-11.map | 248 + .../pdf/font/makefont/iso-8859-15.map | 256 + .../pdf/font/makefont/iso-8859-16.map | 256 + e107_plugins/pdf/font/makefont/iso-8859-2.map | 256 + e107_plugins/pdf/font/makefont/iso-8859-4.map | 256 + e107_plugins/pdf/font/makefont/iso-8859-5.map | 256 + e107_plugins/pdf/font/makefont/iso-8859-7.map | 250 + e107_plugins/pdf/font/makefont/iso-8859-9.map | 256 + e107_plugins/pdf/font/makefont/koi8-r.map | 256 + e107_plugins/pdf/font/makefont/koi8-u.map | 256 + e107_plugins/pdf/font/makefont/makefont.php | 416 + e107_plugins/pdf/font/symbol.php | 15 + e107_plugins/pdf/font/times.php | 15 + e107_plugins/pdf/font/timesb.php | 15 + e107_plugins/pdf/font/timesbi.php | 15 + e107_plugins/pdf/font/timesi.php | 15 + e107_plugins/pdf/font/zapfdingbats.php | 15 + e107_plugins/pdf/fpdf.css | 11 + e107_plugins/pdf/fpdf.php | 1664 ++++ e107_plugins/pdf/images/pdf_16.png | Bin 0 -> 880 bytes e107_plugins/pdf/images/pdf_32.png | Bin 0 -> 1625 bytes e107_plugins/pdf/languages/English.php | 39 + e107_plugins/pdf/pdf.php | 118 + e107_plugins/pdf/pdf.sc | 14 + e107_plugins/pdf/plugin.php | 69 + e107_plugins/pdf/ufpdf.php | 492 ++ e107_plugins/pm/attachments/index.html | 0 e107_plugins/pm/images/attach.png | Bin 0 -> 860 bytes e107_plugins/pm/images/mail_block.png | Bin 0 -> 1121 bytes e107_plugins/pm/images/mail_delete.png | Bin 0 -> 1048 bytes e107_plugins/pm/images/mail_get.png | Bin 0 -> 971 bytes e107_plugins/pm/images/mail_send.png | Bin 0 -> 976 bytes e107_plugins/pm/images/mail_unblock.png | Bin 0 -> 1188 bytes e107_plugins/pm/images/newpm.gif | Bin 0 -> 11753 bytes e107_plugins/pm/images/pm.png | Bin 0 -> 836 bytes e107_plugins/pm/images/pvt_message_16.png | Bin 0 -> 877 bytes e107_plugins/pm/images/pvt_message_32.png | Bin 0 -> 1220 bytes e107_plugins/pm/images/read.png | Bin 0 -> 1119 bytes e107_plugins/pm/images/unread.png | Bin 0 -> 899 bytes e107_plugins/pm/index.html | 0 e107_plugins/pm/languages/English.php | 80 + e107_plugins/pm/languages/admin/English.php | 63 + e107_plugins/pm/plugin.php | 102 + e107_plugins/pm/pm.php | 433 + e107_plugins/pm/pm_class.php | 428 + e107_plugins/pm/pm_conf.php | 364 + e107_plugins/pm/pm_default.php | 25 + e107_plugins/pm/pm_func.php | 97 + e107_plugins/pm/pm_notes.txt | 17 + e107_plugins/pm/pm_shortcodes.php | 371 + e107_plugins/pm/pm_sql.php | 24 + e107_plugins/pm/pm_template.php | 194 + e107_plugins/pm/pm_update.php | 113 + e107_plugins/pm/pm_update_check.php | 40 + e107_plugins/pm/private_msg_menu.php | 113 + e107_plugins/pm/sendpm.sc | 20 + e107_plugins/poll/admin_config.php | 172 + e107_plugins/poll/images/bar.png | Bin 0 -> 227 bytes e107_plugins/poll/images/barl.png | Bin 0 -> 398 bytes e107_plugins/poll/images/barr.png | Bin 0 -> 413 bytes e107_plugins/poll/images/polls_16.png | Bin 0 -> 788 bytes e107_plugins/poll/images/polls_32.png | Bin 0 -> 1615 bytes e107_plugins/poll/languages/English.php | 74 + e107_plugins/poll/oldpolls.php | 151 + e107_plugins/poll/plugin.php | 87 + e107_plugins/poll/poll.php | 28 + e107_plugins/poll/poll_class.php | 595 ++ e107_plugins/poll/poll_menu.php | 52 + e107_plugins/poll/poll_sql.php | 18 + e107_plugins/poll/search/search_comments.php | 21 + e107_plugins/poll/templates/poll_template.php | 186 + .../powered_by_menu/languages/English.php | 15 + .../powered_by_menu/powered_by_menu.php | 34 + e107_plugins/rss_menu/admin_prefs.php | 412 + e107_plugins/rss_menu/e_meta.php | 36 + e107_plugins/rss_menu/images/rss1.png | Bin 0 -> 3580 bytes e107_plugins/rss_menu/images/rss2.png | Bin 0 -> 3621 bytes e107_plugins/rss_menu/images/rss3.png | Bin 0 -> 3522 bytes e107_plugins/rss_menu/images/rss4.png | Bin 0 -> 3520 bytes e107_plugins/rss_menu/images/rss_16.png | Bin 0 -> 604 bytes e107_plugins/rss_menu/images/rss_32.png | Bin 0 -> 1197 bytes e107_plugins/rss_menu/languages/English.php | 92 + e107_plugins/rss_menu/plugin.php | 111 + e107_plugins/rss_menu/rss.php | 669 ++ e107_plugins/rss_menu/rss_menu.php | 81 + e107_plugins/rss_menu/rss_shortcodes.php | 192 + e107_plugins/rss_menu/rss_sql.php | 12 + e107_plugins/rss_menu/rss_template.php | 175 + e107_plugins/search_menu/images/search.png | Bin 0 -> 912 bytes e107_plugins/search_menu/images/search_32.png | Bin 0 -> 1759 bytes .../search_menu/languages/English.php | 14 + e107_plugins/search_menu/search_menu.php | 78 + .../sitebutton_menu/languages/English.php | 22 + .../sitebutton_menu/sitebutton_menu.php | 22 + e107_plugins/trackback/admin_config.php | 77 + e107_plugins/trackback/e_meta.php | 21 + .../trackback/images/trackback_16.png | Bin 0 -> 591 bytes .../trackback/images/trackback_32.png | Bin 0 -> 1376 bytes e107_plugins/trackback/languages/English.php | 37 + e107_plugins/trackback/modtrackback.php | 72 + e107_plugins/trackback/plugin.php | 85 + e107_plugins/trackback/trackback.php | 24 + e107_plugins/trackback/trackbackClass.php | 177 + e107_plugins/tree_menu/config.php | 80 + e107_plugins/tree_menu/languages/English.php | 30 + e107_plugins/tree_menu/tree_menu.php | 188 + .../userlanguage_menu/languages/English.php | 23 + .../userlanguage_menu/userlanguage_menu.php | 47 + .../usertheme_menu/languages/English.php | 6 + .../usertheme_menu/usertheme_menu.php | 69 + e107_themes/crahan/images/bullet2.gif | Bin 0 -> 828 bytes e107_themes/crahan/images/logo1.png | Bin 0 -> 49887 bytes e107_themes/crahan/images/logo2.png | Bin 0 -> 20022 bytes e107_themes/crahan/images/logo3.png | Bin 0 -> 24914 bytes e107_themes/crahan/images/logo4.png | Bin 0 -> 35635 bytes e107_themes/crahan/index.html | 0 e107_themes/crahan/languages/English.php | 28 + e107_themes/crahan/preview.jpg | Bin 0 -> 6134 bytes e107_themes/crahan/style.css | 493 ++ e107_themes/crahan/theme.php | 134 + e107_themes/e107v4a/forum_template.php | 295 + e107_themes/e107v4a/images/bar.jpg | Bin 0 -> 644 bytes e107_themes/e107v4a/images/bar.png | Bin 0 -> 231 bytes e107_themes/e107v4a/images/barl.png | Bin 0 -> 383 bytes e107_themes/e107v4a/images/barr.png | Bin 0 -> 392 bytes e107_themes/e107v4a/images/blank.gif | Bin 0 -> 807 bytes e107_themes/e107v4a/images/bottom.png | Bin 0 -> 195 bytes e107_themes/e107v4a/images/bottomleft.png | Bin 0 -> 334 bytes e107_themes/e107v4a/images/bottomright.png | Bin 0 -> 335 bytes e107_themes/e107v4a/images/bullet2.gif | Bin 0 -> 873 bytes e107_themes/e107v4a/images/bullet3.png | Bin 0 -> 341 bytes e107_themes/e107v4a/images/button.png | Bin 0 -> 196 bytes e107_themes/e107v4a/images/button2.png | Bin 0 -> 215 bytes e107_themes/e107v4a/images/button3.png | Bin 0 -> 213 bytes e107_themes/e107v4a/images/cap1.png | Bin 0 -> 238 bytes e107_themes/e107v4a/images/capdark.png | Bin 0 -> 233 bytes e107_themes/e107v4a/images/capleft.png | Bin 0 -> 1004 bytes e107_themes/e107v4a/images/caplight.png | Bin 0 -> 232 bytes e107_themes/e107v4a/images/capright.png | Bin 0 -> 508 bytes e107_themes/e107v4a/images/captransition.png | Bin 0 -> 483 bytes e107_themes/e107v4a/images/fcap.png | Bin 0 -> 228 bytes e107_themes/e107v4a/images/fcap2.png | Bin 0 -> 230 bytes e107_themes/e107v4a/images/header.png | Bin 0 -> 256 bytes e107_themes/e107v4a/images/left.png | Bin 0 -> 187 bytes e107_themes/e107v4a/images/logo.png | Bin 0 -> 2604 bytes e107_themes/e107v4a/images/nforumcaption.png | Bin 0 -> 232 bytes e107_themes/e107v4a/images/nforumcaption2.png | Bin 0 -> 227 bytes e107_themes/e107v4a/images/right.png | Bin 0 -> 187 bytes e107_themes/e107v4a/images/search.png | Bin 0 -> 589 bytes e107_themes/e107v4a/images/temp.png | Bin 0 -> 196 bytes e107_themes/e107v4a/images/top.png | Bin 0 -> 189 bytes e107_themes/e107v4a/images/topleft.png | Bin 0 -> 344 bytes e107_themes/e107v4a/images/topright.png | Bin 0 -> 255 bytes e107_themes/e107v4a/index.html | 0 e107_themes/e107v4a/languages/English.php | 27 + e107_themes/e107v4a/newsfeed_template.php | 64 + e107_themes/e107v4a/preview.jpg | Bin 0 -> 8056 bytes e107_themes/e107v4a/style.css | 377 + e107_themes/e107v4a/theme.php | 270 + e107_themes/human_condition/images/bg.png | Bin 0 -> 221 bytes e107_themes/human_condition/images/bullet.png | Bin 0 -> 165 bytes .../human_condition/images/bullet2.gif | Bin 0 -> 53 bytes .../human_condition/images/bullet2.png | Bin 0 -> 150 bytes .../human_condition/images/comment.png | Bin 0 -> 747 bytes e107_themes/human_condition/images/footer.png | Bin 0 -> 224 bytes e107_themes/human_condition/images/header.png | Bin 0 -> 407 bytes .../human_condition/images/titlebar.png | Bin 0 -> 4011 bytes e107_themes/human_condition/index.html | 0 .../human_condition/languages/English.php | 28 + e107_themes/human_condition/newforumpost.php | 30 + e107_themes/human_condition/preview.jpg | Bin 0 -> 6997 bytes e107_themes/human_condition/style.css | 422 + e107_themes/human_condition/theme.php | 188 + e107_themes/index.html | 0 e107_themes/interfectus/images/background.jpg | Bin 0 -> 28913 bytes e107_themes/interfectus/images/bar.png | Bin 0 -> 226 bytes e107_themes/interfectus/images/barl.png | Bin 0 -> 338 bytes e107_themes/interfectus/images/barr.png | Bin 0 -> 334 bytes e107_themes/interfectus/images/blank.gif | Bin 0 -> 807 bytes e107_themes/interfectus/images/bottomcol.png | Bin 0 -> 214 bytes .../interfectus/images/bottomleftcol.png | Bin 0 -> 250 bytes .../interfectus/images/bottomrightcol.png | Bin 0 -> 244 bytes e107_themes/interfectus/images/bullet1.gif | Bin 0 -> 819 bytes e107_themes/interfectus/images/bullet2.gif | Bin 0 -> 865 bytes e107_themes/interfectus/images/button.png | Bin 0 -> 219 bytes e107_themes/interfectus/images/cap1.png | Bin 0 -> 216 bytes e107_themes/interfectus/images/caption.png | Bin 0 -> 239 bytes e107_themes/interfectus/images/fcap.png | Bin 0 -> 209 bytes e107_themes/interfectus/images/fcap2.png | Bin 0 -> 216 bytes e107_themes/interfectus/images/footer.png | Bin 0 -> 204 bytes e107_themes/interfectus/images/header.png | Bin 0 -> 33646 bytes e107_themes/interfectus/images/leftcol.png | Bin 0 -> 207 bytes e107_themes/interfectus/images/link1.png | Bin 0 -> 444 bytes e107_themes/interfectus/images/link2.png | Bin 0 -> 443 bytes e107_themes/interfectus/images/menubottom.png | Bin 0 -> 203 bytes .../interfectus/images/menubottom2.png | Bin 0 -> 203 bytes e107_themes/interfectus/images/menutop.png | Bin 0 -> 197 bytes e107_themes/interfectus/images/menutop2.png | Bin 0 -> 197 bytes e107_themes/interfectus/images/pagefooter.png | Bin 0 -> 192 bytes e107_themes/interfectus/images/pageheader.png | Bin 0 -> 221 bytes e107_themes/interfectus/images/rightcol.png | Bin 0 -> 208 bytes e107_themes/interfectus/images/search.png | Bin 0 -> 574 bytes e107_themes/interfectus/images/topleftcol.png | Bin 0 -> 357 bytes .../interfectus/images/toprightcol.png | Bin 0 -> 383 bytes e107_themes/interfectus/index.html | 0 e107_themes/interfectus/languages/English.php | 26 + e107_themes/interfectus/preview.jpg | Bin 0 -> 6651 bytes e107_themes/interfectus/style.css | 424 + e107_themes/interfectus/theme.php | 296 + e107_themes/jayya/admin_template.php | 173 + e107_themes/jayya/canvas.css | 316 + e107_themes/jayya/forum/admin.png | Bin 0 -> 339 bytes e107_themes/jayya/forum/admin_delete.png | Bin 0 -> 435 bytes e107_themes/jayya/forum/admin_edit.png | Bin 0 -> 438 bytes e107_themes/jayya/forum/admin_lock.png | Bin 0 -> 311 bytes e107_themes/jayya/forum/admin_move.png | Bin 0 -> 327 bytes e107_themes/jayya/forum/admin_stick.png | Bin 0 -> 422 bytes e107_themes/jayya/forum/admin_unlock.png | Bin 0 -> 335 bytes e107_themes/jayya/forum/admin_unstick.png | Bin 0 -> 1183 bytes e107_themes/jayya/forum/announce.png | Bin 0 -> 363 bytes e107_themes/jayya/forum/closed_small.png | Bin 0 -> 311 bytes e107_themes/jayya/forum/delete.png | Bin 0 -> 607 bytes e107_themes/jayya/forum/e.png | Bin 0 -> 527 bytes e107_themes/jayya/forum/edit.png | Bin 0 -> 327 bytes e107_themes/jayya/forum/email.png | Bin 0 -> 274 bytes e107_themes/jayya/forum/fcap.png | Bin 0 -> 333 bytes e107_themes/jayya/forum/fcap2.png | Bin 0 -> 343 bytes e107_themes/jayya/forum/fcap2orig.png | Bin 0 -> 212 bytes e107_themes/jayya/forum/finfobar.png | Bin 0 -> 199 bytes .../jayya/forum/forum_icons_template.php | 71 + e107_themes/jayya/forum/main_admin.png | Bin 0 -> 350 bytes e107_themes/jayya/forum/moderator.png | Bin 0 -> 350 bytes e107_themes/jayya/forum/new.png | Bin 0 -> 394 bytes e107_themes/jayya/forum/new_popular.gif | Bin 0 -> 476 bytes e107_themes/jayya/forum/new_small.png | Bin 0 -> 264 bytes e107_themes/jayya/forum/newthread.png | Bin 0 -> 628 bytes e107_themes/jayya/forum/nonew.png | Bin 0 -> 402 bytes e107_themes/jayya/forum/nonew_popular.gif | Bin 0 -> 506 bytes e107_themes/jayya/forum/nonew_small.png | Bin 0 -> 271 bytes e107_themes/jayya/forum/post.png | Bin 0 -> 229 bytes e107_themes/jayya/forum/profile.png | Bin 0 -> 277 bytes e107_themes/jayya/forum/quote.png | Bin 0 -> 245 bytes e107_themes/jayya/forum/reply.png | Bin 0 -> 681 bytes e107_themes/jayya/forum/report.png | Bin 0 -> 387 bytes e107_themes/jayya/forum/sticky.png | Bin 0 -> 399 bytes e107_themes/jayya/forum/stickyclosed.png | Bin 0 -> 406 bytes e107_themes/jayya/forum/website.png | Bin 0 -> 302 bytes e107_themes/jayya/images/arrow.png | Bin 0 -> 743 bytes e107_themes/jayya/images/bar.jpg | Bin 0 -> 644 bytes e107_themes/jayya/images/blank.gif | Bin 0 -> 807 bytes e107_themes/jayya/images/bullet2.gif | Bin 0 -> 296 bytes e107_themes/jayya/images/button.png | Bin 0 -> 207 bytes e107_themes/jayya/images/buttonover.png | Bin 0 -> 207 bytes e107_themes/jayya/images/comments_16.png | Bin 0 -> 1023 bytes e107_themes/jayya/images/computer.jpg | Bin 0 -> 5931 bytes e107_themes/jayya/images/computer_pepper.jpg | Bin 0 -> 2239 bytes e107_themes/jayya/images/email_16.png | Bin 0 -> 885 bytes e107_themes/jayya/images/on.png | Bin 0 -> 8450 bytes e107_themes/jayya/images/polls.png | Bin 0 -> 638 bytes e107_themes/jayya/images/postedby_16.png | Bin 0 -> 864 bytes e107_themes/jayya/images/print_16.png | Bin 0 -> 1097 bytes e107_themes/jayya/images/s_body.png | Bin 0 -> 149 bytes e107_themes/jayya/images/s_body_.png | Bin 0 -> 149 bytes e107_themes/jayya/images/s_left_bevel.png | Bin 0 -> 184 bytes e107_themes/jayya/images/s_left_bevel_.png | Bin 0 -> 161 bytes e107_themes/jayya/images/s_left_cap.png | Bin 0 -> 302 bytes e107_themes/jayya/images/s_left_cap_.png | Bin 0 -> 321 bytes e107_themes/jayya/images/s_main_cap.png | Bin 0 -> 281 bytes e107_themes/jayya/images/s_main_cap_.png | Bin 0 -> 306 bytes e107_themes/jayya/images/s_nav.png | Bin 0 -> 145 bytes e107_themes/jayya/images/s_nav_.png | Bin 0 -> 145 bytes e107_themes/jayya/images/screen.png | Bin 0 -> 4628 bytes e107_themes/jayya/images/top_mid_back.jpg | Bin 0 -> 5075 bytes .../jayya/images/top_mid_back_pepper.jpg | Bin 0 -> 2239 bytes e107_themes/jayya/images/top_right_back.jpg | Bin 0 -> 1712 bytes .../jayya/images/top_right_back_pepper.png | Bin 0 -> 4628 bytes e107_themes/jayya/index.html | 0 e107_themes/jayya/languages/English.php | 28 + e107_themes/jayya/nav_menu.css | 110 + e107_themes/jayya/pepper.css | 335 + e107_themes/jayya/preview.jpg | Bin 0 -> 7990 bytes e107_themes/jayya/style.css | 354 + e107_themes/jayya/theme.php | 271 + e107_themes/khatru/download_template.php | 239 + e107_themes/khatru/forum_post_template.php | 114 + e107_themes/khatru/forum_posted_template.php | 58 + e107_themes/khatru/forum_preview_template.php | 31 + e107_themes/khatru/forum_template.php | 74 + .../khatru/forum_viewforum_template.php | 136 + .../khatru/forum_viewtopic_template.php | 151 + e107_themes/khatru/images/background.png | Bin 0 -> 297 bytes e107_themes/khatru/images/blank.gif | Bin 0 -> 807 bytes e107_themes/khatru/images/bottom.png | Bin 0 -> 209 bytes e107_themes/khatru/images/bottomleft.png | Bin 0 -> 274 bytes e107_themes/khatru/images/bottomright.png | Bin 0 -> 269 bytes e107_themes/khatru/images/bullet.png | Bin 0 -> 401 bytes e107_themes/khatru/images/bullet2.gif | Bin 0 -> 890 bytes e107_themes/khatru/images/button.png | Bin 0 -> 221 bytes e107_themes/khatru/images/icon.png | Bin 0 -> 866 bytes e107_themes/khatru/images/left.png | Bin 0 -> 196 bytes e107_themes/khatru/images/logo1.png | Bin 0 -> 11364 bytes e107_themes/khatru/images/logo2.png | Bin 0 -> 290 bytes e107_themes/khatru/images/logo3.png | Bin 0 -> 687 bytes e107_themes/khatru/images/menubg.png | Bin 0 -> 198 bytes e107_themes/khatru/images/menubg2.png | Bin 0 -> 198 bytes e107_themes/khatru/images/nforumcaption.png | Bin 0 -> 208 bytes e107_themes/khatru/images/nforumcaption2.png | Bin 0 -> 191 bytes e107_themes/khatru/images/right.png | Bin 0 -> 196 bytes e107_themes/khatru/images/top.png | Bin 0 -> 237 bytes e107_themes/khatru/images/top2.png | Bin 0 -> 202 bytes e107_themes/khatru/images/topleft.png | Bin 0 -> 385 bytes e107_themes/khatru/images/topleft2.png | Bin 0 -> 259 bytes e107_themes/khatru/images/topright.png | Bin 0 -> 390 bytes e107_themes/khatru/images/topright2.png | Bin 0 -> 271 bytes e107_themes/khatru/index.html | 0 e107_themes/khatru/languages/English.php | 27 + e107_themes/khatru/newforumpost.php | 13 + e107_themes/khatru/news_template.php | 31 + e107_themes/khatru/poll_template.php | 157 + e107_themes/khatru/preview.png | Bin 0 -> 19598 bytes e107_themes/khatru/style.css | 481 ++ e107_themes/khatru/theme.php | 237 + e107_themes/kubrick/images/01_linkbg1.gif | Bin 0 -> 104 bytes e107_themes/kubrick/images/01_linkbg2.gif | Bin 0 -> 104 bytes e107_themes/kubrick/images/bar.jpg | Bin 0 -> 644 bytes e107_themes/kubrick/images/bullet2.gif | Bin 0 -> 868 bytes e107_themes/kubrick/images/kubrickbg.jpg | Bin 0 -> 1047 bytes e107_themes/kubrick/images/kubrickbgcolor.jpg | Bin 0 -> 558 bytes e107_themes/kubrick/images/kubrickbgwide.jpg | Bin 0 -> 1337 bytes e107_themes/kubrick/images/kubrickfooter.jpg | Bin 0 -> 2601 bytes e107_themes/kubrick/images/kubrickheader.jpg | Bin 0 -> 8334 bytes e107_themes/kubrick/images/tileage.jpg | Bin 0 -> 347 bytes e107_themes/kubrick/index.html | 0 e107_themes/kubrick/languages/English.php | 27 + e107_themes/kubrick/preview.jpg | Bin 0 -> 5171 bytes e107_themes/kubrick/style.css | 463 ++ e107_themes/kubrick/theme.js | 348 + e107_themes/kubrick/theme.php | 150 + e107_themes/kubrick/ul.sc | 33 + e107_themes/lamb/alt_style.css | 491 ++ e107_themes/lamb/alt_theme.php | 163 + e107_themes/lamb/chat_template.php | 18 + e107_themes/lamb/download_template.php | 208 + e107_themes/lamb/forum_post_template.php | 120 + e107_themes/lamb/forum_posted_template.php | 61 + e107_themes/lamb/forum_preview_template.php | 35 + e107_themes/lamb/forum_template.php | 61 + e107_themes/lamb/forum_viewforum_template.php | 134 + e107_themes/lamb/forum_viewtopic_template.php | 144 + e107_themes/lamb/images/bar.jpg | Bin 0 -> 633 bytes e107_themes/lamb/images/bg.png | Bin 0 -> 230 bytes e107_themes/lamb/images/bluearrow.png | Bin 0 -> 242 bytes e107_themes/lamb/images/bluearrow_greybg.png | Bin 0 -> 222 bytes e107_themes/lamb/images/boxbottom.png | Bin 0 -> 392 bytes e107_themes/lamb/images/boxtop.png | Bin 0 -> 392 bytes e107_themes/lamb/images/bullet2.gif | Bin 0 -> 828 bytes e107_themes/lamb/images/button.png | Bin 0 -> 189 bytes e107_themes/lamb/images/comment.png | Bin 0 -> 747 bytes e107_themes/lamb/images/download.png | Bin 0 -> 1373 bytes e107_themes/lamb/images/email.png | Bin 0 -> 595 bytes e107_themes/lamb/images/greyarrow.png | Bin 0 -> 239 bytes e107_themes/lamb/images/lboxbottom.png | Bin 0 -> 373 bytes e107_themes/lamb/images/lboxtop.png | Bin 0 -> 376 bytes e107_themes/lamb/images/left.png | Bin 0 -> 240 bytes e107_themes/lamb/images/link.png | Bin 0 -> 720 bytes e107_themes/lamb/images/logo.png | Bin 0 -> 6723 bytes e107_themes/lamb/images/logo_template.png | Bin 0 -> 5465 bytes e107_themes/lamb/images/logobg.png | Bin 0 -> 279 bytes e107_themes/lamb/images/nforumcaption.png | Bin 0 -> 208 bytes e107_themes/lamb/images/nforumcaption2.png | Bin 0 -> 229 bytes e107_themes/lamb/images/right.png | Bin 0 -> 239 bytes e107_themes/lamb/index.html | 0 e107_themes/lamb/languages/English.php | 27 + e107_themes/lamb/newforumpost.php | 13 + e107_themes/lamb/news_template.php | 31 + e107_themes/lamb/preview.jpg | Bin 0 -> 9528 bytes e107_themes/lamb/style.css | 513 ++ e107_themes/lamb/theme.php | 168 + e107_themes/leaf/bluehigh.ttf | Bin 0 -> 55820 bytes e107_themes/leaf/fontstyles/large.css | 11 + e107_themes/leaf/fontstyles/medium.css | 11 + e107_themes/leaf/images/01_bg.gif | Bin 0 -> 350 bytes e107_themes/leaf/images/01_bodybg.jpg | Bin 0 -> 8882 bytes e107_themes/leaf/images/01_font1.gif | Bin 0 -> 450 bytes e107_themes/leaf/images/01_font2.gif | Bin 0 -> 461 bytes e107_themes/leaf/images/01_font3.gif | Bin 0 -> 477 bytes e107_themes/leaf/images/01_footer.jpg | Bin 0 -> 13496 bytes e107_themes/leaf/images/01_hdot.gif | Bin 0 -> 49 bytes e107_themes/leaf/images/01_header01.jpg | Bin 0 -> 50342 bytes e107_themes/leaf/images/01_header02.jpg | Bin 0 -> 52573 bytes e107_themes/leaf/images/01_header03.jpg | Bin 0 -> 50962 bytes e107_themes/leaf/images/01_header04.jpg | Bin 0 -> 51466 bytes e107_themes/leaf/images/01_item1.gif | Bin 0 -> 119 bytes e107_themes/leaf/images/01_item2.gif | Bin 0 -> 111 bytes e107_themes/leaf/images/01_item3.gif | Bin 0 -> 117 bytes e107_themes/leaf/images/01_linkbg1.gif | Bin 0 -> 104 bytes e107_themes/leaf/images/01_linkbg2.gif | Bin 0 -> 104 bytes e107_themes/leaf/images/01_logo.gif | Bin 0 -> 1577 bytes e107_themes/leaf/images/01_m_comment.gif | Bin 0 -> 2099 bytes e107_themes/leaf/images/01_m_default.gif | Bin 0 -> 769 bytes e107_themes/leaf/images/01_m_news.gif | Bin 0 -> 1621 bytes e107_themes/leaf/images/01_mountaintop2.gif | Bin 0 -> 79 bytes e107_themes/leaf/images/01_quote.gif | Bin 0 -> 380 bytes e107_themes/leaf/images/01_s_about.gif | Bin 0 -> 1699 bytes e107_themes/leaf/images/01_s_categories.gif | Bin 0 -> 2145 bytes e107_themes/leaf/images/01_s_chatbox.gif | Bin 0 -> 1911 bytes e107_themes/leaf/images/01_s_default.gif | Bin 0 -> 782 bytes .../leaf/images/01_s_latestcomment.gif | Bin 0 -> 2598 bytes e107_themes/leaf/images/01_s_links.gif | Bin 0 -> 1638 bytes e107_themes/leaf/images/01_s_login.gif | Bin 0 -> 1661 bytes e107_themes/leaf/images/01_s_online.gif | Bin 0 -> 1737 bytes e107_themes/leaf/images/01_s_search.gif | Bin 0 -> 1773 bytes e107_themes/leaf/images/bullet2.gif | Bin 0 -> 55 bytes e107_themes/leaf/index.html | 0 e107_themes/leaf/languages/English.php | 30 + e107_themes/leaf/links.sc | 15 + e107_themes/leaf/preview.png | Bin 0 -> 30432 bytes e107_themes/leaf/style.css | 743 ++ e107_themes/leaf/theme.js | 524 ++ e107_themes/leaf/theme.php | 259 + e107_themes/leaf/ul.sc | 34 + e107_themes/newsroom/images/bar.jpg | Bin 0 -> 666 bytes e107_themes/newsroom/images/bullet2.gif | Bin 0 -> 44 bytes e107_themes/newsroom/images/logo_bg.png | Bin 0 -> 297 bytes e107_themes/newsroom/images/logo_text.png | Bin 0 -> 10492 bytes e107_themes/newsroom/index.html | 0 e107_themes/newsroom/preview.jpg | Bin 0 -> 10409 bytes e107_themes/newsroom/style.css | 369 + e107_themes/newsroom/theme.php | 477 ++ e107_themes/reline/admin_style.css | 517 ++ e107_themes/reline/admin_template.php | 178 + e107_themes/reline/cube.sc | 13 + e107_themes/reline/full_width.css | 490 ++ e107_themes/reline/images/arrow.png | Bin 0 -> 743 bytes e107_themes/reline/images/bar.jpg | Bin 0 -> 644 bytes e107_themes/reline/images/blank.gif | Bin 0 -> 807 bytes e107_themes/reline/images/bullet2.gif | Bin 0 -> 508 bytes e107_themes/reline/images/button.png | Bin 0 -> 207 bytes e107_themes/reline/images/buttonover.png | Bin 0 -> 207 bytes e107_themes/reline/images/comments_16.png | Bin 0 -> 1023 bytes e107_themes/reline/images/cube.png | Bin 0 -> 3624 bytes e107_themes/reline/images/e_adminlogo.png | Bin 0 -> 7573 bytes e107_themes/reline/images/e_logo.png | Bin 0 -> 8306 bytes e107_themes/reline/images/email_16.png | Bin 0 -> 885 bytes e107_themes/reline/images/header.jpg | Bin 0 -> 15466 bytes e107_themes/reline/images/header.png | Bin 0 -> 28404 bytes e107_themes/reline/images/loggedin.png | Bin 0 -> 2170 bytes e107_themes/reline/images/logo.png | Bin 0 -> 8306 bytes e107_themes/reline/images/paperclip.png | Bin 0 -> 15192 bytes e107_themes/reline/images/polls.png | Bin 0 -> 638 bytes e107_themes/reline/images/post_it_bottom.png | Bin 0 -> 2343 bytes e107_themes/reline/images/post_it_middle.png | Bin 0 -> 2114 bytes e107_themes/reline/images/post_it_top.png | Bin 0 -> 4484 bytes e107_themes/reline/images/postedby_16.png | Bin 0 -> 864 bytes e107_themes/reline/images/print_16.png | Bin 0 -> 1097 bytes e107_themes/reline/images/s_nav.png | Bin 0 -> 145 bytes e107_themes/reline/images/search.png | Bin 0 -> 994 bytes e107_themes/reline/index.html | 0 e107_themes/reline/languages/English.php | 29 + e107_themes/reline/preview.jpg | Bin 0 -> 10259 bytes e107_themes/reline/style.css | 492 ++ e107_themes/reline/theme.php | 364 + e107_themes/sebes/images/arrow.png | Bin 0 -> 206 bytes e107_themes/sebes/images/button.png | Bin 0 -> 202 bytes e107_themes/sebes/images/fcaption.png | Bin 0 -> 211 bytes e107_themes/sebes/images/forumheader.png | Bin 0 -> 220 bytes e107_themes/sebes/images/header.png | Bin 0 -> 264 bytes e107_themes/sebes/images/logo1.png | Bin 0 -> 6984 bytes e107_themes/sebes/images/logo1_template.png | Bin 0 -> 584 bytes e107_themes/sebes/images/logo2.png | Bin 0 -> 1120 bytes e107_themes/sebes/images/logo2_template.png | Bin 0 -> 253 bytes e107_themes/sebes/images/marrow.png | Bin 0 -> 212 bytes e107_themes/sebes/images/oarrow.png | Bin 0 -> 210 bytes e107_themes/sebes/images/search.png | Bin 0 -> 579 bytes e107_themes/sebes/images/selarrow.png | Bin 0 -> 208 bytes e107_themes/sebes/index.html | 0 e107_themes/sebes/languages/English.php | 26 + e107_themes/sebes/preview.jpg | Bin 0 -> 6255 bytes e107_themes/sebes/style.css | 275 + e107_themes/sebes/theme.php | 151 + e107_themes/templates/admin_template.php | 57 + e107_themes/templates/banner_template.php | 92 + e107_themes/templates/bbcode_template.php | 68 + e107_themes/templates/comment_template.php | 90 + e107_themes/templates/contact_template.php | 64 + e107_themes/templates/download_template.php | 350 + e107_themes/templates/email_template.php | 79 + e107_themes/templates/footer_default.php | 255 + e107_themes/templates/fpw_template.php | 70 + e107_themes/templates/header_default.php | 404 + e107_themes/templates/index.html | 0 e107_themes/templates/login_template.php | 46 + .../templates/membersonly_template.php | 43 + e107_themes/templates/online_template.php | 39 + e107_themes/templates/search_template.php | 111 + e107_themes/templates/signup_template.php | 313 + e107_themes/templates/sitedown_template.php | 43 + e107_themes/templates/trackback_template.php | 12 + e107_themes/templates/user_template.php | 203 + e107_themes/templates/userposts_template.php | 91 + .../templates/usersettings_template.php | 206 + e107_themes/vekna_blue/images/bg.gif | Bin 0 -> 59873 bytes e107_themes/vekna_blue/images/blank.gif | Bin 0 -> 807 bytes e107_themes/vekna_blue/images/bullet2.gif | Bin 0 -> 829 bytes e107_themes/vekna_blue/images/button.png | Bin 0 -> 199 bytes e107_themes/vekna_blue/images/cap.gif | Bin 0 -> 848 bytes e107_themes/vekna_blue/images/capleft.gif | Bin 0 -> 848 bytes e107_themes/vekna_blue/images/caption.png | Bin 0 -> 365 bytes e107_themes/vekna_blue/images/fcap.png | Bin 0 -> 219 bytes e107_themes/vekna_blue/images/line_bg.gif | Bin 0 -> 816 bytes e107_themes/vekna_blue/images/logo4.jpg | Bin 0 -> 19450 bytes e107_themes/vekna_blue/images/menu.png | Bin 0 -> 191 bytes e107_themes/vekna_blue/images/menu1.gif | Bin 0 -> 827 bytes e107_themes/vekna_blue/images/menubottom.png | Bin 0 -> 242 bytes e107_themes/vekna_blue/index.html | 0 e107_themes/vekna_blue/languages/English.php | 26 + e107_themes/vekna_blue/nav_menu.css | 110 + e107_themes/vekna_blue/preview.jpg | Bin 0 -> 7706 bytes e107_themes/vekna_blue/style.css | 292 + e107_themes/vekna_blue/theme.php | 188 + email.php | 230 + error.php | 72 + favicon.ico | Bin 0 -> 22486 bytes forum.php | 5 + forum_viewforum.php | 12 + forum_viewtopic.php | 12 + fpw.php | 173 + gsitemap.php | 79 + index.php | 100 + install_.php | 1935 +++++ links.php | 5 + login.php | 83 + membersonly.php | 41 + news.php | 576 ++ online.php | 282 + page.php | 423 + print.php | 102 + rate.php | 60 + request.php | 405 + robots.txt | 5 + search.php | 548 ++ signup.php | 921 +++ sitedown.php | 47 + subcontent.php | 28 + submitnews.php | 220 + top.php | 211 + upload.php | 176 + user.php | 200 + userposts.php | 272 + usersettings.php | 490 ++ 2196 files changed, 182987 insertions(+) create mode 100644 article.php create mode 100644 backend.php create mode 100644 banner.php create mode 100644 class2.php create mode 100644 comment.php create mode 100644 contact.php create mode 100644 content.php create mode 100644 download.php create mode 100644 e107.htaccess create mode 100644 e107_admin/ad_links.php create mode 100644 e107_admin/admin.php create mode 100644 e107_admin/admin_classis.php create mode 100644 e107_admin/admin_combo.php create mode 100644 e107_admin/admin_etalkers.php create mode 100644 e107_admin/admin_log.php create mode 100644 e107_admin/adminb.php create mode 100644 e107_admin/administrator.php create mode 100644 e107_admin/article.php create mode 100644 e107_admin/auth.php create mode 100644 e107_admin/banlist.php create mode 100644 e107_admin/banner.php create mode 100644 e107_admin/cache.php create mode 100644 e107_admin/cascade.php create mode 100644 e107_admin/categories.php create mode 100644 e107_admin/classis.php create mode 100644 e107_admin/combo.php create mode 100644 e107_admin/comment.php create mode 100644 e107_admin/compact.php create mode 100644 e107_admin/content.php create mode 100644 e107_admin/core_image.php create mode 100644 e107_admin/cpage.php create mode 100644 e107_admin/credits.php create mode 100644 e107_admin/db.php create mode 100644 e107_admin/db_verify.php create mode 100644 e107_admin/docs.php create mode 100644 e107_admin/download.php create mode 100644 e107_admin/e107_update.php create mode 100644 e107_admin/emoticon.php create mode 100644 e107_admin/fileinspector.php create mode 100644 e107_admin/filemanager.php create mode 100644 e107_admin/filetypes_.php create mode 100644 e107_admin/fla.php create mode 100644 e107_admin/footer.php create mode 100644 e107_admin/frontpage.php create mode 100644 e107_admin/header.php create mode 100644 e107_admin/image.php create mode 100644 e107_admin/includes/beginner.php create mode 100644 e107_admin/includes/cascade.php create mode 100644 e107_admin/includes/categories.php create mode 100644 e107_admin/includes/classis.php create mode 100644 e107_admin/includes/combo.php create mode 100644 e107_admin/includes/compact.php create mode 100644 e107_admin/index.php create mode 100644 e107_admin/lancheck.php create mode 100644 e107_admin/language.php create mode 100644 e107_admin/links.php create mode 100644 e107_admin/mailout.php create mode 100644 e107_admin/menus.php create mode 100644 e107_admin/message.php create mode 100644 e107_admin/meta.php create mode 100644 e107_admin/modcomment.php create mode 100644 e107_admin/newspost.php create mode 100644 e107_admin/notify.php create mode 100644 e107_admin/phpinfo.php create mode 100644 e107_admin/plugin.php create mode 100644 e107_admin/prefs.php create mode 100644 e107_admin/review.php create mode 100644 e107_admin/search.php create mode 100644 e107_admin/sql/core_pg.php create mode 100644 e107_admin/sql/core_sql.php create mode 100644 e107_admin/sql/db_update/index.html create mode 100644 e107_admin/sql/extended_country.php create mode 100644 e107_admin/theme.php create mode 100644 e107_admin/ugflag.php create mode 100644 e107_admin/update_routines.php create mode 100644 e107_admin/updateadmin.php create mode 100644 e107_admin/upload.php create mode 100644 e107_admin/userclass.php create mode 100644 e107_admin/userclass2.php create mode 100644 e107_admin/userinfo.php create mode 100644 e107_admin/users.php create mode 100755 e107_admin/users_extended.php create mode 100644 e107_admin/users_extended_predefined.php create mode 100644 e107_admin/ver.php create mode 100644 e107_admin/wmessage.php create mode 100644 e107_docs/README.html create mode 100644 e107_docs/README_UPGRADE.html create mode 100644 e107_docs/gpl.txt create mode 100644 e107_docs/help/English/Administrators create mode 100644 e107_docs/help/English/BBCode create mode 100644 e107_docs/help/English/Banlist create mode 100644 e107_docs/help/English/Banners create mode 100644 e107_docs/help/English/Cache create mode 100644 e107_docs/help/English/Chatbox create mode 100644 e107_docs/help/English/Classes create mode 100644 e107_docs/help/English/Downloads create mode 100644 e107_docs/help/English/Emoticons create mode 100644 e107_docs/help/English/Errors create mode 100644 e107_docs/help/English/Forums create mode 100644 e107_docs/help/English/Front_Page create mode 100644 e107_docs/help/English/Help! create mode 100644 e107_docs/help/English/Links create mode 100644 e107_docs/help/English/Maintainance create mode 100644 e107_docs/help/English/Menus create mode 100644 e107_docs/help/English/News create mode 100644 e107_docs/help/English/Preferences create mode 100644 e107_docs/help/English/Uploads create mode 100644 e107_docs/help/English/Users create mode 100644 e107_docs/help/English/Welcome_Message create mode 100644 e107_docs/index.html create mode 100644 e107_docs/style.css create mode 100644 e107_files/bbcode/b.bb create mode 100644 e107_files/bbcode/blockquote.bb create mode 100644 e107_files/bbcode/br.bb create mode 100644 e107_files/bbcode/center.bb create mode 100644 e107_files/bbcode/code.bb create mode 100644 e107_files/bbcode/color.bb create mode 100644 e107_files/bbcode/email.bb create mode 100644 e107_files/bbcode/file.bb create mode 100644 e107_files/bbcode/flash.bb create mode 100644 e107_files/bbcode/hide.bb create mode 100644 e107_files/bbcode/html.bb create mode 100644 e107_files/bbcode/i.bb create mode 100644 e107_files/bbcode/img.bb create mode 100644 e107_files/bbcode/index.html create mode 100644 e107_files/bbcode/justify.bb create mode 100644 e107_files/bbcode/left.bb create mode 100644 e107_files/bbcode/link.bb create mode 100644 e107_files/bbcode/list.bb create mode 100755 e107_files/bbcode/php.bb create mode 100644 e107_files/bbcode/quote.bb create mode 100644 e107_files/bbcode/right.bb create mode 100644 e107_files/bbcode/size.bb create mode 100755 e107_files/bbcode/spoiler.bb create mode 100755 e107_files/bbcode/stream.bb create mode 100644 e107_files/bbcode/textarea.bb create mode 100644 e107_files/bbcode/time.bb create mode 100644 e107_files/bbcode/u.bb create mode 100644 e107_files/bbcode/url.bb create mode 100644 e107_files/cache/index.html create mode 100644 e107_files/cache/user_extended.xml create mode 100644 e107_files/def_e107_prefs.php create mode 100644 e107_files/downloadimages/index.html create mode 100644 e107_files/downloadimages/null.txt create mode 100644 e107_files/downloads/index.html create mode 100644 e107_files/downloads/null.txt create mode 100644 e107_files/downloadthumbs/index.html create mode 100644 e107_files/downloadthumbs/null.txt create mode 100644 e107_files/e107.css create mode 100644 e107_files/e107.js create mode 100644 e107_files/e_ajax.js create mode 100644 e107_files/images/index.html create mode 100644 e107_files/images/null.txt create mode 100644 e107_files/import/import_mapper.php create mode 100644 e107_files/import/import_readme.txt create mode 100644 e107_files/import/index.html create mode 100644 e107_files/import/mambo.php create mode 100644 e107_files/import/phpbb2.php create mode 100644 e107_files/import/phpnuke.php create mode 100644 e107_files/index.html create mode 100644 e107_files/misc/index.html create mode 100644 e107_files/misc/null.txt create mode 100644 e107_files/nav_menu.css create mode 100644 e107_files/nav_menu.js create mode 100644 e107_files/nav_menu_alt.js create mode 100644 e107_files/popup.js create mode 100644 e107_files/public/avatars/index.html create mode 100644 e107_files/public/index.html create mode 100644 e107_files/resetcore.php create mode 100644 e107_files/resetcore/index.html create mode 100644 e107_files/resetcore/resetcore.php create mode 100644 e107_files/resetcore/style.css create mode 100644 e107_files/shortcode/admin_alt_nav.sc create mode 100644 e107_files/shortcode/admin_credits.sc create mode 100644 e107_files/shortcode/admin_docs.sc create mode 100644 e107_files/shortcode/admin_help.sc create mode 100644 e107_files/shortcode/admin_icon.sc create mode 100644 e107_files/shortcode/admin_lang.sc create mode 100644 e107_files/shortcode/admin_latest.sc create mode 100644 e107_files/shortcode/admin_log.sc create mode 100644 e107_files/shortcode/admin_logged.sc create mode 100644 e107_files/shortcode/admin_logo.sc create mode 100644 e107_files/shortcode/admin_menu.sc create mode 100644 e107_files/shortcode/admin_msg.sc create mode 100644 e107_files/shortcode/admin_nav.sc create mode 100644 e107_files/shortcode/admin_plugins.sc create mode 100644 e107_files/shortcode/admin_preset.sc create mode 100644 e107_files/shortcode/admin_pword.sc create mode 100644 e107_files/shortcode/admin_sel_lan.sc create mode 100644 e107_files/shortcode/admin_siteinfo.sc create mode 100644 e107_files/shortcode/admin_status.sc create mode 100644 e107_files/shortcode/admin_userlan.sc create mode 100644 e107_files/shortcode/banner.sc create mode 100644 e107_files/shortcode/batch/bbcode_shortcodes.php create mode 100644 e107_files/shortcode/batch/comment_shortcodes.php create mode 100644 e107_files/shortcode/batch/contact_shortcodes.php create mode 100644 e107_files/shortcode/batch/download_shortcodes.php create mode 100644 e107_files/shortcode/batch/index.html create mode 100644 e107_files/shortcode/batch/news_archives.php create mode 100644 e107_files/shortcode/batch/news_shortcodes.php create mode 100755 e107_files/shortcode/batch/signup_shortcodes.php create mode 100644 e107_files/shortcode/batch/sitedown_shortcodes.php create mode 100644 e107_files/shortcode/batch/user_shortcodes.php create mode 100755 e107_files/shortcode/batch/usersettings_shortcodes.php create mode 100755 e107_files/shortcode/breadcrumb.sc create mode 100644 e107_files/shortcode/custom.sc create mode 100644 e107_files/shortcode/e_image.sc create mode 100644 e107_files/shortcode/email.sc create mode 100644 e107_files/shortcode/email_item.sc create mode 100644 e107_files/shortcode/emailto.sc create mode 100755 e107_files/shortcode/extended.sc create mode 100644 e107_files/shortcode/extended_icon.sc create mode 100644 e107_files/shortcode/extended_text.sc create mode 100644 e107_files/shortcode/extended_value.sc create mode 100644 e107_files/shortcode/imageselector.sc create mode 100644 e107_files/shortcode/index.html create mode 100644 e107_files/shortcode/languagelinks.sc create mode 100644 e107_files/shortcode/linkstyle.sc create mode 100644 e107_files/shortcode/logo.sc create mode 100644 e107_files/shortcode/menu.sc create mode 100644 e107_files/shortcode/news_alt.sc create mode 100644 e107_files/shortcode/news_categories.sc create mode 100644 e107_files/shortcode/news_category.sc create mode 100644 e107_files/shortcode/newsfile.sc create mode 100644 e107_files/shortcode/newsimage.sc create mode 100644 e107_files/shortcode/nextprev.sc create mode 100644 e107_files/shortcode/picture.sc create mode 100644 e107_files/shortcode/plugin.sc create mode 100644 e107_files/shortcode/print_item.sc create mode 100644 e107_files/shortcode/profile.sc create mode 100644 e107_files/shortcode/search.sc create mode 100644 e107_files/shortcode/setstyle.sc create mode 100644 e107_files/shortcode/sitecontactinfo.sc create mode 100644 e107_files/shortcode/sitedescription.sc create mode 100644 e107_files/shortcode/sitedisclaimer.sc create mode 100644 e107_files/shortcode/sitelinks.sc create mode 100644 e107_files/shortcode/sitelinks_alt.sc create mode 100644 e107_files/shortcode/sitename.sc create mode 100644 e107_files/shortcode/sitetag.sc create mode 100644 e107_files/shortcode/stylesheet.sc create mode 100644 e107_files/shortcode/uploadfile.sc create mode 100644 e107_files/shortcode/user_avatar.sc create mode 100644 e107_files/shortcode/user_extended.sc create mode 100644 e107_files/shortcode/wmessage.sc create mode 100644 e107_files/sleight_img.gif create mode 100644 e107_files/sleight_js.php create mode 100644 e107_files/thumb.php create mode 100644 e107_files/user.js create mode 100644 e107_handlers/admin_handler.php create mode 100644 e107_handlers/admin_log_class.php create mode 100644 e107_handlers/arraystorage_class.php create mode 100644 e107_handlers/avatar_handler.php create mode 100644 e107_handlers/bbcode_handler.php create mode 100644 e107_handlers/cache_handler.php create mode 100755 e107_handlers/calendar/cal.gif create mode 100755 e107_handlers/calendar/calendar-setup.js create mode 100755 e107_handlers/calendar/calendar-setup_stripped.js create mode 100755 e107_handlers/calendar/calendar.css create mode 100755 e107_handlers/calendar/calendar.js create mode 100755 e107_handlers/calendar/calendar_class.php create mode 100755 e107_handlers/calendar/calendar_stripped.js create mode 100644 e107_handlers/calendar/index.html create mode 100755 e107_handlers/calendar/language/English.js create mode 100755 e107_handlers/calendar/menuarrow.gif create mode 100755 e107_handlers/calendar/menuarrow2.gif create mode 100755 e107_handlers/calendar/sample.php create mode 100644 e107_handlers/comment_class.php create mode 100644 e107_handlers/date_handler.php create mode 100644 e107_handlers/db_debug_class.php create mode 100644 e107_handlers/debug_handler.php create mode 100644 e107_handlers/e107_Compat_handler.php create mode 100644 e107_handlers/e107_class.php create mode 100644 e107_handlers/e_parse_class.php create mode 100644 e107_handlers/emailprint_class.php create mode 100644 e107_handlers/emote.php create mode 100644 e107_handlers/emote_filter.php create mode 100644 e107_handlers/encrypt_handler.php create mode 100644 e107_handlers/equery_secure.php create mode 100644 e107_handlers/event_class.php create mode 100644 e107_handlers/file_class.php create mode 100644 e107_handlers/form_handler.php create mode 100644 e107_handlers/forum.php create mode 100644 e107_handlers/forum_include.php create mode 100644 e107_handlers/forum_mod.php create mode 100644 e107_handlers/index.html create mode 100644 e107_handlers/input_class.php create mode 100644 e107_handlers/language_class.php create mode 100644 e107_handlers/level_handler.php create mode 100644 e107_handlers/login.php create mode 100644 e107_handlers/magpie_rss.php create mode 100644 e107_handlers/mail.php create mode 100644 e107_handlers/mail_validation_class.php create mode 100644 e107_handlers/message_handler.php create mode 100644 e107_handlers/mysql_class.php create mode 100644 e107_handlers/news_class.php create mode 100644 e107_handlers/notify_class.php create mode 100644 e107_handlers/np_class.php create mode 100644 e107_handlers/override_class.php create mode 100644 e107_handlers/parser_functions.php create mode 100644 e107_handlers/parser_handler.php create mode 100644 e107_handlers/pclerror.lib.php create mode 100644 e107_handlers/pcltar.lib.php create mode 100644 e107_handlers/pcltrace.lib.php create mode 100644 e107_handlers/pclzip.lib.php create mode 100644 e107_handlers/php_compatibility_handler.php create mode 100644 e107_handlers/phpmailer/class.phpmailer.php create mode 100644 e107_handlers/phpmailer/class.pop3.php create mode 100644 e107_handlers/phpmailer/class.smtp.php create mode 100644 e107_handlers/phpmailer/e107.htaccess create mode 100644 e107_handlers/phpmailer/language/phpmailer.lang-en.php create mode 100644 e107_handlers/phpmailer/mailout_process.php create mode 100644 e107_handlers/plugin_class.php create mode 100644 e107_handlers/pop3_class.php create mode 100644 e107_handlers/popup_handler.php create mode 100644 e107_handlers/pref_class.php create mode 100644 e107_handlers/preset_class.php create mode 100644 e107_handlers/profanity_filter.php create mode 100644 e107_handlers/rate_class.php create mode 100644 e107_handlers/ren_help.php create mode 100644 e107_handlers/resize_handler.php create mode 100644 e107_handlers/search/advanced_comment.php create mode 100644 e107_handlers/search/advanced_download.php create mode 100644 e107_handlers/search/advanced_news.php create mode 100644 e107_handlers/search/advanced_pages.php create mode 100644 e107_handlers/search/advanced_user.php create mode 100644 e107_handlers/search/comments_download.php create mode 100644 e107_handlers/search/comments_news.php create mode 100644 e107_handlers/search/comments_page.php create mode 100644 e107_handlers/search/comments_user.php create mode 100644 e107_handlers/search/index.html create mode 100644 e107_handlers/search/search_comment.php create mode 100644 e107_handlers/search/search_download.php create mode 100644 e107_handlers/search/search_event.php create mode 100644 e107_handlers/search/search_news.php create mode 100644 e107_handlers/search/search_pages.php create mode 100644 e107_handlers/search/search_user.php create mode 100644 e107_handlers/search_class.php create mode 100644 e107_handlers/secure_img_handler.php create mode 100644 e107_handlers/secure_img_render.php create mode 100644 e107_handlers/session_handler.php create mode 100644 e107_handlers/shortcode_handler.php create mode 100644 e107_handlers/sitelinks_class.php create mode 100644 e107_handlers/smtp.php create mode 100644 e107_handlers/theme_handler.php create mode 100644 e107_handlers/tiny_mce/blank.htm create mode 100644 e107_handlers/tiny_mce/filelist.php create mode 100644 e107_handlers/tiny_mce/index.html create mode 100644 e107_handlers/tiny_mce/langs/en.js create mode 100644 e107_handlers/tiny_mce/plugins/contextmenu/contextmenu.css create mode 100644 e107_handlers/tiny_mce/plugins/contextmenu/css/contextmenu.css create mode 100644 e107_handlers/tiny_mce/plugins/contextmenu/editor_plugin.js create mode 100644 e107_handlers/tiny_mce/plugins/contextmenu/editor_plugin_src.js create mode 100644 e107_handlers/tiny_mce/plugins/contextmenu/images/spacer.gif create mode 100644 e107_handlers/tiny_mce/plugins/emoticons/editor_plugin.js create mode 100644 e107_handlers/tiny_mce/plugins/emoticons/emoticons.php create mode 100644 e107_handlers/tiny_mce/plugins/emoticons/images/emoticons.png create mode 100644 e107_handlers/tiny_mce/plugins/emoticons/index.html create mode 100644 e107_handlers/tiny_mce/plugins/emoticons/langs/en.js create mode 100644 e107_handlers/tiny_mce/plugins/ibrowser/config.php create mode 100644 e107_handlers/tiny_mce/plugins/ibrowser/editor_plugin.js create mode 100644 e107_handlers/tiny_mce/plugins/ibrowser/ibrowser.php create mode 100644 e107_handlers/tiny_mce/plugins/ibrowser/images/constrain.gif create mode 100644 e107_handlers/tiny_mce/plugins/ibrowser/images/ibrowser.gif create mode 100644 e107_handlers/tiny_mce/plugins/ibrowser/images/textflow.gif create mode 100644 e107_handlers/tiny_mce/plugins/ibrowser/langs/en.js create mode 100644 e107_handlers/tiny_mce/plugins/iespell/editor_plugin.js create mode 100644 e107_handlers/tiny_mce/plugins/iespell/editor_plugin_src.js create mode 100644 e107_handlers/tiny_mce/plugins/iespell/images/iespell.gif create mode 100644 e107_handlers/tiny_mce/plugins/iespell/langs/en.js create mode 100644 e107_handlers/tiny_mce/plugins/media/css/content.css create mode 100644 e107_handlers/tiny_mce/plugins/media/css/media.css create mode 100644 e107_handlers/tiny_mce/plugins/media/editor_plugin.js create mode 100644 e107_handlers/tiny_mce/plugins/media/editor_plugin_src.js create mode 100644 e107_handlers/tiny_mce/plugins/media/images/flash.gif create mode 100644 e107_handlers/tiny_mce/plugins/media/images/media.gif create mode 100644 e107_handlers/tiny_mce/plugins/media/images/quicktime.gif create mode 100644 e107_handlers/tiny_mce/plugins/media/images/realmedia.gif create mode 100644 e107_handlers/tiny_mce/plugins/media/images/shockwave.gif create mode 100644 e107_handlers/tiny_mce/plugins/media/images/windowsmedia.gif create mode 100644 e107_handlers/tiny_mce/plugins/media/jscripts/embed.js create mode 100644 e107_handlers/tiny_mce/plugins/media/jscripts/media.js create mode 100644 e107_handlers/tiny_mce/plugins/media/langs/en.js create mode 100644 e107_handlers/tiny_mce/plugins/media/media.htm create mode 100644 e107_handlers/tiny_mce/plugins/table/cell.htm create mode 100644 e107_handlers/tiny_mce/plugins/table/css/cell.css create mode 100644 e107_handlers/tiny_mce/plugins/table/css/row.css create mode 100644 e107_handlers/tiny_mce/plugins/table/css/table.css create mode 100644 e107_handlers/tiny_mce/plugins/table/editor_plugin.js create mode 100644 e107_handlers/tiny_mce/plugins/table/editor_plugin_src.js create mode 100644 e107_handlers/tiny_mce/plugins/table/images/buttons.gif create mode 100644 e107_handlers/tiny_mce/plugins/table/images/table.gif create mode 100644 e107_handlers/tiny_mce/plugins/table/images/table_cell_props.gif create mode 100644 e107_handlers/tiny_mce/plugins/table/images/table_delete.gif create mode 100644 e107_handlers/tiny_mce/plugins/table/images/table_delete_col.gif create mode 100644 e107_handlers/tiny_mce/plugins/table/images/table_delete_row.gif create mode 100644 e107_handlers/tiny_mce/plugins/table/images/table_insert_col_after.gif create mode 100644 e107_handlers/tiny_mce/plugins/table/images/table_insert_col_before.gif create mode 100644 e107_handlers/tiny_mce/plugins/table/images/table_insert_row_after.gif create mode 100644 e107_handlers/tiny_mce/plugins/table/images/table_insert_row_before.gif create mode 100644 e107_handlers/tiny_mce/plugins/table/images/table_merge_cells.gif create mode 100644 e107_handlers/tiny_mce/plugins/table/images/table_row_props.gif create mode 100644 e107_handlers/tiny_mce/plugins/table/images/table_split_cells.gif create mode 100644 e107_handlers/tiny_mce/plugins/table/jscripts/cell.js create mode 100644 e107_handlers/tiny_mce/plugins/table/jscripts/merge_cells.js create mode 100644 e107_handlers/tiny_mce/plugins/table/jscripts/row.js create mode 100644 e107_handlers/tiny_mce/plugins/table/jscripts/table.js create mode 100644 e107_handlers/tiny_mce/plugins/table/langs/en.js create mode 100644 e107_handlers/tiny_mce/plugins/table/merge_cells.htm create mode 100644 e107_handlers/tiny_mce/plugins/table/row.htm create mode 100644 e107_handlers/tiny_mce/plugins/table/table.htm create mode 100644 e107_handlers/tiny_mce/plugins/zoom/editor_plugin.js create mode 100644 e107_handlers/tiny_mce/plugins/zoom/editor_plugin_src.js create mode 100644 e107_handlers/tiny_mce/themes/advanced/about.htm create mode 100644 e107_handlers/tiny_mce/themes/advanced/anchor.htm create mode 100644 e107_handlers/tiny_mce/themes/advanced/charmap.htm create mode 100644 e107_handlers/tiny_mce/themes/advanced/color_picker.htm create mode 100644 e107_handlers/tiny_mce/themes/advanced/css/editor_content.css create mode 100644 e107_handlers/tiny_mce/themes/advanced/css/editor_popup.css create mode 100644 e107_handlers/tiny_mce/themes/advanced/css/editor_ui.css create mode 100644 e107_handlers/tiny_mce/themes/advanced/editor_content.css create mode 100644 e107_handlers/tiny_mce/themes/advanced/editor_popup.css create mode 100644 e107_handlers/tiny_mce/themes/advanced/editor_template.js create mode 100644 e107_handlers/tiny_mce/themes/advanced/editor_template_src.js create mode 100644 e107_handlers/tiny_mce/themes/advanced/editor_ui.css create mode 100644 e107_handlers/tiny_mce/themes/advanced/image.htm create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/anchor.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/anchor_symbol.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/backcolor.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/bold.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/bold_de_se.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/bold_es.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/bold_fr.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/bold_ru.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/browse.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/bullist.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/button_menu.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/buttons.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/cancel_button_bg.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/center.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/charmap.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/cleanup.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/close.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/code.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/color.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/copy.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/custom_1.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/cut.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/ecode.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/forecolor.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/full.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/help.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/hr.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/image.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/indent.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/insert_button_bg.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/italic.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/italic_de_se.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/italic_es.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/italic_ru.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/justifycenter.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/justifyfull.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/justifyleft.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/justifyright.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/left.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/link.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/menu_check.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/newdocument.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/numlist.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/opacity.png create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/outdent.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/paste.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/quote.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/redo.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/removeformat.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/right.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/separator.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/spacer.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/statusbar_resize.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/strikethrough.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/sub.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/sup.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/table.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/table_delete_col.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/table_delete_row.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/table_insert_col_after.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/table_insert_col_before.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/table_insert_row_after.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/table_insert_row_before.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/underline.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/underline_es.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/underline_fr.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/underline_ru.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/undo.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/unlink.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/visualaid.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/xp/tab_bg.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/xp/tab_end.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/xp/tab_sel_bg.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/xp/tab_sel_end.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/images/xp/tabs_bg.gif create mode 100644 e107_handlers/tiny_mce/themes/advanced/jscripts/about.js create mode 100644 e107_handlers/tiny_mce/themes/advanced/jscripts/anchor.js create mode 100644 e107_handlers/tiny_mce/themes/advanced/jscripts/charmap.js create mode 100644 e107_handlers/tiny_mce/themes/advanced/jscripts/color_picker.js create mode 100644 e107_handlers/tiny_mce/themes/advanced/jscripts/image.js create mode 100644 e107_handlers/tiny_mce/themes/advanced/jscripts/link.js create mode 100644 e107_handlers/tiny_mce/themes/advanced/jscripts/source_editor.js create mode 100644 e107_handlers/tiny_mce/themes/advanced/langs/en.js create mode 100644 e107_handlers/tiny_mce/themes/advanced/link.htm create mode 100644 e107_handlers/tiny_mce/themes/advanced/source_editor.htm create mode 100644 e107_handlers/tiny_mce/tiny_mce.js create mode 100644 e107_handlers/tiny_mce/tiny_mce_gzip.php create mode 100644 e107_handlers/tiny_mce/tiny_mce_popup.js create mode 100644 e107_handlers/tiny_mce/tiny_mce_src.js create mode 100644 e107_handlers/tiny_mce/utils/editable_selects.js create mode 100644 e107_handlers/tiny_mce/utils/form_utils.js create mode 100644 e107_handlers/tiny_mce/utils/mclayer.js create mode 100644 e107_handlers/tiny_mce/utils/mctabs.js create mode 100644 e107_handlers/tiny_mce/utils/validate.js create mode 100644 e107_handlers/tiny_mce/wysiwyg.php create mode 100644 e107_handlers/traffic_class.php create mode 100644 e107_handlers/traffic_class_display.php create mode 100644 e107_handlers/upload_handler.php create mode 100755 e107_handlers/user_extended_class.php create mode 100644 e107_handlers/user_func.php create mode 100644 e107_handlers/user_select_class.php create mode 100644 e107_handlers/userclass_class.php create mode 100644 e107_handlers/usersession_class.php create mode 100644 e107_handlers/xml_class.php create mode 100644 e107_images/admin_images/adminlogs_16.png create mode 100644 e107_images/admin_images/adminlogs_32.png create mode 100644 e107_images/admin_images/adminpass_16.png create mode 100644 e107_images/admin_images/adminpass_32.png create mode 100644 e107_images/admin_images/admins_16.png create mode 100644 e107_images/admin_images/admins_32.png create mode 100644 e107_images/admin_images/arrow_16.png create mode 100644 e107_images/admin_images/arrow_32.png create mode 100644 e107_images/admin_images/arrow_over_16.png create mode 100644 e107_images/admin_images/arrow_over_32.png create mode 100644 e107_images/admin_images/articles_16.png create mode 100644 e107_images/admin_images/articles_32.png create mode 100644 e107_images/admin_images/banlist_16.png create mode 100644 e107_images/admin_images/banlist_32.png create mode 100644 e107_images/admin_images/banners_16.png create mode 100644 e107_images/admin_images/banners_32.png create mode 100644 e107_images/admin_images/blocked.png create mode 100644 e107_images/admin_images/cache_16.png create mode 100644 e107_images/admin_images/cache_32.png create mode 100644 e107_images/admin_images/cat_content_16.png create mode 100644 e107_images/admin_images/cat_content_32.png create mode 100644 e107_images/admin_images/cat_files_16.png create mode 100644 e107_images/admin_images/cat_files_32.png create mode 100644 e107_images/admin_images/cat_plugins_16.png create mode 100644 e107_images/admin_images/cat_plugins_32.png create mode 100644 e107_images/admin_images/cat_settings_16.png create mode 100644 e107_images/admin_images/cat_settings_32.png create mode 100644 e107_images/admin_images/cat_tools_16.png create mode 100644 e107_images/admin_images/cat_tools_32.png create mode 100644 e107_images/admin_images/cat_users_16.png create mode 100644 e107_images/admin_images/cat_users_32.png create mode 100644 e107_images/admin_images/chatbox_16.png create mode 100644 e107_images/admin_images/chatbox_32.png create mode 100644 e107_images/admin_images/comments_16.png create mode 100644 e107_images/admin_images/comments_32.png create mode 100644 e107_images/admin_images/content_16.png create mode 100644 e107_images/admin_images/content_32.png create mode 100644 e107_images/admin_images/credits_16.png create mode 100644 e107_images/admin_images/credits_32.png create mode 100644 e107_images/admin_images/custom_16.png create mode 100644 e107_images/admin_images/custom_32.png create mode 100644 e107_images/admin_images/database_16.png create mode 100644 e107_images/admin_images/database_32.png create mode 100644 e107_images/admin_images/delete_16.png create mode 100644 e107_images/admin_images/delete_32.png create mode 100644 e107_images/admin_images/docs_16.png create mode 100644 e107_images/admin_images/docs_32.png create mode 100644 e107_images/admin_images/down.png create mode 100644 e107_images/admin_images/downloads_16.png create mode 100644 e107_images/admin_images/downloads_32.png create mode 100644 e107_images/admin_images/edit_16.png create mode 100644 e107_images/admin_images/edit_32.png create mode 100644 e107_images/admin_images/emoticons_16.png create mode 100644 e107_images/admin_images/emoticons_32.png create mode 100644 e107_images/admin_images/extended_16.png create mode 100644 e107_images/admin_images/extended_32.png create mode 100644 e107_images/admin_images/failedlogin_16.png create mode 100644 e107_images/admin_images/fileinspector_16.png create mode 100644 e107_images/admin_images/fileinspector_32.png create mode 100644 e107_images/admin_images/filemanager_16.png create mode 100644 e107_images/admin_images/filemanager_32.png create mode 100644 e107_images/admin_images/forums_16.png create mode 100644 e107_images/admin_images/forums_32.png create mode 100644 e107_images/admin_images/frontpage_16.png create mode 100644 e107_images/admin_images/frontpage_32.png create mode 100644 e107_images/admin_images/images_16.png create mode 100644 e107_images/admin_images/images_32.png create mode 100644 e107_images/admin_images/installed.png create mode 100644 e107_images/admin_images/language_16.png create mode 100644 e107_images/admin_images/language_32.png create mode 100644 e107_images/admin_images/leave_16.png create mode 100644 e107_images/admin_images/leave_32.png create mode 100644 e107_images/admin_images/links_16.png create mode 100644 e107_images/admin_images/links_32.png create mode 100644 e107_images/admin_images/logout_16.png create mode 100644 e107_images/admin_images/logout_32.png create mode 100644 e107_images/admin_images/mail_16.png create mode 100644 e107_images/admin_images/mail_32.png create mode 100644 e107_images/admin_images/main_16.png create mode 100644 e107_images/admin_images/main_32.png create mode 100644 e107_images/admin_images/maintain_16.png create mode 100644 e107_images/admin_images/maintain_32.png create mode 100644 e107_images/admin_images/menus_16.png create mode 100644 e107_images/admin_images/menus_32.png create mode 100644 e107_images/admin_images/meta_16.png create mode 100644 e107_images/admin_images/meta_32.png create mode 100644 e107_images/admin_images/news_16.png create mode 100644 e107_images/admin_images/news_32.png create mode 100644 e107_images/admin_images/newsfeeds_16.png create mode 100644 e107_images/admin_images/newsfeeds_32.png create mode 100644 e107_images/admin_images/noinstall.png create mode 100644 e107_images/admin_images/nopreview.png create mode 100644 e107_images/admin_images/notify_16.png create mode 100644 e107_images/admin_images/notify_32.png create mode 100644 e107_images/admin_images/phpinfo_16.png create mode 100644 e107_images/admin_images/phpinfo_32.png create mode 100644 e107_images/admin_images/plugins_16.png create mode 100644 e107_images/admin_images/plugins_32.png create mode 100644 e107_images/admin_images/plugmanager_16.png create mode 100644 e107_images/admin_images/plugmanager_32.png create mode 100644 e107_images/admin_images/polls_16.png create mode 100644 e107_images/admin_images/polls_32.png create mode 100644 e107_images/admin_images/prefs_16.png create mode 100644 e107_images/admin_images/prefs_32.png create mode 100644 e107_images/admin_images/reviews_16.png create mode 100644 e107_images/admin_images/reviews_32.png create mode 100644 e107_images/admin_images/search_16.png create mode 100644 e107_images/admin_images/search_32.png create mode 100644 e107_images/admin_images/stats_16.png create mode 100644 e107_images/admin_images/stats_32.png create mode 100644 e107_images/admin_images/sub_forums_16.png create mode 100644 e107_images/admin_images/sublink.png create mode 100644 e107_images/admin_images/sublink_16.png create mode 100644 e107_images/admin_images/themes_16.png create mode 100644 e107_images/admin_images/themes_32.png create mode 100644 e107_images/admin_images/uninstalled.png create mode 100644 e107_images/admin_images/up.png create mode 100644 e107_images/admin_images/upgrade.png create mode 100644 e107_images/admin_images/uploads_16.png create mode 100644 e107_images/admin_images/uploads_32.png create mode 100644 e107_images/admin_images/userclass_16.png create mode 100644 e107_images/admin_images/userclass_32.png create mode 100644 e107_images/admin_images/users_16.png create mode 100644 e107_images/admin_images/users_32.png create mode 100644 e107_images/admin_images/welcome_16.png create mode 100644 e107_images/admin_images/welcome_32.png create mode 100644 e107_images/adminlogo.png create mode 100644 e107_images/advanced.png create mode 100644 e107_images/avatars/avatar_1.png create mode 100644 e107_images/avatars/index.html create mode 100644 e107_images/banners/banner1.png create mode 100644 e107_images/banners/banner2.png create mode 100644 e107_images/banners/banner3.png create mode 100644 e107_images/button.png create mode 100644 e107_images/custom/index.html create mode 100644 e107_images/e107_icon_16.png create mode 100644 e107_images/e107_icon_32.png create mode 100644 e107_images/emotes/default/alien.png create mode 100644 e107_images/emotes/default/amazed.png create mode 100644 e107_images/emotes/default/angry.png create mode 100644 e107_images/emotes/default/biglaugh.png create mode 100644 e107_images/emotes/default/cheesey.png create mode 100644 e107_images/emotes/default/confused.png create mode 100644 e107_images/emotes/default/cry.png create mode 100644 e107_images/emotes/default/dead.png create mode 100644 e107_images/emotes/default/dodge.png create mode 100644 e107_images/emotes/default/frown.png create mode 100644 e107_images/emotes/default/gah.png create mode 100644 e107_images/emotes/default/grin.png create mode 100644 e107_images/emotes/default/heart.png create mode 100644 e107_images/emotes/default/idea.png create mode 100644 e107_images/emotes/default/ill.png create mode 100644 e107_images/emotes/default/mad.png create mode 100644 e107_images/emotes/default/mistrust.png create mode 100644 e107_images/emotes/default/neutral.png create mode 100644 e107_images/emotes/default/question.png create mode 100644 e107_images/emotes/default/rolleyes.png create mode 100644 e107_images/emotes/default/sad.png create mode 100644 e107_images/emotes/default/shades.png create mode 100644 e107_images/emotes/default/shy.png create mode 100644 e107_images/emotes/default/smile.png create mode 100644 e107_images/emotes/default/special.png create mode 100644 e107_images/emotes/default/suprised.png create mode 100644 e107_images/emotes/default/tongue.png create mode 100644 e107_images/emotes/default/wink.png create mode 100644 e107_images/fileinspector/blank.png create mode 100644 e107_images/fileinspector/close.png create mode 100644 e107_images/fileinspector/contract.png create mode 100644 e107_images/fileinspector/expand.png create mode 100644 e107_images/fileinspector/file.png create mode 100644 e107_images/fileinspector/file_check.png create mode 100644 e107_images/fileinspector/file_core.png create mode 100644 e107_images/fileinspector/file_fail.png create mode 100644 e107_images/fileinspector/file_missing.png create mode 100644 e107_images/fileinspector/file_old.png create mode 100644 e107_images/fileinspector/file_uncalc.png create mode 100644 e107_images/fileinspector/file_unknown.png create mode 100644 e107_images/fileinspector/file_warning.png create mode 100644 e107_images/fileinspector/fileinspector.png create mode 100644 e107_images/fileinspector/folder.png create mode 100644 e107_images/fileinspector/folder_check.png create mode 100644 e107_images/fileinspector/folder_core.png create mode 100644 e107_images/fileinspector/folder_fail.png create mode 100644 e107_images/fileinspector/folder_missing.png create mode 100644 e107_images/fileinspector/folder_old.png create mode 100644 e107_images/fileinspector/folder_old_dir.png create mode 100644 e107_images/fileinspector/folder_root.png create mode 100644 e107_images/fileinspector/folder_unknown.png create mode 100644 e107_images/fileinspector/folder_up.png create mode 100644 e107_images/fileinspector/folder_warning.png create mode 100644 e107_images/fileinspector/forward.png create mode 100644 e107_images/fileinspector/info.png create mode 100644 e107_images/fileinspector/integrity_fail.png create mode 100644 e107_images/fileinspector/integrity_pass.png create mode 100644 e107_images/fileinspector/warning.png create mode 100644 e107_images/filemanager/css.png create mode 100644 e107_images/filemanager/def.png create mode 100644 e107_images/filemanager/default.png create mode 100644 e107_images/filemanager/del.png create mode 100644 e107_images/filemanager/exe.png create mode 100644 e107_images/filemanager/folder.png create mode 100644 e107_images/filemanager/gif.png create mode 100644 e107_images/filemanager/home.png create mode 100644 e107_images/filemanager/htm.png create mode 100644 e107_images/filemanager/jpg.png create mode 100644 e107_images/filemanager/js.png create mode 100644 e107_images/filemanager/link.png create mode 100644 e107_images/filemanager/mp3.png create mode 100644 e107_images/filemanager/pdf.png create mode 100644 e107_images/filemanager/php.png create mode 100644 e107_images/filemanager/png.png create mode 100644 e107_images/filemanager/txt.png create mode 100644 e107_images/filemanager/updir.png create mode 100644 e107_images/filemanager/xml.png create mode 100644 e107_images/filemanager/zip.png create mode 100644 e107_images/generic/bar.png create mode 100644 e107_images/generic/bbcode/blockquote.png create mode 100644 e107_images/generic/bbcode/bold.png create mode 100644 e107_images/generic/bbcode/center.png create mode 100644 e107_images/generic/bbcode/code.png create mode 100644 e107_images/generic/bbcode/emotes.png create mode 100644 e107_images/generic/bbcode/flash.png create mode 100644 e107_images/generic/bbcode/fontcol.png create mode 100644 e107_images/generic/bbcode/fontsize.png create mode 100644 e107_images/generic/bbcode/image.png create mode 100644 e107_images/generic/bbcode/italic.png create mode 100644 e107_images/generic/bbcode/left.png create mode 100644 e107_images/generic/bbcode/link.png create mode 100644 e107_images/generic/bbcode/list.png create mode 100644 e107_images/generic/bbcode/newpage.png create mode 100644 e107_images/generic/bbcode/prefile.png create mode 100644 e107_images/generic/bbcode/preimage.png create mode 100644 e107_images/generic/bbcode/right.png create mode 100644 e107_images/generic/bbcode/shortcode.png create mode 100644 e107_images/generic/bbcode/template.png create mode 100644 e107_images/generic/bbcode/underline.png create mode 100644 e107_images/generic/blank.gif create mode 100644 e107_images/generic/code_bg.gif create mode 100644 e107_images/generic/code_bg.jpg create mode 100644 e107_images/generic/code_bg.png create mode 100644 e107_images/generic/cred.png create mode 100644 e107_images/generic/dark/answer.png create mode 100644 e107_images/generic/dark/arrow.png create mode 100644 e107_images/generic/dark/download.png create mode 100644 e107_images/generic/dark/edit.png create mode 100644 e107_images/generic/dark/email.png create mode 100644 e107_images/generic/dark/file.png create mode 100644 e107_images/generic/dark/image.png create mode 100644 e107_images/generic/dark/new.png create mode 100644 e107_images/generic/dark/new_comments.png create mode 100644 e107_images/generic/dark/newsedit.png create mode 100644 e107_images/generic/dark/nonew_comments.png create mode 100644 e107_images/generic/dark/password.png create mode 100644 e107_images/generic/dark/printer.png create mode 100644 e107_images/generic/dark/question.png create mode 100644 e107_images/generic/dark/search_advanced.png create mode 100644 e107_images/generic/dark/search_basic.png create mode 100644 e107_images/generic/dark/search_enhanced.png create mode 100644 e107_images/generic/dark/sticky.png create mode 100644 e107_images/generic/dark/user_select.png create mode 100644 e107_images/generic/lite/answer.png create mode 100644 e107_images/generic/lite/arrow.png create mode 100644 e107_images/generic/lite/download.png create mode 100644 e107_images/generic/lite/edit.png create mode 100644 e107_images/generic/lite/email.png create mode 100644 e107_images/generic/lite/file.png create mode 100644 e107_images/generic/lite/image.png create mode 100644 e107_images/generic/lite/new.png create mode 100644 e107_images/generic/lite/new_comments.png create mode 100644 e107_images/generic/lite/newsedit.png create mode 100644 e107_images/generic/lite/nonew_comments.png create mode 100644 e107_images/generic/lite/password.png create mode 100644 e107_images/generic/lite/printer.png create mode 100644 e107_images/generic/lite/question.png create mode 100644 e107_images/generic/lite/search_advanced.png create mode 100644 e107_images/generic/lite/search_basic.png create mode 100644 e107_images/generic/lite/search_enhanced.png create mode 100644 e107_images/generic/lite/sticky.png create mode 100644 e107_images/generic/lite/user_select.png create mode 100644 e107_images/generic/php-small-trans-light.gif create mode 100644 e107_images/generic/poweredbymysql-88.png create mode 100644 e107_images/generic/valid-xhtml11.png create mode 100644 e107_images/generic/valid-xhtml11_small.png create mode 100644 e107_images/generic/vcss.png create mode 100644 e107_images/generic/vcss_small.png create mode 100644 e107_images/icons/download_32.png create mode 100644 e107_images/icons/folder.png create mode 100644 e107_images/icons/folder_32.png create mode 100644 e107_images/icons/folderx.png create mode 100644 e107_images/icons/folderx_32.png create mode 100644 e107_images/icons/html.png create mode 100644 e107_images/icons/icon1.png create mode 100644 e107_images/icons/icon10.png create mode 100644 e107_images/icons/icon11.png create mode 100644 e107_images/icons/icon12.png create mode 100644 e107_images/icons/icon13.png create mode 100644 e107_images/icons/icon14.png create mode 100644 e107_images/icons/icon15.png create mode 100644 e107_images/icons/icon16.png create mode 100644 e107_images/icons/icon17.png create mode 100644 e107_images/icons/icon18.png create mode 100644 e107_images/icons/icon19.png create mode 100644 e107_images/icons/icon2.png create mode 100644 e107_images/icons/icon20.png create mode 100644 e107_images/icons/icon21.png create mode 100644 e107_images/icons/icon22.png create mode 100644 e107_images/icons/icon23.png create mode 100644 e107_images/icons/icon24.png create mode 100644 e107_images/icons/icon25.png create mode 100644 e107_images/icons/icon26.png create mode 100644 e107_images/icons/icon3.png create mode 100644 e107_images/icons/icon4.png create mode 100644 e107_images/icons/icon5.png create mode 100644 e107_images/icons/icon6.png create mode 100644 e107_images/icons/icon7.png create mode 100644 e107_images/icons/icon8.png create mode 100644 e107_images/icons/icon9.png create mode 100644 e107_images/index.html create mode 100644 e107_images/logo.png create mode 100644 e107_images/logo_template.png create mode 100644 e107_images/logo_template_large.png create mode 100644 e107_images/newspost_images/index.html create mode 100644 e107_images/newspost_images/welcome.png create mode 100644 e107_images/pcmag.png create mode 100644 e107_images/rate/box.png create mode 100644 e107_images/rate/box/box1.png create mode 100644 e107_images/rate/box/box10.png create mode 100644 e107_images/rate/box/box2.png create mode 100644 e107_images/rate/box/box3.png create mode 100644 e107_images/rate/box/box4.png create mode 100644 e107_images/rate/box/box5.png create mode 100644 e107_images/rate/box/box6.png create mode 100644 e107_images/rate/box/box7.png create mode 100644 e107_images/rate/box/box8.png create mode 100644 e107_images/rate/box/box9.png create mode 100644 e107_images/rate/boxend.png create mode 100644 e107_images/rate/dark/1.png create mode 100644 e107_images/rate/dark/2.png create mode 100644 e107_images/rate/dark/3.png create mode 100644 e107_images/rate/dark/4.png create mode 100644 e107_images/rate/dark/5.png create mode 100644 e107_images/rate/dark/6.png create mode 100644 e107_images/rate/dark/7.png create mode 100644 e107_images/rate/dark/8.png create mode 100644 e107_images/rate/dark/9.png create mode 100644 e107_images/rate/dark/lev1.png create mode 100644 e107_images/rate/dark/lev10.png create mode 100644 e107_images/rate/dark/lev2.png create mode 100644 e107_images/rate/dark/lev3.png create mode 100644 e107_images/rate/dark/lev4.png create mode 100644 e107_images/rate/dark/lev5.png create mode 100644 e107_images/rate/dark/lev6.png create mode 100644 e107_images/rate/dark/lev7.png create mode 100644 e107_images/rate/dark/lev8.png create mode 100644 e107_images/rate/dark/lev9.png create mode 100644 e107_images/rate/dark/star.png create mode 100644 e107_images/rate/lite/1.png create mode 100644 e107_images/rate/lite/2.png create mode 100644 e107_images/rate/lite/3.png create mode 100644 e107_images/rate/lite/4.png create mode 100644 e107_images/rate/lite/5.png create mode 100644 e107_images/rate/lite/6.png create mode 100644 e107_images/rate/lite/7.png create mode 100644 e107_images/rate/lite/8.png create mode 100644 e107_images/rate/lite/9.png create mode 100644 e107_images/rate/lite/lev1.png create mode 100644 e107_images/rate/lite/lev10.png create mode 100644 e107_images/rate/lite/lev2.png create mode 100644 e107_images/rate/lite/lev3.png create mode 100644 e107_images/rate/lite/lev4.png create mode 100644 e107_images/rate/lite/lev5.png create mode 100644 e107_images/rate/lite/lev6.png create mode 100644 e107_images/rate/lite/lev7.png create mode 100644 e107_images/rate/lite/lev8.png create mode 100644 e107_images/rate/lite/lev9.png create mode 100644 e107_images/rate/lite/star.png create mode 100644 e107_images/rate/star.png create mode 100644 e107_images/splash.jpg create mode 100644 e107_images/thumb.php create mode 100644 e107_images/user_icons/realname_dark.png create mode 100644 e107_images/user_icons/realname_lite.png create mode 100644 e107_images/user_icons/user_aim.png create mode 100644 e107_images/user_icons/user_birthday_dark.png create mode 100644 e107_images/user_icons/user_birthday_lite.png create mode 100644 e107_images/user_icons/user_dark.png create mode 100644 e107_images/user_icons/user_homepage.png create mode 100644 e107_images/user_icons/user_icq.png create mode 100644 e107_images/user_icons/user_lite.png create mode 100644 e107_images/user_icons/user_location.png create mode 100644 e107_images/user_icons/user_msn.png create mode 100644 e107_images/user_icons/user_realname_dark.png create mode 100644 e107_images/user_icons/user_realname_lite.png create mode 100644 e107_images/user_icons/user_star_dark.png create mode 100644 e107_images/user_icons/user_star_lite.png create mode 100644 e107_languages/English/English.php create mode 100644 e107_languages/English/admin/help/administrator.php create mode 100644 e107_languages/English/admin/help/article.php create mode 100644 e107_languages/English/admin/help/banlist.php create mode 100644 e107_languages/English/admin/help/cache.php create mode 100644 e107_languages/English/admin/help/chatbox.php create mode 100644 e107_languages/English/admin/help/content.php create mode 100644 e107_languages/English/admin/help/cpage.php create mode 100644 e107_languages/English/admin/help/custommenu.php create mode 100644 e107_languages/English/admin/help/db.php create mode 100644 e107_languages/English/admin/help/download.php create mode 100644 e107_languages/English/admin/help/emoticon.php create mode 100644 e107_languages/English/admin/help/fileinspector.php create mode 100644 e107_languages/English/admin/help/filemanager.php create mode 100644 e107_languages/English/admin/help/forum.php create mode 100644 e107_languages/English/admin/help/frontpage.php create mode 100644 e107_languages/English/admin/help/image.php create mode 100644 e107_languages/English/admin/help/index.html create mode 100644 e107_languages/English/admin/help/language.php create mode 100644 e107_languages/English/admin/help/link_category.php create mode 100644 e107_languages/English/admin/help/links.php create mode 100644 e107_languages/English/admin/help/list_menu_conf.php create mode 100644 e107_languages/English/admin/help/mailout.php create mode 100644 e107_languages/English/admin/help/menus.php create mode 100644 e107_languages/English/admin/help/menus2.php create mode 100644 e107_languages/English/admin/help/meta.php create mode 100644 e107_languages/English/admin/help/news_category.php create mode 100644 e107_languages/English/admin/help/newsfeed.php create mode 100644 e107_languages/English/admin/help/newspost.php create mode 100644 e107_languages/English/admin/help/notify.php create mode 100644 e107_languages/English/admin/help/phpinfo.php create mode 100644 e107_languages/English/admin/help/poll.php create mode 100644 e107_languages/English/admin/help/prefs.php create mode 100644 e107_languages/English/admin/help/review.php create mode 100644 e107_languages/English/admin/help/search.php create mode 100644 e107_languages/English/admin/help/theme.php create mode 100644 e107_languages/English/admin/help/ugflag.php create mode 100644 e107_languages/English/admin/help/updateadmin.php create mode 100644 e107_languages/English/admin/help/upload.php create mode 100644 e107_languages/English/admin/help/userclass2.php create mode 100644 e107_languages/English/admin/help/users.php create mode 100644 e107_languages/English/admin/help/users_extended.php create mode 100644 e107_languages/English/admin/help/wmessage.php create mode 100644 e107_languages/English/admin/lan_admin.php create mode 100644 e107_languages/English/admin/lan_admin_log.php create mode 100644 e107_languages/English/admin/lan_administrator.php create mode 100644 e107_languages/English/admin/lan_banlist.php create mode 100644 e107_languages/English/admin/lan_banner.php create mode 100644 e107_languages/English/admin/lan_cache.php create mode 100644 e107_languages/English/admin/lan_cpage.php create mode 100644 e107_languages/English/admin/lan_credits.php create mode 100644 e107_languages/English/admin/lan_db.php create mode 100644 e107_languages/English/admin/lan_db_verify.php create mode 100644 e107_languages/English/admin/lan_docs.php create mode 100644 e107_languages/English/admin/lan_download.php create mode 100644 e107_languages/English/admin/lan_e107_update.php create mode 100644 e107_languages/English/admin/lan_emoticon.php create mode 100644 e107_languages/English/admin/lan_fileinspector.php create mode 100644 e107_languages/English/admin/lan_filemanager.php create mode 100644 e107_languages/English/admin/lan_fla.php create mode 100644 e107_languages/English/admin/lan_footer.php create mode 100644 e107_languages/English/admin/lan_frontpage.php create mode 100644 e107_languages/English/admin/lan_header.php create mode 100644 e107_languages/English/admin/lan_image.php create mode 100644 e107_languages/English/admin/lan_lancheck.php create mode 100644 e107_languages/English/admin/lan_language.php create mode 100644 e107_languages/English/admin/lan_links.php create mode 100644 e107_languages/English/admin/lan_mailout.php create mode 100644 e107_languages/English/admin/lan_menus.php create mode 100644 e107_languages/English/admin/lan_message.php create mode 100644 e107_languages/English/admin/lan_meta.php create mode 100644 e107_languages/English/admin/lan_modcomment.php create mode 100644 e107_languages/English/admin/lan_newspost.php create mode 100644 e107_languages/English/admin/lan_notify.php create mode 100644 e107_languages/English/admin/lan_plugin.php create mode 100644 e107_languages/English/admin/lan_prefs.php create mode 100644 e107_languages/English/admin/lan_search.php create mode 100644 e107_languages/English/admin/lan_theme.php create mode 100644 e107_languages/English/admin/lan_ugflag.php create mode 100644 e107_languages/English/admin/lan_updateadmin.php create mode 100644 e107_languages/English/admin/lan_upload.php create mode 100644 e107_languages/English/admin/lan_userclass.php create mode 100644 e107_languages/English/admin/lan_userclass2.php create mode 100644 e107_languages/English/admin/lan_userinfo.php create mode 100644 e107_languages/English/admin/lan_users.php create mode 100755 e107_languages/English/admin/lan_users_extended.php create mode 100644 e107_languages/English/admin/lan_wmessage.php create mode 100644 e107_languages/English/lan_banner.php create mode 100644 e107_languages/English/lan_comment.php create mode 100644 e107_languages/English/lan_contact.php create mode 100644 e107_languages/English/lan_date.php create mode 100644 e107_languages/English/lan_download.php create mode 100644 e107_languages/English/lan_email.php create mode 100644 e107_languages/English/lan_equery_secure.php create mode 100644 e107_languages/English/lan_error.php create mode 100644 e107_languages/English/lan_fpw.php create mode 100644 e107_languages/English/lan_installer.php create mode 100644 e107_languages/English/lan_links.php create mode 100644 e107_languages/English/lan_login.php create mode 100644 e107_languages/English/lan_mail_handler.php create mode 100644 e107_languages/English/lan_membersonly.php create mode 100644 e107_languages/English/lan_news.php create mode 100644 e107_languages/English/lan_newspost.php create mode 100644 e107_languages/English/lan_notify.php create mode 100644 e107_languages/English/lan_np.php create mode 100644 e107_languages/English/lan_online.php create mode 100644 e107_languages/English/lan_page.php create mode 100644 e107_languages/English/lan_parser_functions.php create mode 100644 e107_languages/English/lan_prefs.php create mode 100644 e107_languages/English/lan_print.php create mode 100644 e107_languages/English/lan_rate.php create mode 100644 e107_languages/English/lan_ren_help.php create mode 100644 e107_languages/English/lan_search.php create mode 100644 e107_languages/English/lan_signup.php create mode 100644 e107_languages/English/lan_sitedown.php create mode 100644 e107_languages/English/lan_sitelinks.php create mode 100644 e107_languages/English/lan_submitnews.php create mode 100644 e107_languages/English/lan_top.php create mode 100644 e107_languages/English/lan_upload.php create mode 100644 e107_languages/English/lan_upload_handler.php create mode 100644 e107_languages/English/lan_user.php create mode 100644 e107_languages/English/lan_user_extended.php create mode 100644 e107_languages/English/lan_user_select.php create mode 100644 e107_languages/English/lan_userclass.php create mode 100644 e107_languages/English/lan_userposts.php create mode 100644 e107_languages/English/lan_usersettings.php create mode 100644 e107_languages/index.html create mode 100644 e107_plugins/admin_menu/admin_menu.php create mode 100755 e107_plugins/alt_auth/alt_auth_adminmenu.php create mode 100755 e107_plugins/alt_auth/alt_auth_conf.php create mode 100755 e107_plugins/alt_auth/alt_auth_login_class.php create mode 100755 e107_plugins/alt_auth/alt_auth_readme.txt create mode 100644 e107_plugins/alt_auth/alt_login_class.php create mode 100755 e107_plugins/alt_auth/images/icon_ldap.png create mode 100755 e107_plugins/alt_auth/languages/English/lan_alt_auth_conf.php create mode 100755 e107_plugins/alt_auth/languages/English/lan_ldap_auth.php create mode 100644 e107_plugins/alt_auth/languages/English/lan_otherdb_auth.php create mode 100755 e107_plugins/alt_auth/ldap_auth.php create mode 100755 e107_plugins/alt_auth/ldap_conf.php create mode 100644 e107_plugins/alt_auth/otherdb_auth.php create mode 100644 e107_plugins/alt_auth/otherdb_conf.php create mode 100755 e107_plugins/alt_auth/plugin.php create mode 100644 e107_plugins/alt_news/alt_news.php create mode 100644 e107_plugins/banner_menu/banner_menu.php create mode 100644 e107_plugins/banner_menu/config.php create mode 100644 e107_plugins/banner_menu/languages/English.php create mode 100644 e107_plugins/blogcalendar_menu/archive.php create mode 100644 e107_plugins/blogcalendar_menu/blogcalendar_menu.php create mode 100644 e107_plugins/blogcalendar_menu/calendar.php create mode 100644 e107_plugins/blogcalendar_menu/config.php create mode 100644 e107_plugins/blogcalendar_menu/functions.php create mode 100644 e107_plugins/blogcalendar_menu/languages/English.php create mode 100644 e107_plugins/blogcalendar_menu/styles.php create mode 100644 e107_plugins/calendar_menu/admin_config.php create mode 100644 e107_plugins/calendar_menu/calendar.php create mode 100644 e107_plugins/calendar_menu/calendar_menu.php create mode 100644 e107_plugins/calendar_menu/calendar_shortcodes.php create mode 100644 e107_plugins/calendar_menu/calendar_sql.php create mode 100644 e107_plugins/calendar_menu/calendar_template.php create mode 100644 e107_plugins/calendar_menu/e_list.php create mode 100644 e107_plugins/calendar_menu/e_notify.php create mode 100644 e107_plugins/calendar_menu/e_rss.php create mode 100644 e107_plugins/calendar_menu/e_search.php create mode 100644 e107_plugins/calendar_menu/ecal_class.php create mode 100644 e107_plugins/calendar_menu/event.php create mode 100644 e107_plugins/calendar_menu/images/b1.png create mode 100644 e107_plugins/calendar_menu/images/b10.png create mode 100644 e107_plugins/calendar_menu/images/b11.png create mode 100644 e107_plugins/calendar_menu/images/b12.png create mode 100644 e107_plugins/calendar_menu/images/b13.png create mode 100644 e107_plugins/calendar_menu/images/b14.png create mode 100644 e107_plugins/calendar_menu/images/b15.png create mode 100644 e107_plugins/calendar_menu/images/b16.png create mode 100644 e107_plugins/calendar_menu/images/b2.png create mode 100644 e107_plugins/calendar_menu/images/b3.png create mode 100644 e107_plugins/calendar_menu/images/b4.png create mode 100644 e107_plugins/calendar_menu/images/b5.png create mode 100644 e107_plugins/calendar_menu/images/b6.png create mode 100644 e107_plugins/calendar_menu/images/b7.png create mode 100644 e107_plugins/calendar_menu/images/b8.png create mode 100644 e107_plugins/calendar_menu/images/b9.png create mode 100644 e107_plugins/calendar_menu/images/cal1.png create mode 100644 e107_plugins/calendar_menu/images/cal2.png create mode 100644 e107_plugins/calendar_menu/images/cal3.png create mode 100644 e107_plugins/calendar_menu/images/calendar_16.png create mode 100644 e107_plugins/calendar_menu/images/calendar_32.png create mode 100644 e107_plugins/calendar_menu/images/icon_ec.png create mode 100644 e107_plugins/calendar_menu/images/star1.png create mode 100644 e107_plugins/calendar_menu/images/star2.png create mode 100644 e107_plugins/calendar_menu/images/star3.png create mode 100644 e107_plugins/calendar_menu/images/star4.png create mode 100644 e107_plugins/calendar_menu/images/star5.png create mode 100644 e107_plugins/calendar_menu/images/star6.png create mode 100644 e107_plugins/calendar_menu/images/star7.png create mode 100644 e107_plugins/calendar_menu/images/star8.png create mode 100644 e107_plugins/calendar_menu/index.html create mode 100644 e107_plugins/calendar_menu/languages/English.php create mode 100644 e107_plugins/calendar_menu/languages/English_search.php create mode 100644 e107_plugins/calendar_menu/log/index.html create mode 100644 e107_plugins/calendar_menu/next_event_menu.php create mode 100644 e107_plugins/calendar_menu/plugin.php create mode 100644 e107_plugins/calendar_menu/readme.pdf create mode 100644 e107_plugins/calendar_menu/search/search_parser.php create mode 100644 e107_plugins/calendar_menu/subs_menu.php create mode 100644 e107_plugins/calendar_menu/subscribe.php create mode 100644 e107_plugins/chatbox_menu/admin_chatbox.php create mode 100644 e107_plugins/chatbox_menu/chat.php create mode 100644 e107_plugins/chatbox_menu/chat_template.php create mode 100644 e107_plugins/chatbox_menu/chatbox_menu.php create mode 100644 e107_plugins/chatbox_menu/chatbox_sql.php create mode 100644 e107_plugins/chatbox_menu/e_list.php create mode 100644 e107_plugins/chatbox_menu/e_notify.php create mode 100644 e107_plugins/chatbox_menu/e_rss.php create mode 100644 e107_plugins/chatbox_menu/e_search.php create mode 100644 e107_plugins/chatbox_menu/e_status.php create mode 100644 e107_plugins/chatbox_menu/images/blocked.png create mode 100644 e107_plugins/chatbox_menu/images/chatbox_16.png create mode 100644 e107_plugins/chatbox_menu/images/chatbox_32.png create mode 100644 e107_plugins/chatbox_menu/languages/English/English.php create mode 100644 e107_plugins/chatbox_menu/languages/English/English_config.php create mode 100644 e107_plugins/chatbox_menu/languages/English/lan_chatbox_search.php create mode 100644 e107_plugins/chatbox_menu/plugin.php create mode 100644 e107_plugins/chatbox_menu/search/search_advanced.php create mode 100644 e107_plugins/chatbox_menu/search/search_parser.php create mode 100644 e107_plugins/clock_menu/clock.js create mode 100644 e107_plugins/clock_menu/clock_menu.php create mode 100644 e107_plugins/clock_menu/config.php create mode 100644 e107_plugins/clock_menu/languages/English.php create mode 100644 e107_plugins/clock_menu/languages/admin/English.php create mode 100644 e107_plugins/comment_menu/comment_menu.php create mode 100644 e107_plugins/comment_menu/comment_menu_shortcodes.php create mode 100644 e107_plugins/comment_menu/comment_menu_template.php create mode 100644 e107_plugins/comment_menu/config.php create mode 100644 e107_plugins/comment_menu/languages/English.php create mode 100644 e107_plugins/compliance_menu/compliance_menu.php create mode 100644 e107_plugins/compliance_menu/images/valid-xhtml11.png create mode 100644 e107_plugins/compliance_menu/images/vcss.png create mode 100644 e107_plugins/compliance_menu/languages/English.php create mode 100644 e107_plugins/content/admin_content_config.php create mode 100644 e107_plugins/content/content.js create mode 100644 e107_plugins/content/content.php create mode 100644 e107_plugins/content/content_manager.php create mode 100644 e107_plugins/content/content_shortcodes.php create mode 100644 e107_plugins/content/content_sql.php create mode 100644 e107_plugins/content/content_submit.php create mode 100644 e107_plugins/content/content_update.php create mode 100644 e107_plugins/content/content_update_check.php create mode 100644 e107_plugins/content/e_comment.php create mode 100644 e107_plugins/content/e_emailprint.php create mode 100644 e107_plugins/content/e_frontpage.php create mode 100644 e107_plugins/content/e_latest.php create mode 100644 e107_plugins/content/e_list.php create mode 100644 e107_plugins/content/e_meta.php create mode 100644 e107_plugins/content/e_notify.php create mode 100644 e107_plugins/content/e_rss.php create mode 100644 e107_plugins/content/e_search.php create mode 100644 e107_plugins/content/e_status.php create mode 100644 e107_plugins/content/handlers/content_class.php create mode 100644 e107_plugins/content/handlers/content_convert_class.php create mode 100644 e107_plugins/content/handlers/content_db_class.php create mode 100644 e107_plugins/content/handlers/content_defines.php create mode 100644 e107_plugins/content/handlers/content_form_class.php create mode 100644 e107_plugins/content/handlers/content_preset.php create mode 100644 e107_plugins/content/help.php create mode 100644 e107_plugins/content/images/cat/16/help.png create mode 100644 e107_plugins/content/images/cat/16/ledblue.png create mode 100644 e107_plugins/content/images/cat/16/ledgreen.png create mode 100644 e107_plugins/content/images/cat/16/ledlightblue.png create mode 100644 e107_plugins/content/images/cat/16/ledlightgreen.png create mode 100644 e107_plugins/content/images/cat/16/ledorange.png create mode 100644 e107_plugins/content/images/cat/16/ledpurple.png create mode 100644 e107_plugins/content/images/cat/16/ledred.png create mode 100644 e107_plugins/content/images/cat/16/ledyellow.png create mode 100644 e107_plugins/content/images/cat/16/messagebox_info.png create mode 100644 e107_plugins/content/images/cat/48/help.png create mode 100644 e107_plugins/content/images/cat/48/ledblue.png create mode 100644 e107_plugins/content/images/cat/48/ledgreen.png create mode 100644 e107_plugins/content/images/cat/48/ledlightblue.png create mode 100644 e107_plugins/content/images/cat/48/ledlightgreen.png create mode 100644 e107_plugins/content/images/cat/48/ledorange.png create mode 100644 e107_plugins/content/images/cat/48/ledpurple.png create mode 100644 e107_plugins/content/images/cat/48/ledred.png create mode 100644 e107_plugins/content/images/cat/48/ledyellow.png create mode 100644 e107_plugins/content/images/cat/48/messagebox_info.png create mode 100644 e107_plugins/content/images/content_16.png create mode 100644 e107_plugins/content/images/content_32.png create mode 100644 e107_plugins/content/images/error_16.png create mode 100644 e107_plugins/content/images/file/index.html create mode 100644 e107_plugins/content/images/file/tmp/index.html create mode 100644 e107_plugins/content/images/file_16.png create mode 100644 e107_plugins/content/images/icon/blank.gif create mode 100644 e107_plugins/content/images/icon/tmp/index.html create mode 100644 e107_plugins/content/images/image/index.html create mode 100644 e107_plugins/content/images/image/tmp/index.html create mode 100644 e107_plugins/content/images/manager_16.png create mode 100644 e107_plugins/content/images/manager_48.png create mode 100644 e107_plugins/content/images/ok_16.png create mode 100644 e107_plugins/content/images/personal.png create mode 100644 e107_plugins/content/images/score.png create mode 100644 e107_plugins/content/images/score_empty.png create mode 100644 e107_plugins/content/images/score_end.png create mode 100644 e107_plugins/content/images/submit_16.png create mode 100644 e107_plugins/content/images/submit_32.png create mode 100644 e107_plugins/content/images/view_remove.png create mode 100644 e107_plugins/content/images/warning_16.png create mode 100644 e107_plugins/content/images/window_new.png create mode 100644 e107_plugins/content/languages/English/lan_content.php create mode 100644 e107_plugins/content/languages/English/lan_content_admin.php create mode 100644 e107_plugins/content/languages/English/lan_content_frontpage.php create mode 100644 e107_plugins/content/languages/English/lan_content_help.php create mode 100644 e107_plugins/content/languages/English/lan_content_search.php create mode 100644 e107_plugins/content/menus/index.html create mode 100644 e107_plugins/content/plugin.php create mode 100644 e107_plugins/content/search/search_advanced.php create mode 100644 e107_plugins/content/search/search_comments.php create mode 100644 e107_plugins/content/search/search_parser.php create mode 100644 e107_plugins/content/templates/content_manager_template.php create mode 100644 e107_plugins/content/templates/content_submit_type_template.php create mode 100644 e107_plugins/content/templates/content_type_template.php create mode 100644 e107_plugins/content/templates/default/content_archive_template.php create mode 100644 e107_plugins/content/templates/default/content_author_template.php create mode 100644 e107_plugins/content/templates/default/content_cat_template.php create mode 100644 e107_plugins/content/templates/default/content_content_template.php create mode 100644 e107_plugins/content/templates/default/content_content_template_bigtext.php create mode 100644 e107_plugins/content/templates/default/content_content_template_blackonwhite.php create mode 100644 e107_plugins/content/templates/default/content_content_template_whiteonblack.php create mode 100644 e107_plugins/content/templates/default/content_np_template.php create mode 100644 e107_plugins/content/templates/default/content_recent_template.php create mode 100644 e107_plugins/content/templates/default/content_score_template.php create mode 100644 e107_plugins/content/templates/default/content_search_template.php create mode 100644 e107_plugins/content/templates/default/content_searchresult_template.php create mode 100644 e107_plugins/content/templates/default/content_top_template.php create mode 100644 e107_plugins/counter_menu/counter_menu.php create mode 100644 e107_plugins/counter_menu/languages/English.php create mode 100644 e107_plugins/featurebox/admin_config.php create mode 100644 e107_plugins/featurebox/e_rss.php create mode 100644 e107_plugins/featurebox/featurebox.php create mode 100644 e107_plugins/featurebox/images/featurebox_16.png create mode 100644 e107_plugins/featurebox/images/featurebox_32.png create mode 100644 e107_plugins/featurebox/languages/English.php create mode 100644 e107_plugins/featurebox/plugin.php create mode 100644 e107_plugins/featurebox/templates/centered.php create mode 100644 e107_plugins/featurebox/templates/default.php create mode 100755 e107_plugins/forum/e_emailprint.php create mode 100644 e107_plugins/forum/e_frontpage.php create mode 100644 e107_plugins/forum/e_latest.php create mode 100644 e107_plugins/forum/e_linkgen.php create mode 100644 e107_plugins/forum/e_list.php create mode 100644 e107_plugins/forum/e_rss.php create mode 100644 e107_plugins/forum/e_search.php create mode 100644 e107_plugins/forum/e_status.php create mode 100644 e107_plugins/forum/forum.php create mode 100644 e107_plugins/forum/forum_admin.php create mode 100644 e107_plugins/forum/forum_class.php create mode 100644 e107_plugins/forum/forum_conf.php create mode 100644 e107_plugins/forum/forum_mod.php create mode 100644 e107_plugins/forum/forum_post.php create mode 100644 e107_plugins/forum/forum_post_shortcodes.php create mode 100644 e107_plugins/forum/forum_shortcodes.php create mode 100644 e107_plugins/forum/forum_sql.php create mode 100644 e107_plugins/forum/forum_stats.php create mode 100644 e107_plugins/forum/forum_test.php create mode 100644 e107_plugins/forum/forum_update.php create mode 100644 e107_plugins/forum/forum_update_check.php create mode 100644 e107_plugins/forum/forum_uploads.php create mode 100644 e107_plugins/forum/forum_viewforum.php create mode 100644 e107_plugins/forum/forum_viewtopic.php create mode 100644 e107_plugins/forum/images/dark/English_admin.png create mode 100644 e107_plugins/forum/images/dark/English_main_admin.png create mode 100644 e107_plugins/forum/images/dark/English_moderator.png create mode 100644 e107_plugins/forum/images/dark/English_newthread.png create mode 100644 e107_plugins/forum/images/dark/English_reply.png create mode 100644 e107_plugins/forum/images/dark/admin.png create mode 100644 e107_plugins/forum/images/dark/admin_block.png create mode 100644 e107_plugins/forum/images/dark/admin_delete.png create mode 100644 e107_plugins/forum/images/dark/admin_edit.png create mode 100644 e107_plugins/forum/images/dark/admin_lock.png create mode 100644 e107_plugins/forum/images/dark/admin_move.png create mode 100644 e107_plugins/forum/images/dark/admin_stick.png create mode 100644 e107_plugins/forum/images/dark/admin_unlock.png create mode 100644 e107_plugins/forum/images/dark/admin_unstick.png create mode 100644 e107_plugins/forum/images/dark/aim.png create mode 100644 e107_plugins/forum/images/dark/announce.png create mode 100644 e107_plugins/forum/images/dark/announce_small.png create mode 100644 e107_plugins/forum/images/dark/bar.jpg create mode 100644 e107_plugins/forum/images/dark/closed.png create mode 100644 e107_plugins/forum/images/dark/closed_small.png create mode 100644 e107_plugins/forum/images/dark/delete.png create mode 100644 e107_plugins/forum/images/dark/e.png create mode 100644 e107_plugins/forum/images/dark/edit.png create mode 100644 e107_plugins/forum/images/dark/email.png create mode 100644 e107_plugins/forum/images/dark/icq.png create mode 100644 e107_plugins/forum/images/dark/main_admin.png create mode 100644 e107_plugins/forum/images/dark/moderator.png create mode 100644 e107_plugins/forum/images/dark/msn.png create mode 100644 e107_plugins/forum/images/dark/new.png create mode 100644 e107_plugins/forum/images/dark/new_popular.png create mode 100644 e107_plugins/forum/images/dark/new_popular_small.png create mode 100644 e107_plugins/forum/images/dark/new_small.png create mode 100644 e107_plugins/forum/images/dark/newthread.png create mode 100644 e107_plugins/forum/images/dark/nonew.png create mode 100644 e107_plugins/forum/images/dark/nonew_popular.png create mode 100644 e107_plugins/forum/images/dark/nonew_popular_small.png create mode 100644 e107_plugins/forum/images/dark/nonew_small.png create mode 100644 e107_plugins/forum/images/dark/pm.png create mode 100644 e107_plugins/forum/images/dark/post.png create mode 100644 e107_plugins/forum/images/dark/post2.png create mode 100644 e107_plugins/forum/images/dark/profile.png create mode 100644 e107_plugins/forum/images/dark/quote.png create mode 100644 e107_plugins/forum/images/dark/reply.png create mode 100644 e107_plugins/forum/images/dark/report.png create mode 100644 e107_plugins/forum/images/dark/sticky.png create mode 100644 e107_plugins/forum/images/dark/sticky_closed.png create mode 100644 e107_plugins/forum/images/dark/sticky_closed_small.png create mode 100644 e107_plugins/forum/images/dark/sticky_small.png create mode 100644 e107_plugins/forum/images/dark/website.png create mode 100644 e107_plugins/forum/images/fcap.png create mode 100644 e107_plugins/forum/images/fcap2.png create mode 100644 e107_plugins/forum/images/finfobar.png create mode 100644 e107_plugins/forum/images/forums_16.png create mode 100644 e107_plugins/forum/images/forums_32.png create mode 100644 e107_plugins/forum/images/lite/English_admin.png create mode 100644 e107_plugins/forum/images/lite/English_main_admin.png create mode 100644 e107_plugins/forum/images/lite/English_moderator.png create mode 100644 e107_plugins/forum/images/lite/English_newthread.png create mode 100644 e107_plugins/forum/images/lite/English_reply.png create mode 100644 e107_plugins/forum/images/lite/admin.png create mode 100644 e107_plugins/forum/images/lite/admin_block.png create mode 100644 e107_plugins/forum/images/lite/admin_delete.png create mode 100644 e107_plugins/forum/images/lite/admin_edit.png create mode 100644 e107_plugins/forum/images/lite/admin_lock.png create mode 100644 e107_plugins/forum/images/lite/admin_move.png create mode 100644 e107_plugins/forum/images/lite/admin_stick.png create mode 100644 e107_plugins/forum/images/lite/admin_unlock.png create mode 100644 e107_plugins/forum/images/lite/admin_unstick.png create mode 100644 e107_plugins/forum/images/lite/aim.png create mode 100644 e107_plugins/forum/images/lite/announce.png create mode 100644 e107_plugins/forum/images/lite/announce_small.png create mode 100644 e107_plugins/forum/images/lite/bar.jpg create mode 100644 e107_plugins/forum/images/lite/closed.png create mode 100644 e107_plugins/forum/images/lite/closed_small.png create mode 100644 e107_plugins/forum/images/lite/delete.png create mode 100644 e107_plugins/forum/images/lite/e.png create mode 100644 e107_plugins/forum/images/lite/edit.png create mode 100644 e107_plugins/forum/images/lite/email.png create mode 100644 e107_plugins/forum/images/lite/icq.png create mode 100644 e107_plugins/forum/images/lite/main_admin.png create mode 100644 e107_plugins/forum/images/lite/moderator.png create mode 100644 e107_plugins/forum/images/lite/msn.png create mode 100644 e107_plugins/forum/images/lite/new.png create mode 100644 e107_plugins/forum/images/lite/new_popular.png create mode 100644 e107_plugins/forum/images/lite/new_popular_small.png create mode 100644 e107_plugins/forum/images/lite/new_small.png create mode 100644 e107_plugins/forum/images/lite/newthread.png create mode 100644 e107_plugins/forum/images/lite/nonew.png create mode 100644 e107_plugins/forum/images/lite/nonew_popular.png create mode 100644 e107_plugins/forum/images/lite/nonew_popular_small.png create mode 100644 e107_plugins/forum/images/lite/nonew_small.png create mode 100644 e107_plugins/forum/images/lite/pm.png create mode 100644 e107_plugins/forum/images/lite/post.png create mode 100644 e107_plugins/forum/images/lite/post2.png create mode 100644 e107_plugins/forum/images/lite/profile.png create mode 100644 e107_plugins/forum/images/lite/quote.png create mode 100644 e107_plugins/forum/images/lite/reply.png create mode 100644 e107_plugins/forum/images/lite/report.png create mode 100644 e107_plugins/forum/images/lite/sticky.png create mode 100644 e107_plugins/forum/images/lite/sticky_closed.png create mode 100644 e107_plugins/forum/images/lite/sticky_closed_small.png create mode 100644 e107_plugins/forum/images/lite/sticky_small.png create mode 100644 e107_plugins/forum/images/lite/website.png create mode 100755 e107_plugins/forum/images/sub_forums_16.png create mode 100644 e107_plugins/forum/index.php create mode 100644 e107_plugins/forum/languages/English/lan_forum.php create mode 100644 e107_plugins/forum/languages/English/lan_forum_admin.php create mode 100644 e107_plugins/forum/languages/English/lan_forum_conf.php create mode 100644 e107_plugins/forum/languages/English/lan_forum_frontpage.php create mode 100644 e107_plugins/forum/languages/English/lan_forum_post.php create mode 100644 e107_plugins/forum/languages/English/lan_forum_search.php create mode 100644 e107_plugins/forum/languages/English/lan_forum_stats.php create mode 100644 e107_plugins/forum/languages/English/lan_forum_uploads.php create mode 100644 e107_plugins/forum/languages/English/lan_forum_viewforum.php create mode 100644 e107_plugins/forum/languages/English/lan_forum_viewtopic.php create mode 100755 e107_plugins/forum/languages/English/lan_newforumposts_menu.php create mode 100755 e107_plugins/forum/newforumposts_menu.php create mode 100755 e107_plugins/forum/newforumposts_menu_config.php create mode 100644 e107_plugins/forum/plugin.php create mode 100644 e107_plugins/forum/search/search_advanced.php create mode 100644 e107_plugins/forum/search/search_parser.php create mode 100644 e107_plugins/forum/templates/forum_icons_template.php create mode 100644 e107_plugins/forum/templates/forum_post_template.php create mode 100644 e107_plugins/forum/templates/forum_posted_template.php create mode 100644 e107_plugins/forum/templates/forum_preview_template.php create mode 100644 e107_plugins/forum/templates/forum_template.php create mode 100644 e107_plugins/forum/templates/forum_viewforum_template.php create mode 100644 e107_plugins/forum/templates/forum_viewtopic_template.php create mode 100644 e107_plugins/gsitemap/admin_config.php create mode 100644 e107_plugins/gsitemap/gsitemap_sql.php create mode 100644 e107_plugins/gsitemap/images/icon.png create mode 100644 e107_plugins/gsitemap/images/icon_16.png create mode 100644 e107_plugins/gsitemap/languages/gsitemap_English.php create mode 100644 e107_plugins/gsitemap/plugin.php create mode 100644 e107_plugins/index.html create mode 100644 e107_plugins/integrity_check/admin_integrity_check.php create mode 100644 e107_plugins/integrity_check/images/integ.gif create mode 100644 e107_plugins/integrity_check/images/integrity_16.png create mode 100644 e107_plugins/integrity_check/images/integrity_32.png create mode 100644 e107_plugins/integrity_check/languages/English.php create mode 100644 e107_plugins/integrity_check/plugin.php create mode 100644 e107_plugins/lastseen/languages/English.php create mode 100644 e107_plugins/lastseen/lastseen_menu.php create mode 100644 e107_plugins/links_page/admin_linkspage_config.php create mode 100644 e107_plugins/links_page/cat_images/linkspage_16.png create mode 100644 e107_plugins/links_page/e_comment.php create mode 100644 e107_plugins/links_page/e_frontpage.php create mode 100644 e107_plugins/links_page/e_latest.php create mode 100644 e107_plugins/links_page/e_list.php create mode 100644 e107_plugins/links_page/e_notify.php create mode 100644 e107_plugins/links_page/e_rss.php create mode 100644 e107_plugins/links_page/e_search.php create mode 100644 e107_plugins/links_page/e_status.php create mode 100644 e107_plugins/links_page/help.php create mode 100644 e107_plugins/links_page/images/blank.gif create mode 100644 e107_plugins/links_page/images/generic.png create mode 100644 e107_plugins/links_page/images/linkspage_16.png create mode 100644 e107_plugins/links_page/images/linkspage_32.png create mode 100644 e107_plugins/links_page/languages/English.php create mode 100644 e107_plugins/links_page/link_class.php create mode 100644 e107_plugins/links_page/link_defines.php create mode 100644 e107_plugins/links_page/link_images/button.png create mode 100644 e107_plugins/links_page/link_menu.php create mode 100644 e107_plugins/links_page/link_shortcodes.php create mode 100644 e107_plugins/links_page/links.php create mode 100644 e107_plugins/links_page/links_page_sql.php create mode 100644 e107_plugins/links_page/links_template.php create mode 100644 e107_plugins/links_page/plugin.php create mode 100644 e107_plugins/links_page/search/search_advanced.php create mode 100644 e107_plugins/links_page/search/search_comments.php create mode 100644 e107_plugins/links_page/search/search_parser.php create mode 100644 e107_plugins/linkwords/admin_config.php create mode 100644 e107_plugins/linkwords/images/linkwords_16.png create mode 100644 e107_plugins/linkwords/images/linkwords_32.png create mode 100644 e107_plugins/linkwords/languages/English.php create mode 100644 e107_plugins/linkwords/linkwords.php create mode 100644 e107_plugins/linkwords/linkwords_sql.php create mode 100644 e107_plugins/linkwords/plugin.php create mode 100644 e107_plugins/list_new/admin_list_config.php create mode 100644 e107_plugins/list_new/icon/list_16.png create mode 100644 e107_plugins/list_new/icon/list_32.png create mode 100644 e107_plugins/list_new/images/icon1.gif create mode 100644 e107_plugins/list_new/images/icon10.gif create mode 100644 e107_plugins/list_new/images/icon11.gif create mode 100644 e107_plugins/list_new/images/icon2.gif create mode 100644 e107_plugins/list_new/images/icon3.gif create mode 100644 e107_plugins/list_new/images/icon4.gif create mode 100644 e107_plugins/list_new/images/icon5.gif create mode 100644 e107_plugins/list_new/images/icon6.gif create mode 100644 e107_plugins/list_new/images/icon7.gif create mode 100644 e107_plugins/list_new/images/icon8.gif create mode 100644 e107_plugins/list_new/images/icon9.gif create mode 100644 e107_plugins/list_new/languages/English.php create mode 100644 e107_plugins/list_new/list.php create mode 100644 e107_plugins/list_new/list_class.php create mode 100644 e107_plugins/list_new/list_new_menu.php create mode 100644 e107_plugins/list_new/list_recent_menu.php create mode 100644 e107_plugins/list_new/list_shortcodes.php create mode 100644 e107_plugins/list_new/list_template.php create mode 100644 e107_plugins/list_new/plugin.php create mode 100644 e107_plugins/list_new/section/list_comment.php create mode 100644 e107_plugins/list_new/section/list_download.php create mode 100644 e107_plugins/list_new/section/list_members.php create mode 100644 e107_plugins/list_new/section/list_news.php create mode 100644 e107_plugins/log/admin_config.php create mode 100644 e107_plugins/log/consolidate.php create mode 100644 e107_plugins/log/e_meta.php create mode 100644 e107_plugins/log/images/abrowse.png create mode 100644 e107_plugins/log/images/amaya.png create mode 100644 e107_plugins/log/images/ant.png create mode 100644 e107_plugins/log/images/aol.png create mode 100644 e107_plugins/log/images/aol2.png create mode 100644 e107_plugins/log/images/avantbrowser.png create mode 100644 e107_plugins/log/images/avantgo.png create mode 100644 e107_plugins/log/images/aweb.png create mode 100644 e107_plugins/log/images/bar.png create mode 100644 e107_plugins/log/images/beonex.png create mode 100644 e107_plugins/log/images/beos.png create mode 100644 e107_plugins/log/images/blazer.png create mode 100644 e107_plugins/log/images/camino.png create mode 100644 e107_plugins/log/images/chimera.png create mode 100644 e107_plugins/log/images/columbus.png create mode 100644 e107_plugins/log/images/crazybrowser.png create mode 100644 e107_plugins/log/images/curl.png create mode 100644 e107_plugins/log/images/deepnet.png create mode 100644 e107_plugins/log/images/dillo.png create mode 100644 e107_plugins/log/images/doris.png create mode 100644 e107_plugins/log/images/epiphany.png create mode 100644 e107_plugins/log/images/explorer.png create mode 100644 e107_plugins/log/images/firebird.png create mode 100644 e107_plugins/log/images/firefox.png create mode 100644 e107_plugins/log/images/freebsd.png create mode 100644 e107_plugins/log/images/galeon.png create mode 100644 e107_plugins/log/images/html.png create mode 100644 e107_plugins/log/images/ibrowse.png create mode 100644 e107_plugins/log/images/icab.png create mode 100644 e107_plugins/log/images/ice.png create mode 100644 e107_plugins/log/images/isilox.png create mode 100644 e107_plugins/log/images/k-meleon.png create mode 100644 e107_plugins/log/images/konqueror.png create mode 100644 e107_plugins/log/images/links.png create mode 100644 e107_plugins/log/images/linux.png create mode 100644 e107_plugins/log/images/logo.png create mode 100644 e107_plugins/log/images/lotus.png create mode 100644 e107_plugins/log/images/lunascape.png create mode 100644 e107_plugins/log/images/lynx.png create mode 100644 e107_plugins/log/images/mac.png create mode 100644 e107_plugins/log/images/maxthon.png create mode 100644 e107_plugins/log/images/mbrowser.png create mode 100644 e107_plugins/log/images/mosaic.png create mode 100644 e107_plugins/log/images/mozilla.png create mode 100644 e107_plugins/log/images/mozilla2.png create mode 100644 e107_plugins/log/images/multibrowser.png create mode 100644 e107_plugins/log/images/nautilus.png create mode 100644 e107_plugins/log/images/netbsd.png create mode 100644 e107_plugins/log/images/netcaptor.png create mode 100644 e107_plugins/log/images/netfront.png create mode 100644 e107_plugins/log/images/netpositive.png create mode 100644 e107_plugins/log/images/netscape.png create mode 100644 e107_plugins/log/images/netscape2.png create mode 100644 e107_plugins/log/images/omniweb.png create mode 100644 e107_plugins/log/images/openbsd.png create mode 100644 e107_plugins/log/images/opera.png create mode 100644 e107_plugins/log/images/oregano.png create mode 100644 e107_plugins/log/images/phaseout.png create mode 100644 e107_plugins/log/images/phoenix.png create mode 100644 e107_plugins/log/images/proxomitron.png create mode 100644 e107_plugins/log/images/remove.png create mode 100644 e107_plugins/log/images/robot.png create mode 100644 e107_plugins/log/images/safari.png create mode 100644 e107_plugins/log/images/screen.png create mode 100644 e107_plugins/log/images/shiira.png create mode 100644 e107_plugins/log/images/sleipnir.png create mode 100644 e107_plugins/log/images/slimbrowser.png create mode 100644 e107_plugins/log/images/spiders.png create mode 100644 e107_plugins/log/images/staroffice.png create mode 100644 e107_plugins/log/images/stats_16.png create mode 100644 e107_plugins/log/images/stats_32.png create mode 100644 e107_plugins/log/images/sunos.png create mode 100644 e107_plugins/log/images/sunrise.png create mode 100644 e107_plugins/log/images/unix.png create mode 100644 e107_plugins/log/images/unknown.png create mode 100644 e107_plugins/log/images/unspecified.png create mode 100644 e107_plugins/log/images/voyager.png create mode 100644 e107_plugins/log/images/w3m.png create mode 100644 e107_plugins/log/images/web%20indexing%20robot.png create mode 100644 e107_plugins/log/images/webtv.png create mode 100644 e107_plugins/log/images/windows.png create mode 100644 e107_plugins/log/images/xiino.png create mode 100644 e107_plugins/log/languages/English.php create mode 100644 e107_plugins/log/languages/admin/English.php create mode 100644 e107_plugins/log/log.php create mode 100644 e107_plugins/log/log_sql.php create mode 100644 e107_plugins/log/log_update.php create mode 100644 e107_plugins/log/log_update_check.php create mode 100644 e107_plugins/log/loginfo.php create mode 100644 e107_plugins/log/logs/null.txt create mode 100644 e107_plugins/log/plugin.php create mode 100644 e107_plugins/log/stats.php create mode 100644 e107_plugins/login_menu/config.php create mode 100644 e107_plugins/login_menu/languages/English.php create mode 100644 e107_plugins/login_menu/login_menu.php create mode 100755 e107_plugins/login_menu/login_menu_shortcodes.php create mode 100644 e107_plugins/login_menu/login_menu_template.php create mode 100644 e107_plugins/newforumposts_main/admin_config.php create mode 100644 e107_plugins/newforumposts_main/images/logo.png create mode 100644 e107_plugins/newforumposts_main/images/new_forum_16.png create mode 100644 e107_plugins/newforumposts_main/images/new_forum_32.png create mode 100644 e107_plugins/newforumposts_main/languages/English.php create mode 100644 e107_plugins/newforumposts_main/newforumposts.sc create mode 100644 e107_plugins/newforumposts_main/newforumposts_main.php create mode 100644 e107_plugins/newforumposts_main/plugin.php create mode 100644 e107_plugins/newsfeed/admin_config.php create mode 100644 e107_plugins/newsfeed/e_frontpage.php create mode 100644 e107_plugins/newsfeed/help.php create mode 100644 e107_plugins/newsfeed/images/newsfeed_16.png create mode 100644 e107_plugins/newsfeed/images/newsfeed_32.png create mode 100644 e107_plugins/newsfeed/languages/English.php create mode 100644 e107_plugins/newsfeed/languages/English_frontpage.php create mode 100644 e107_plugins/newsfeed/newsfeed.php create mode 100644 e107_plugins/newsfeed/newsfeed_functions.php create mode 100644 e107_plugins/newsfeed/newsfeed_menu.php create mode 100644 e107_plugins/newsfeed/plugin.php create mode 100644 e107_plugins/newsfeed/templates/newsfeed_menu_template.php create mode 100644 e107_plugins/newsfeed/templates/newsfeed_template.php create mode 100644 e107_plugins/newsletter/admin_config.php create mode 100644 e107_plugins/newsletter/images/nl_16.png create mode 100644 e107_plugins/newsletter/images/nl_32.png create mode 100644 e107_plugins/newsletter/languages/English.php create mode 100644 e107_plugins/newsletter/newsletter_menu.php create mode 100644 e107_plugins/newsletter/plugin.php create mode 100644 e107_plugins/online_extended_menu/images/user.png create mode 100644 e107_plugins/online_extended_menu/languages/English.php create mode 100644 e107_plugins/online_extended_menu/online_extended_menu.php create mode 100644 e107_plugins/online_menu/languages/English.php create mode 100644 e107_plugins/online_menu/online_menu.php create mode 100644 e107_plugins/other_news_menu/languages/English.php create mode 100644 e107_plugins/other_news_menu/other_news2_menu.php create mode 100644 e107_plugins/other_news_menu/other_news_menu.php create mode 100644 e107_plugins/pdf/admin_pdf_config.php create mode 100644 e107_plugins/pdf/e107pdf.php create mode 100644 e107_plugins/pdf/font/courier.php create mode 100644 e107_plugins/pdf/font/helvetica.php create mode 100644 e107_plugins/pdf/font/helveticab.php create mode 100644 e107_plugins/pdf/font/helveticabi.php create mode 100644 e107_plugins/pdf/font/helveticai.php create mode 100644 e107_plugins/pdf/font/makefont/cp1250.map create mode 100644 e107_plugins/pdf/font/makefont/cp1251.map create mode 100644 e107_plugins/pdf/font/makefont/cp1252.map create mode 100644 e107_plugins/pdf/font/makefont/cp1253.map create mode 100644 e107_plugins/pdf/font/makefont/cp1254.map create mode 100644 e107_plugins/pdf/font/makefont/cp1255.map create mode 100644 e107_plugins/pdf/font/makefont/cp1257.map create mode 100644 e107_plugins/pdf/font/makefont/cp1258.map create mode 100644 e107_plugins/pdf/font/makefont/cp874.map create mode 100644 e107_plugins/pdf/font/makefont/iso-8859-1.map create mode 100644 e107_plugins/pdf/font/makefont/iso-8859-11.map create mode 100644 e107_plugins/pdf/font/makefont/iso-8859-15.map create mode 100644 e107_plugins/pdf/font/makefont/iso-8859-16.map create mode 100644 e107_plugins/pdf/font/makefont/iso-8859-2.map create mode 100644 e107_plugins/pdf/font/makefont/iso-8859-4.map create mode 100644 e107_plugins/pdf/font/makefont/iso-8859-5.map create mode 100644 e107_plugins/pdf/font/makefont/iso-8859-7.map create mode 100644 e107_plugins/pdf/font/makefont/iso-8859-9.map create mode 100644 e107_plugins/pdf/font/makefont/koi8-r.map create mode 100644 e107_plugins/pdf/font/makefont/koi8-u.map create mode 100644 e107_plugins/pdf/font/makefont/makefont.php create mode 100644 e107_plugins/pdf/font/symbol.php create mode 100644 e107_plugins/pdf/font/times.php create mode 100644 e107_plugins/pdf/font/timesb.php create mode 100644 e107_plugins/pdf/font/timesbi.php create mode 100644 e107_plugins/pdf/font/timesi.php create mode 100644 e107_plugins/pdf/font/zapfdingbats.php create mode 100644 e107_plugins/pdf/fpdf.css create mode 100644 e107_plugins/pdf/fpdf.php create mode 100644 e107_plugins/pdf/images/pdf_16.png create mode 100644 e107_plugins/pdf/images/pdf_32.png create mode 100644 e107_plugins/pdf/languages/English.php create mode 100644 e107_plugins/pdf/pdf.php create mode 100644 e107_plugins/pdf/pdf.sc create mode 100644 e107_plugins/pdf/plugin.php create mode 100644 e107_plugins/pdf/ufpdf.php create mode 100644 e107_plugins/pm/attachments/index.html create mode 100755 e107_plugins/pm/images/attach.png create mode 100644 e107_plugins/pm/images/mail_block.png create mode 100644 e107_plugins/pm/images/mail_delete.png create mode 100755 e107_plugins/pm/images/mail_get.png create mode 100755 e107_plugins/pm/images/mail_send.png create mode 100644 e107_plugins/pm/images/mail_unblock.png create mode 100755 e107_plugins/pm/images/newpm.gif create mode 100755 e107_plugins/pm/images/pm.png create mode 100755 e107_plugins/pm/images/pvt_message_16.png create mode 100755 e107_plugins/pm/images/pvt_message_32.png create mode 100755 e107_plugins/pm/images/read.png create mode 100755 e107_plugins/pm/images/unread.png create mode 100644 e107_plugins/pm/index.html create mode 100755 e107_plugins/pm/languages/English.php create mode 100755 e107_plugins/pm/languages/admin/English.php create mode 100755 e107_plugins/pm/plugin.php create mode 100755 e107_plugins/pm/pm.php create mode 100755 e107_plugins/pm/pm_class.php create mode 100755 e107_plugins/pm/pm_conf.php create mode 100755 e107_plugins/pm/pm_default.php create mode 100755 e107_plugins/pm/pm_func.php create mode 100755 e107_plugins/pm/pm_notes.txt create mode 100755 e107_plugins/pm/pm_shortcodes.php create mode 100755 e107_plugins/pm/pm_sql.php create mode 100755 e107_plugins/pm/pm_template.php create mode 100644 e107_plugins/pm/pm_update.php create mode 100644 e107_plugins/pm/pm_update_check.php create mode 100755 e107_plugins/pm/private_msg_menu.php create mode 100644 e107_plugins/pm/sendpm.sc create mode 100644 e107_plugins/poll/admin_config.php create mode 100644 e107_plugins/poll/images/bar.png create mode 100644 e107_plugins/poll/images/barl.png create mode 100644 e107_plugins/poll/images/barr.png create mode 100644 e107_plugins/poll/images/polls_16.png create mode 100644 e107_plugins/poll/images/polls_32.png create mode 100644 e107_plugins/poll/languages/English.php create mode 100644 e107_plugins/poll/oldpolls.php create mode 100644 e107_plugins/poll/plugin.php create mode 100644 e107_plugins/poll/poll.php create mode 100644 e107_plugins/poll/poll_class.php create mode 100644 e107_plugins/poll/poll_menu.php create mode 100644 e107_plugins/poll/poll_sql.php create mode 100644 e107_plugins/poll/search/search_comments.php create mode 100644 e107_plugins/poll/templates/poll_template.php create mode 100644 e107_plugins/powered_by_menu/languages/English.php create mode 100644 e107_plugins/powered_by_menu/powered_by_menu.php create mode 100644 e107_plugins/rss_menu/admin_prefs.php create mode 100644 e107_plugins/rss_menu/e_meta.php create mode 100644 e107_plugins/rss_menu/images/rss1.png create mode 100644 e107_plugins/rss_menu/images/rss2.png create mode 100644 e107_plugins/rss_menu/images/rss3.png create mode 100644 e107_plugins/rss_menu/images/rss4.png create mode 100644 e107_plugins/rss_menu/images/rss_16.png create mode 100644 e107_plugins/rss_menu/images/rss_32.png create mode 100644 e107_plugins/rss_menu/languages/English.php create mode 100644 e107_plugins/rss_menu/plugin.php create mode 100644 e107_plugins/rss_menu/rss.php create mode 100644 e107_plugins/rss_menu/rss_menu.php create mode 100644 e107_plugins/rss_menu/rss_shortcodes.php create mode 100644 e107_plugins/rss_menu/rss_sql.php create mode 100644 e107_plugins/rss_menu/rss_template.php create mode 100644 e107_plugins/search_menu/images/search.png create mode 100644 e107_plugins/search_menu/images/search_32.png create mode 100644 e107_plugins/search_menu/languages/English.php create mode 100644 e107_plugins/search_menu/search_menu.php create mode 100644 e107_plugins/sitebutton_menu/languages/English.php create mode 100644 e107_plugins/sitebutton_menu/sitebutton_menu.php create mode 100644 e107_plugins/trackback/admin_config.php create mode 100644 e107_plugins/trackback/e_meta.php create mode 100644 e107_plugins/trackback/images/trackback_16.png create mode 100644 e107_plugins/trackback/images/trackback_32.png create mode 100644 e107_plugins/trackback/languages/English.php create mode 100644 e107_plugins/trackback/modtrackback.php create mode 100644 e107_plugins/trackback/plugin.php create mode 100644 e107_plugins/trackback/trackback.php create mode 100644 e107_plugins/trackback/trackbackClass.php create mode 100644 e107_plugins/tree_menu/config.php create mode 100644 e107_plugins/tree_menu/languages/English.php create mode 100644 e107_plugins/tree_menu/tree_menu.php create mode 100644 e107_plugins/userlanguage_menu/languages/English.php create mode 100644 e107_plugins/userlanguage_menu/userlanguage_menu.php create mode 100644 e107_plugins/usertheme_menu/languages/English.php create mode 100644 e107_plugins/usertheme_menu/usertheme_menu.php create mode 100644 e107_themes/crahan/images/bullet2.gif create mode 100644 e107_themes/crahan/images/logo1.png create mode 100644 e107_themes/crahan/images/logo2.png create mode 100644 e107_themes/crahan/images/logo3.png create mode 100644 e107_themes/crahan/images/logo4.png create mode 100644 e107_themes/crahan/index.html create mode 100644 e107_themes/crahan/languages/English.php create mode 100644 e107_themes/crahan/preview.jpg create mode 100644 e107_themes/crahan/style.css create mode 100644 e107_themes/crahan/theme.php create mode 100644 e107_themes/e107v4a/forum_template.php create mode 100644 e107_themes/e107v4a/images/bar.jpg create mode 100644 e107_themes/e107v4a/images/bar.png create mode 100644 e107_themes/e107v4a/images/barl.png create mode 100644 e107_themes/e107v4a/images/barr.png create mode 100644 e107_themes/e107v4a/images/blank.gif create mode 100644 e107_themes/e107v4a/images/bottom.png create mode 100644 e107_themes/e107v4a/images/bottomleft.png create mode 100644 e107_themes/e107v4a/images/bottomright.png create mode 100644 e107_themes/e107v4a/images/bullet2.gif create mode 100644 e107_themes/e107v4a/images/bullet3.png create mode 100644 e107_themes/e107v4a/images/button.png create mode 100644 e107_themes/e107v4a/images/button2.png create mode 100644 e107_themes/e107v4a/images/button3.png create mode 100644 e107_themes/e107v4a/images/cap1.png create mode 100644 e107_themes/e107v4a/images/capdark.png create mode 100644 e107_themes/e107v4a/images/capleft.png create mode 100644 e107_themes/e107v4a/images/caplight.png create mode 100644 e107_themes/e107v4a/images/capright.png create mode 100644 e107_themes/e107v4a/images/captransition.png create mode 100644 e107_themes/e107v4a/images/fcap.png create mode 100644 e107_themes/e107v4a/images/fcap2.png create mode 100644 e107_themes/e107v4a/images/header.png create mode 100644 e107_themes/e107v4a/images/left.png create mode 100644 e107_themes/e107v4a/images/logo.png create mode 100644 e107_themes/e107v4a/images/nforumcaption.png create mode 100644 e107_themes/e107v4a/images/nforumcaption2.png create mode 100644 e107_themes/e107v4a/images/right.png create mode 100644 e107_themes/e107v4a/images/search.png create mode 100644 e107_themes/e107v4a/images/temp.png create mode 100644 e107_themes/e107v4a/images/top.png create mode 100644 e107_themes/e107v4a/images/topleft.png create mode 100644 e107_themes/e107v4a/images/topright.png create mode 100644 e107_themes/e107v4a/index.html create mode 100644 e107_themes/e107v4a/languages/English.php create mode 100644 e107_themes/e107v4a/newsfeed_template.php create mode 100644 e107_themes/e107v4a/preview.jpg create mode 100644 e107_themes/e107v4a/style.css create mode 100644 e107_themes/e107v4a/theme.php create mode 100644 e107_themes/human_condition/images/bg.png create mode 100644 e107_themes/human_condition/images/bullet.png create mode 100644 e107_themes/human_condition/images/bullet2.gif create mode 100644 e107_themes/human_condition/images/bullet2.png create mode 100644 e107_themes/human_condition/images/comment.png create mode 100644 e107_themes/human_condition/images/footer.png create mode 100644 e107_themes/human_condition/images/header.png create mode 100644 e107_themes/human_condition/images/titlebar.png create mode 100644 e107_themes/human_condition/index.html create mode 100644 e107_themes/human_condition/languages/English.php create mode 100644 e107_themes/human_condition/newforumpost.php create mode 100644 e107_themes/human_condition/preview.jpg create mode 100644 e107_themes/human_condition/style.css create mode 100644 e107_themes/human_condition/theme.php create mode 100644 e107_themes/index.html create mode 100644 e107_themes/interfectus/images/background.jpg create mode 100644 e107_themes/interfectus/images/bar.png create mode 100644 e107_themes/interfectus/images/barl.png create mode 100644 e107_themes/interfectus/images/barr.png create mode 100644 e107_themes/interfectus/images/blank.gif create mode 100644 e107_themes/interfectus/images/bottomcol.png create mode 100644 e107_themes/interfectus/images/bottomleftcol.png create mode 100644 e107_themes/interfectus/images/bottomrightcol.png create mode 100644 e107_themes/interfectus/images/bullet1.gif create mode 100644 e107_themes/interfectus/images/bullet2.gif create mode 100644 e107_themes/interfectus/images/button.png create mode 100644 e107_themes/interfectus/images/cap1.png create mode 100644 e107_themes/interfectus/images/caption.png create mode 100644 e107_themes/interfectus/images/fcap.png create mode 100644 e107_themes/interfectus/images/fcap2.png create mode 100644 e107_themes/interfectus/images/footer.png create mode 100644 e107_themes/interfectus/images/header.png create mode 100644 e107_themes/interfectus/images/leftcol.png create mode 100644 e107_themes/interfectus/images/link1.png create mode 100644 e107_themes/interfectus/images/link2.png create mode 100644 e107_themes/interfectus/images/menubottom.png create mode 100644 e107_themes/interfectus/images/menubottom2.png create mode 100644 e107_themes/interfectus/images/menutop.png create mode 100644 e107_themes/interfectus/images/menutop2.png create mode 100644 e107_themes/interfectus/images/pagefooter.png create mode 100644 e107_themes/interfectus/images/pageheader.png create mode 100644 e107_themes/interfectus/images/rightcol.png create mode 100644 e107_themes/interfectus/images/search.png create mode 100644 e107_themes/interfectus/images/topleftcol.png create mode 100644 e107_themes/interfectus/images/toprightcol.png create mode 100644 e107_themes/interfectus/index.html create mode 100644 e107_themes/interfectus/languages/English.php create mode 100644 e107_themes/interfectus/preview.jpg create mode 100644 e107_themes/interfectus/style.css create mode 100644 e107_themes/interfectus/theme.php create mode 100644 e107_themes/jayya/admin_template.php create mode 100644 e107_themes/jayya/canvas.css create mode 100644 e107_themes/jayya/forum/admin.png create mode 100644 e107_themes/jayya/forum/admin_delete.png create mode 100644 e107_themes/jayya/forum/admin_edit.png create mode 100644 e107_themes/jayya/forum/admin_lock.png create mode 100644 e107_themes/jayya/forum/admin_move.png create mode 100644 e107_themes/jayya/forum/admin_stick.png create mode 100644 e107_themes/jayya/forum/admin_unlock.png create mode 100644 e107_themes/jayya/forum/admin_unstick.png create mode 100644 e107_themes/jayya/forum/announce.png create mode 100644 e107_themes/jayya/forum/closed_small.png create mode 100644 e107_themes/jayya/forum/delete.png create mode 100644 e107_themes/jayya/forum/e.png create mode 100644 e107_themes/jayya/forum/edit.png create mode 100644 e107_themes/jayya/forum/email.png create mode 100644 e107_themes/jayya/forum/fcap.png create mode 100644 e107_themes/jayya/forum/fcap2.png create mode 100644 e107_themes/jayya/forum/fcap2orig.png create mode 100644 e107_themes/jayya/forum/finfobar.png create mode 100644 e107_themes/jayya/forum/forum_icons_template.php create mode 100644 e107_themes/jayya/forum/main_admin.png create mode 100644 e107_themes/jayya/forum/moderator.png create mode 100644 e107_themes/jayya/forum/new.png create mode 100644 e107_themes/jayya/forum/new_popular.gif create mode 100644 e107_themes/jayya/forum/new_small.png create mode 100644 e107_themes/jayya/forum/newthread.png create mode 100644 e107_themes/jayya/forum/nonew.png create mode 100644 e107_themes/jayya/forum/nonew_popular.gif create mode 100644 e107_themes/jayya/forum/nonew_small.png create mode 100644 e107_themes/jayya/forum/post.png create mode 100644 e107_themes/jayya/forum/profile.png create mode 100644 e107_themes/jayya/forum/quote.png create mode 100644 e107_themes/jayya/forum/reply.png create mode 100644 e107_themes/jayya/forum/report.png create mode 100644 e107_themes/jayya/forum/sticky.png create mode 100644 e107_themes/jayya/forum/stickyclosed.png create mode 100644 e107_themes/jayya/forum/website.png create mode 100644 e107_themes/jayya/images/arrow.png create mode 100644 e107_themes/jayya/images/bar.jpg create mode 100644 e107_themes/jayya/images/blank.gif create mode 100644 e107_themes/jayya/images/bullet2.gif create mode 100644 e107_themes/jayya/images/button.png create mode 100644 e107_themes/jayya/images/buttonover.png create mode 100644 e107_themes/jayya/images/comments_16.png create mode 100644 e107_themes/jayya/images/computer.jpg create mode 100644 e107_themes/jayya/images/computer_pepper.jpg create mode 100644 e107_themes/jayya/images/email_16.png create mode 100644 e107_themes/jayya/images/on.png create mode 100644 e107_themes/jayya/images/polls.png create mode 100644 e107_themes/jayya/images/postedby_16.png create mode 100644 e107_themes/jayya/images/print_16.png create mode 100644 e107_themes/jayya/images/s_body.png create mode 100644 e107_themes/jayya/images/s_body_.png create mode 100644 e107_themes/jayya/images/s_left_bevel.png create mode 100644 e107_themes/jayya/images/s_left_bevel_.png create mode 100644 e107_themes/jayya/images/s_left_cap.png create mode 100644 e107_themes/jayya/images/s_left_cap_.png create mode 100644 e107_themes/jayya/images/s_main_cap.png create mode 100644 e107_themes/jayya/images/s_main_cap_.png create mode 100644 e107_themes/jayya/images/s_nav.png create mode 100644 e107_themes/jayya/images/s_nav_.png create mode 100644 e107_themes/jayya/images/screen.png create mode 100644 e107_themes/jayya/images/top_mid_back.jpg create mode 100644 e107_themes/jayya/images/top_mid_back_pepper.jpg create mode 100644 e107_themes/jayya/images/top_right_back.jpg create mode 100644 e107_themes/jayya/images/top_right_back_pepper.png create mode 100644 e107_themes/jayya/index.html create mode 100644 e107_themes/jayya/languages/English.php create mode 100644 e107_themes/jayya/nav_menu.css create mode 100644 e107_themes/jayya/pepper.css create mode 100644 e107_themes/jayya/preview.jpg create mode 100644 e107_themes/jayya/style.css create mode 100644 e107_themes/jayya/theme.php create mode 100644 e107_themes/khatru/download_template.php create mode 100644 e107_themes/khatru/forum_post_template.php create mode 100644 e107_themes/khatru/forum_posted_template.php create mode 100644 e107_themes/khatru/forum_preview_template.php create mode 100644 e107_themes/khatru/forum_template.php create mode 100644 e107_themes/khatru/forum_viewforum_template.php create mode 100644 e107_themes/khatru/forum_viewtopic_template.php create mode 100644 e107_themes/khatru/images/background.png create mode 100644 e107_themes/khatru/images/blank.gif create mode 100644 e107_themes/khatru/images/bottom.png create mode 100644 e107_themes/khatru/images/bottomleft.png create mode 100644 e107_themes/khatru/images/bottomright.png create mode 100644 e107_themes/khatru/images/bullet.png create mode 100644 e107_themes/khatru/images/bullet2.gif create mode 100644 e107_themes/khatru/images/button.png create mode 100644 e107_themes/khatru/images/icon.png create mode 100644 e107_themes/khatru/images/left.png create mode 100644 e107_themes/khatru/images/logo1.png create mode 100644 e107_themes/khatru/images/logo2.png create mode 100644 e107_themes/khatru/images/logo3.png create mode 100644 e107_themes/khatru/images/menubg.png create mode 100644 e107_themes/khatru/images/menubg2.png create mode 100644 e107_themes/khatru/images/nforumcaption.png create mode 100644 e107_themes/khatru/images/nforumcaption2.png create mode 100644 e107_themes/khatru/images/right.png create mode 100644 e107_themes/khatru/images/top.png create mode 100644 e107_themes/khatru/images/top2.png create mode 100644 e107_themes/khatru/images/topleft.png create mode 100644 e107_themes/khatru/images/topleft2.png create mode 100644 e107_themes/khatru/images/topright.png create mode 100644 e107_themes/khatru/images/topright2.png create mode 100644 e107_themes/khatru/index.html create mode 100644 e107_themes/khatru/languages/English.php create mode 100644 e107_themes/khatru/newforumpost.php create mode 100644 e107_themes/khatru/news_template.php create mode 100644 e107_themes/khatru/poll_template.php create mode 100644 e107_themes/khatru/preview.png create mode 100644 e107_themes/khatru/style.css create mode 100644 e107_themes/khatru/theme.php create mode 100644 e107_themes/kubrick/images/01_linkbg1.gif create mode 100644 e107_themes/kubrick/images/01_linkbg2.gif create mode 100644 e107_themes/kubrick/images/bar.jpg create mode 100644 e107_themes/kubrick/images/bullet2.gif create mode 100644 e107_themes/kubrick/images/kubrickbg.jpg create mode 100644 e107_themes/kubrick/images/kubrickbgcolor.jpg create mode 100644 e107_themes/kubrick/images/kubrickbgwide.jpg create mode 100644 e107_themes/kubrick/images/kubrickfooter.jpg create mode 100644 e107_themes/kubrick/images/kubrickheader.jpg create mode 100644 e107_themes/kubrick/images/tileage.jpg create mode 100644 e107_themes/kubrick/index.html create mode 100644 e107_themes/kubrick/languages/English.php create mode 100644 e107_themes/kubrick/preview.jpg create mode 100644 e107_themes/kubrick/style.css create mode 100644 e107_themes/kubrick/theme.js create mode 100644 e107_themes/kubrick/theme.php create mode 100644 e107_themes/kubrick/ul.sc create mode 100644 e107_themes/lamb/alt_style.css create mode 100644 e107_themes/lamb/alt_theme.php create mode 100644 e107_themes/lamb/chat_template.php create mode 100644 e107_themes/lamb/download_template.php create mode 100644 e107_themes/lamb/forum_post_template.php create mode 100644 e107_themes/lamb/forum_posted_template.php create mode 100644 e107_themes/lamb/forum_preview_template.php create mode 100644 e107_themes/lamb/forum_template.php create mode 100644 e107_themes/lamb/forum_viewforum_template.php create mode 100644 e107_themes/lamb/forum_viewtopic_template.php create mode 100644 e107_themes/lamb/images/bar.jpg create mode 100644 e107_themes/lamb/images/bg.png create mode 100644 e107_themes/lamb/images/bluearrow.png create mode 100644 e107_themes/lamb/images/bluearrow_greybg.png create mode 100644 e107_themes/lamb/images/boxbottom.png create mode 100644 e107_themes/lamb/images/boxtop.png create mode 100644 e107_themes/lamb/images/bullet2.gif create mode 100644 e107_themes/lamb/images/button.png create mode 100644 e107_themes/lamb/images/comment.png create mode 100644 e107_themes/lamb/images/download.png create mode 100644 e107_themes/lamb/images/email.png create mode 100644 e107_themes/lamb/images/greyarrow.png create mode 100644 e107_themes/lamb/images/lboxbottom.png create mode 100644 e107_themes/lamb/images/lboxtop.png create mode 100644 e107_themes/lamb/images/left.png create mode 100644 e107_themes/lamb/images/link.png create mode 100644 e107_themes/lamb/images/logo.png create mode 100644 e107_themes/lamb/images/logo_template.png create mode 100644 e107_themes/lamb/images/logobg.png create mode 100644 e107_themes/lamb/images/nforumcaption.png create mode 100644 e107_themes/lamb/images/nforumcaption2.png create mode 100644 e107_themes/lamb/images/right.png create mode 100644 e107_themes/lamb/index.html create mode 100644 e107_themes/lamb/languages/English.php create mode 100644 e107_themes/lamb/newforumpost.php create mode 100644 e107_themes/lamb/news_template.php create mode 100644 e107_themes/lamb/preview.jpg create mode 100644 e107_themes/lamb/style.css create mode 100644 e107_themes/lamb/theme.php create mode 100644 e107_themes/leaf/bluehigh.ttf create mode 100644 e107_themes/leaf/fontstyles/large.css create mode 100644 e107_themes/leaf/fontstyles/medium.css create mode 100644 e107_themes/leaf/images/01_bg.gif create mode 100644 e107_themes/leaf/images/01_bodybg.jpg create mode 100644 e107_themes/leaf/images/01_font1.gif create mode 100644 e107_themes/leaf/images/01_font2.gif create mode 100644 e107_themes/leaf/images/01_font3.gif create mode 100644 e107_themes/leaf/images/01_footer.jpg create mode 100644 e107_themes/leaf/images/01_hdot.gif create mode 100644 e107_themes/leaf/images/01_header01.jpg create mode 100644 e107_themes/leaf/images/01_header02.jpg create mode 100644 e107_themes/leaf/images/01_header03.jpg create mode 100644 e107_themes/leaf/images/01_header04.jpg create mode 100644 e107_themes/leaf/images/01_item1.gif create mode 100644 e107_themes/leaf/images/01_item2.gif create mode 100644 e107_themes/leaf/images/01_item3.gif create mode 100644 e107_themes/leaf/images/01_linkbg1.gif create mode 100644 e107_themes/leaf/images/01_linkbg2.gif create mode 100644 e107_themes/leaf/images/01_logo.gif create mode 100644 e107_themes/leaf/images/01_m_comment.gif create mode 100644 e107_themes/leaf/images/01_m_default.gif create mode 100644 e107_themes/leaf/images/01_m_news.gif create mode 100644 e107_themes/leaf/images/01_mountaintop2.gif create mode 100644 e107_themes/leaf/images/01_quote.gif create mode 100644 e107_themes/leaf/images/01_s_about.gif create mode 100644 e107_themes/leaf/images/01_s_categories.gif create mode 100644 e107_themes/leaf/images/01_s_chatbox.gif create mode 100644 e107_themes/leaf/images/01_s_default.gif create mode 100644 e107_themes/leaf/images/01_s_latestcomment.gif create mode 100644 e107_themes/leaf/images/01_s_links.gif create mode 100644 e107_themes/leaf/images/01_s_login.gif create mode 100644 e107_themes/leaf/images/01_s_online.gif create mode 100644 e107_themes/leaf/images/01_s_search.gif create mode 100644 e107_themes/leaf/images/bullet2.gif create mode 100644 e107_themes/leaf/index.html create mode 100644 e107_themes/leaf/languages/English.php create mode 100644 e107_themes/leaf/links.sc create mode 100644 e107_themes/leaf/preview.png create mode 100644 e107_themes/leaf/style.css create mode 100644 e107_themes/leaf/theme.js create mode 100644 e107_themes/leaf/theme.php create mode 100644 e107_themes/leaf/ul.sc create mode 100644 e107_themes/newsroom/images/bar.jpg create mode 100644 e107_themes/newsroom/images/bullet2.gif create mode 100644 e107_themes/newsroom/images/logo_bg.png create mode 100644 e107_themes/newsroom/images/logo_text.png create mode 100644 e107_themes/newsroom/index.html create mode 100644 e107_themes/newsroom/preview.jpg create mode 100644 e107_themes/newsroom/style.css create mode 100644 e107_themes/newsroom/theme.php create mode 100644 e107_themes/reline/admin_style.css create mode 100644 e107_themes/reline/admin_template.php create mode 100644 e107_themes/reline/cube.sc create mode 100644 e107_themes/reline/full_width.css create mode 100644 e107_themes/reline/images/arrow.png create mode 100644 e107_themes/reline/images/bar.jpg create mode 100644 e107_themes/reline/images/blank.gif create mode 100644 e107_themes/reline/images/bullet2.gif create mode 100644 e107_themes/reline/images/button.png create mode 100644 e107_themes/reline/images/buttonover.png create mode 100644 e107_themes/reline/images/comments_16.png create mode 100644 e107_themes/reline/images/cube.png create mode 100644 e107_themes/reline/images/e_adminlogo.png create mode 100644 e107_themes/reline/images/e_logo.png create mode 100644 e107_themes/reline/images/email_16.png create mode 100644 e107_themes/reline/images/header.jpg create mode 100644 e107_themes/reline/images/header.png create mode 100644 e107_themes/reline/images/loggedin.png create mode 100644 e107_themes/reline/images/logo.png create mode 100644 e107_themes/reline/images/paperclip.png create mode 100644 e107_themes/reline/images/polls.png create mode 100644 e107_themes/reline/images/post_it_bottom.png create mode 100644 e107_themes/reline/images/post_it_middle.png create mode 100644 e107_themes/reline/images/post_it_top.png create mode 100644 e107_themes/reline/images/postedby_16.png create mode 100644 e107_themes/reline/images/print_16.png create mode 100644 e107_themes/reline/images/s_nav.png create mode 100644 e107_themes/reline/images/search.png create mode 100644 e107_themes/reline/index.html create mode 100644 e107_themes/reline/languages/English.php create mode 100644 e107_themes/reline/preview.jpg create mode 100644 e107_themes/reline/style.css create mode 100644 e107_themes/reline/theme.php create mode 100644 e107_themes/sebes/images/arrow.png create mode 100644 e107_themes/sebes/images/button.png create mode 100644 e107_themes/sebes/images/fcaption.png create mode 100644 e107_themes/sebes/images/forumheader.png create mode 100644 e107_themes/sebes/images/header.png create mode 100644 e107_themes/sebes/images/logo1.png create mode 100644 e107_themes/sebes/images/logo1_template.png create mode 100644 e107_themes/sebes/images/logo2.png create mode 100644 e107_themes/sebes/images/logo2_template.png create mode 100644 e107_themes/sebes/images/marrow.png create mode 100644 e107_themes/sebes/images/oarrow.png create mode 100644 e107_themes/sebes/images/search.png create mode 100644 e107_themes/sebes/images/selarrow.png create mode 100644 e107_themes/sebes/index.html create mode 100644 e107_themes/sebes/languages/English.php create mode 100644 e107_themes/sebes/preview.jpg create mode 100644 e107_themes/sebes/style.css create mode 100644 e107_themes/sebes/theme.php create mode 100644 e107_themes/templates/admin_template.php create mode 100644 e107_themes/templates/banner_template.php create mode 100644 e107_themes/templates/bbcode_template.php create mode 100644 e107_themes/templates/comment_template.php create mode 100644 e107_themes/templates/contact_template.php create mode 100644 e107_themes/templates/download_template.php create mode 100644 e107_themes/templates/email_template.php create mode 100644 e107_themes/templates/footer_default.php create mode 100644 e107_themes/templates/fpw_template.php create mode 100644 e107_themes/templates/header_default.php create mode 100644 e107_themes/templates/index.html create mode 100644 e107_themes/templates/login_template.php create mode 100755 e107_themes/templates/membersonly_template.php create mode 100644 e107_themes/templates/online_template.php create mode 100644 e107_themes/templates/search_template.php create mode 100755 e107_themes/templates/signup_template.php create mode 100644 e107_themes/templates/sitedown_template.php create mode 100644 e107_themes/templates/trackback_template.php create mode 100644 e107_themes/templates/user_template.php create mode 100644 e107_themes/templates/userposts_template.php create mode 100755 e107_themes/templates/usersettings_template.php create mode 100644 e107_themes/vekna_blue/images/bg.gif create mode 100644 e107_themes/vekna_blue/images/blank.gif create mode 100644 e107_themes/vekna_blue/images/bullet2.gif create mode 100644 e107_themes/vekna_blue/images/button.png create mode 100644 e107_themes/vekna_blue/images/cap.gif create mode 100644 e107_themes/vekna_blue/images/capleft.gif create mode 100644 e107_themes/vekna_blue/images/caption.png create mode 100644 e107_themes/vekna_blue/images/fcap.png create mode 100644 e107_themes/vekna_blue/images/line_bg.gif create mode 100644 e107_themes/vekna_blue/images/logo4.jpg create mode 100644 e107_themes/vekna_blue/images/menu.png create mode 100644 e107_themes/vekna_blue/images/menu1.gif create mode 100644 e107_themes/vekna_blue/images/menubottom.png create mode 100644 e107_themes/vekna_blue/index.html create mode 100644 e107_themes/vekna_blue/languages/English.php create mode 100644 e107_themes/vekna_blue/nav_menu.css create mode 100644 e107_themes/vekna_blue/preview.jpg create mode 100644 e107_themes/vekna_blue/style.css create mode 100644 e107_themes/vekna_blue/theme.php create mode 100644 email.php create mode 100644 error.php create mode 100644 favicon.ico create mode 100644 forum.php create mode 100644 forum_viewforum.php create mode 100644 forum_viewtopic.php create mode 100644 fpw.php create mode 100644 gsitemap.php create mode 100644 index.php create mode 100644 install_.php create mode 100644 links.php create mode 100644 login.php create mode 100644 membersonly.php create mode 100644 news.php create mode 100644 online.php create mode 100644 page.php create mode 100644 print.php create mode 100644 rate.php create mode 100644 request.php create mode 100644 robots.txt create mode 100644 search.php create mode 100644 signup.php create mode 100644 sitedown.php create mode 100644 subcontent.php create mode 100644 submitnews.php create mode 100644 top.php create mode 100644 upload.php create mode 100644 user.php create mode 100644 userposts.php create mode 100644 usersettings.php diff --git a/article.php b/article.php new file mode 100644 index 000000000..a816d88f0 --- /dev/null +++ b/article.php @@ -0,0 +1,41 @@ + \ No newline at end of file diff --git a/backend.php b/backend.php new file mode 100644 index 000000000..ccef7f324 --- /dev/null +++ b/backend.php @@ -0,0 +1,105 @@ + + + + ".SITENAME." + ".SITEURL." + ".SITEDESCRIPTION." + en-gb + ".SITEDISCLAIMER." + ".SITEADMIN." + ".SITEADMINEMAIL." + {$pubdate} + {$pubdate} + http://backend.userland.com/rss + + + e107 website system (http://e107.org) + 60 + + + ".SITENAME." + ".SITEBUTTON." + ".SITEURL." + 88 + 31 + ".SITETAG." + + + + Search + Search ".SITENAME." + query + ".SITEURL."search.php + + "; + +$sql2 = new db; +$sql->db_Select("news", "*", "news_class=0 AND (news_start=0 || news_start < ".time().") AND (news_end=0 || news_end>".time().") ORDER BY news_datestamp DESC LIMIT 0, 10"); +while ($row = $sql->db_Fetch()) { + extract($row); + + $sql2->db_Select("news_category", "*", "category_id='{$news_category}'"); + $row = $sql->db_Fetch(); + extract($row); + + $sql2->db_Select("user", "user_name", "user_id='{$news_author}' "); + $row = $sql->db_Fetch(); + extract($row); + + + $tmp = explode(" ", $news_body); + unset($nb); + for($a = 0; $a <= 100; $a++) { + $nb .= $tmp[$a]." "; + } + $nb = htmlspecialchars($nb); + $wlog .= $news_title."\n".SITEURL."/comment.php?comment.news.".$news_id."\n\n"; + + $itemdate = strftime("%a, %d %b %Y %I:%M:00 GMT", $news_datestamp); + + + + + $rss .= " + $news_title + http://".$_SERVER['HTTP_HOST'].e_HTTP."comment.php?comment.news.".$news_id." + $nb + $category_name + http://".$_SERVER['HTTP_HOST'].e_HTTP."comment.php?comment.news.".$news_id." + $user_name + $itemdate + http://".$_SERVER['HTTP_HOST'].e_HTTP."comment.php?comment.news.".$news_id." + + "; + +} + + +$rss .= " + "; + + +echo $rss; + +?> \ No newline at end of file diff --git a/banner.php b/banner.php new file mode 100644 index 000000000..35070fce6 --- /dev/null +++ b/banner.php @@ -0,0 +1,125 @@ +db_Select("banner", "*", "banner_id = '{$query_string}' "); + $row = $sql->db_Fetch(); + $ip = $e107->getip(); + $newip = (strpos($row['banner_ip'], "{$ip}^") !== FALSE) ? $row['banner_ip'] : "{$row['banner_ip']}{$ip}^"; + $sql->db_Update("banner", "banner_clicks = banner_clicks + 1, `banner_ip` = '{$newip}' WHERE `banner_id` = '{$query_string}'"); + header("Location: {$row['banner_clickurl']}"); + exit; +} + +require_once(HEADERF); + +if (isset($_POST['clientsubmit'])) { + + $clean_login = $tp -> toDB($_POST['clientlogin']); + $clean_password = $tp -> toDB($_POST['clientpassword']); + + if (!$sql->db_Select("banner", "*", "`banner_clientlogin` = '{$clean_login}' AND `banner_clientpassword` = '{$clean_password}'")) { + $ns->tablerender(BANNERLAN_38, "
".BANNERLAN_20."

"); + require_once(FOOTERF); + exit; + } + + $row = $sql->db_Fetch(); + $banner_total = $sql->db_Select("banner", "*", "`banner_clientname` = '{$row['banner_clientname']}'"); + + if (!$banner_total) { + $ns->tablerender(BANNERLAN_38, "
".BANNERLAN_29."

"); + require_once(FOOTERF); + exit; + } else { + while ($row = $sql->db_Fetch()) { + + $start_date = ($row['banner_startdate'] ? strftime("%d %B %Y", $row['banner_startdate']) : BANNERLAN_31); + $end_date = ($row['banner_enddate'] ? strftime("%d %B %Y", $row['banner_enddate']) : BANNERLAN_31); + + $BANNER_TABLE_CLICKPERCENTAGE = ($row['banner_clicks'] && $row['banner_impressions'] ? round(($row['banner_clicks'] / $row['banner_impressions']) * 100)."%" : "-"); + $BANNER_TABLE_IMPRESSIONS_LEFT = ($row['banner_impurchased'] ? $row['banner_impurchased'] - $row['banner_impressions'] : BANNERLAN_30); + $BANNER_TABLE_IMPRESSIONS_PURCHASED = ($row['banner_impurchased'] ? $row['banner_impurchased'] : BANNERLAN_30); + $BANNER_TABLE_CLIENTNAME = $row['banner_clientname']; + $BANNER_TABLE_BANNER_ID = $row['banner_id']; + $BANNER_TABLE_BANNER_CLICKS = $row['banner_clicks']; + $BANNER_TABLE_BANNER_IMPRESSIONS = $row['banner_impressions']; + $BANNER_TABLE_ACTIVE = BANNERLAN_36.($row['banner_active'] != "255" ? BANNERLAN_32 : "".BANNERLAN_33.""); + $BANNER_TABLE_STARTDATE = BANNERLAN_37." ".$start_date; + $BANNER_TABLE_ENDDATE = BANNERLAN_34." ".$end_date; + + if ($row['banner_ip']) { + $tmp = explode("^", $row['banner_ip']); + $BANNER_TABLE_IP_LAN = BANNERLAN_35.": ".(count($tmp)-1); + for($a = 0; $a <= (count($tmp)-2); $a++) { + $BANNER_TABLE_IP .= $tmp[$a]."
"; + } + } + + if (!$BANNER_TABLE) { + if (file_exists(THEME."banner_template.php")) { + require_once(THEME."banner_template.php"); + } else { + require_once(e_BASE.$THEMES_DIRECTORY."templates/banner_template.php"); + } + } + $textstring .= preg_replace("/\{(.*?)\}/e", '$\1', $BANNER_TABLE); + } + } + + if (!$BANNER_TABLE) { + if (file_exists(THEME."banner_template.php")) { + require_once(THEME."banner_template.php"); + } else { + require_once(e_BASE.$THEMES_DIRECTORY."templates/banner_template.php"); + } + } + $textstart = preg_replace("/\{(.*?)\}/e", '$\1', $BANNER_TABLE_START); + $textend = preg_replace("/\{(.*?)\}/e", '$\1', $BANNER_TABLE_END); + $text = $textstart.$textstring.$textend; + + echo $text; + + require_once(FOOTERF); + exit; +} + + +$BANNER_LOGIN_TABLE_LOGIN = $rs->form_text("clientlogin", 30, $id, 20, "tbox"); +$BANNER_LOGIN_TABLE_PASSW = $rs->form_password("clientpassword", 30, "", 20, "tbox"); +$BANNER_LOGIN_TABLE_SUBMIT = $rs->form_button("submit", "clientsubmit", BANNERLAN_18); + +if (!$BANNER_LOGIN_TABLE) { + if (file_exists(THEME."banner_template.php")) { + require_once(THEME."banner_template.php"); + } else { + require_once(e_BASE.$THEMES_DIRECTORY."templates/banner_template.php"); + } +} +$text = preg_replace("/\{(.*?)\}/e", '$\1', $BANNER_LOGIN_TABLE); +$ns->tablerender(BANNERLAN_19, $text); + + +require_once(FOOTERF); + +?> \ No newline at end of file diff --git a/class2.php b/class2.php new file mode 100644 index 000000000..3152857d7 --- /dev/null +++ b/class2.php @@ -0,0 +1,1612 @@ + $pref_name) { + $retrieve_prefs[$key] = preg_replace("/\W/", '', $pref_name); + } +} else { + unset($retrieve_prefs); +} + +define("MAGIC_QUOTES_GPC", (ini_get('magic_quotes_gpc') ? TRUE : FALSE)); +$srvtmp = explode(".",$_SERVER['HTTP_HOST']); +define("e_SUBDOMAIN", (count($srvtmp)>2 && $srvtmp[2] ? $srvtmp[0] : FALSE)); // needs to be available to e107_config. + +// Ensure thet '.' is the first part of the include path +$inc_path = explode(PATH_SEPARATOR, ini_get('include_path')); +if($inc_path[0] != ".") { + array_unshift($inc_path, "."); + $inc_path = implode(PATH_SEPARATOR, $inc_path); + e107_ini_set("include_path", $inc_path); +} +unset($inc_path); + +// +// F: Grab e107_config, get directory paths and create $e107 object +// +@include_once(realpath(dirname(__FILE__).'/e107_config.php')); +if(!isset($ADMIN_DIRECTORY)){ + // e107_config.php is either empty, not valid or doesn't exist so redirect to installer.. + header("Location: install.php"); +} + +// +// clever stuff that figures out where the paths are on the fly.. no more need fo hard-coded e_HTTP :) +// +e107_require_once(realpath(dirname(__FILE__).'/'.$HANDLERS_DIRECTORY).'/e107_class.php'); +$e107_paths = compact('ADMIN_DIRECTORY', 'FILES_DIRECTORY', 'IMAGES_DIRECTORY', 'THEMES_DIRECTORY', 'PLUGINS_DIRECTORY', 'HANDLERS_DIRECTORY', 'LANGUAGES_DIRECTORY', 'HELP_DIRECTORY', 'DOWNLOADS_DIRECTORY'); +$e107 = new e107($e107_paths, realpath(dirname(__FILE__))); + +$inArray = array("'", ";", "/**/", "/UNION/", "/SELECT/", "AS "); +if (strpos($_SERVER['PHP_SELF'], "trackback") === false) { + foreach($inArray as $res) { + if(stristr($_SERVER['QUERY_STRING'], $res)) { + die("Access denied."); + } + } +} + +// +// G: Retrieve Query data from URI +// (Until this point, we have no idea what the user wants to do) +// +if (preg_match("#\[(.*?)](.*)#", $_SERVER['QUERY_STRING'], $matches)) { + define("e_MENU", $matches[1]); + $e_QUERY = $matches[2]; + + if(strlen(e_MENU) == 2) // language code ie. [fr] + { + require_once(e_HANDLER."language_class.php"); + $lng = new language; + define("e_LANCODE",TRUE); + $_GET['elan'] = $lng->convert(e_MENU); + } + +}else { + define("e_MENU", ""); + $e_QUERY = $_SERVER['QUERY_STRING']; + define("e_LANCODE", ""); +} + +// +// Start the parser; use it to grab the full query string +// + +e107_require_once(e_HANDLER.'e_parse_class.php'); +$tp = new e_parse; + +//define("e_QUERY", $matches[2]); +//define("e_QUERY", $_SERVER['QUERY_STRING']); +$e_QUERY = $tp->post_toForm($e_QUERY); +define("e_QUERY", $e_QUERY); +//$e_QUERY = e_QUERY; + +define("e_TBQS", $_SERVER['QUERY_STRING']); +$_SERVER['QUERY_STRING'] = e_QUERY; + +define("e_UC_PUBLIC", 0); +define("e_UC_MAINADMIN", 250); +define("e_UC_READONLY", 251); +define("e_UC_GUEST", 252); +define("e_UC_MEMBER", 253); +define("e_UC_ADMIN", 254); +define("e_UC_NOBODY", 255); +define("ADMINDIR", $ADMIN_DIRECTORY); + +// +// H: Initialize debug handling +// (NO E107 DEBUG CONSTANTS OR CODE ARE AVAILABLE BEFORE THIS POINT) +// All debug objects and constants are defined in the debug handler +// i.e. from here on you can use E107_DEBUG_LEVEL or any +// E107_DBG_* constant for debug testing. +// + require_once(e_HANDLER.'debug_handler.php'); + +if(E107_DEBUG_LEVEL && isset($db_debug) && is_object($db_debug)) { + $db_debug->Mark_Time('Start: Init ErrHandler'); +} + +// +// I: Sanity check on e107_config.php +// e107_config.php upgrade check +if (!$ADMIN_DIRECTORY && !$DOWNLOADS_DIRECTORY) { + message_handler("CRITICAL_ERROR", 8, ": generic, ", "e107_config.php"); + exit; +} + +// +// J: MYSQL INITIALIZATION +// +@require_once(e_HANDLER.'traffic_class.php'); +$eTraffic=new e107_traffic; // We start traffic counting ASAP +$eTraffic->Calibrate($eTraffic); + +define("MPREFIX", $mySQLprefix); + +e107_require_once(e_HANDLER."mysql_class.php"); + +$sql =& new db; +$sql2 =& new db; + +$sql->db_SetErrorReporting(FALSE); + +$sql->db_Mark_Time('Start: SQL Connect'); +$merror=$sql->db_Connect($mySQLserver, $mySQLuser, $mySQLpassword, $mySQLdefaultdb); +$sql->db_Mark_Time('Start: Prefs, misc tables'); + +require_once(e_HANDLER.'admin_log_class.php'); +$admin_log = new e_admin_log(); + +if ($merror == "e1") { + message_handler("CRITICAL_ERROR", 6, ": generic, ", "class2.php"); + exit; +} +else if ($merror == "e2") { + message_handler("CRITICAL_ERROR", 7, ": generic, ", "class2.php"); + exit; +} + +// +// K: Load compatability mode. +// +/* At a later date add a check to load e107 compat mode by $pref +PHP Compatabilty should *always* be on. */ +e107_require_once(e_HANDLER."php_compatibility_handler.php"); +e107_require_once(e_HANDLER."e107_Compat_handler.php"); +$aj = new textparse; // required for backwards compatibility with 0.6 plugins. + +// +// L: Extract core prefs from the database +// +$sql->db_Mark_Time('Start: Extract Core Prefs'); +e107_require_once(e_HANDLER."pref_class.php"); +$sysprefs = new prefs; + +e107_require_once(e_HANDLER.'cache_handler.php'); +e107_require_once(e_HANDLER.'arraystorage_class.php'); +$eArrayStorage = new ArrayData(); + +$PrefCache = ecache::retrieve('SitePrefs', 24 * 60, true); +if(!$PrefCache){ + // No cache of the prefs array, going for the db copy.. + $retrieve_prefs[] = 'SitePrefs'; + $sysprefs->ExtractPrefs($retrieve_prefs, TRUE); + $PrefData = $sysprefs->get('SitePrefs'); + $pref = $eArrayStorage->ReadArray($PrefData); + if(!$pref){ + $admin_log->log_event("CORE_LAN8", "CORE_LAN7", E_LOG_WARNING); // Core prefs error, core is attempting to + // Try for the automatic backup.. + $PrefData = $sysprefs->get('SitePrefs_Backup'); + $pref = $eArrayStorage->ReadArray($PrefData); + if(!$pref){ + // No auto backup, try for the 'old' prefs system. + $PrefData = $sysprefs->get('pref'); + $pref = unserialize($PrefData); + if(!is_array($pref)){ + message_handler("CRITICAL_ERROR", 3, __LINE__, __FILE__); + // No old system, so point in the direction of resetcore :( + message_handler("CRITICAL_ERROR", 4, __LINE__, __FILE__); + $admin_log->log_event("CORE_LAN8", "CORE_LAN9", E_LOG_FATAL); // Core could not restore from automatic backup. Execution halted. + exit; + } else { + // old prefs found, remove old system, and update core with new system + $PrefOutput = $eArrayStorage->WriteArray($pref); + if(!$sql->db_Update('core', "e107_value='{$PrefOutput}' WHERE e107_name='SitePrefs'")){ + $sql->db_Insert('core', "'SitePrefs', '{$PrefOutput}'"); + } + if(!$sql->db_Update('core', "e107_value='{$PrefOutput}' WHERE e107_name='SitePrefs_Backup'")){ + $sql->db_Insert('core', "'SitePrefs_Backup', '{$PrefOutput}'"); + } + $sql->db_Delete('core', "`e107_name` = 'pref'"); + } + } else { + message_handler("CRITICAL_ERROR", 3, __LINE__, __FILE__); + // auto backup found, use backup to restore the core + if(!$sql->db_Update('core', "`e107_value` = '".addslashes($PrefData)."' WHERE `e107_name` = 'SitePrefs'")){ + $sql->db_Insert('core', "'SitePrefs', '".addslashes($PrefData)."'"); + } + } + } + // write pref cache array + $PrefCache = $eArrayStorage->WriteArray($pref, false); + // store the prefs in cache if cache is enabled + ecache::set('SitePrefs', $PrefCache); +} else { + // cache of core prefs was found, so grab all the useful core rows we need + if(!isset($sysprefs->DefaultIgnoreRows)){ + $sysprefs->DefaultIgnoreRows = ""; + } + $sysprefs->DefaultIgnoreRows .= '|SitePrefs'; + $sysprefs->prefVals['core']['SitePrefs'] = $PrefCache; + if(isset($retrieve_prefs)) + { + $sysprefs->ExtractPrefs($retrieve_prefs, TRUE); + } + $pref = $eArrayStorage->ReadArray($PrefCache); +} + +$e107->set_base_path(); + +// extract menu prefs +$menu_pref = unserialize(stripslashes($sysprefs->get('menu_pref'))); + +$sql->db_Mark_Time('(Extracting Core Prefs Done)'); + + +// +// M: Subdomain and Language Selection +// +define("SITEURLBASE", ($pref['ssl_enabled'] == '1' ? "https://" : "http://").$_SERVER['HTTP_HOST']); +define("SITEURL", SITEURLBASE.e_HTTP); + +// let the subdomain determine the language (when enabled). +if(isset($pref['multilanguage_subdomain']) && $pref['multilanguage_subdomain'] && ($pref['user_tracking'] == "session")){ + e107_ini_set("session.cookie_domain",$pref['multilanguage_subdomain']); + require_once(e_HANDLER."language_class.php"); + $lng = new language; + if(e_SUBDOMAIN == "www"){ + $GLOBALS['elan'] = $pref['sitelanguage']; + } + elseif($eln = $lng->convert(e_SUBDOMAIN)) + { + $GLOBALS['elan'] = $eln; + } +} + + +// if a cookie name pref isn't set, make one :) +if (!$pref['cookie_name']) { + $pref['cookie_name'] = "e107cookie"; +} + +// start a session if session based login is enabled +if ($pref['user_tracking'] == "session") { + session_start(); +} + +define("e_SELF", ($pref['ssl_enabled'] == '1' ? "https://".$_SERVER['HTTP_HOST'] : "http://".$_SERVER['HTTP_HOST']) . ($_SERVER['PHP_SELF'] ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_FILENAME'])); + +// if the option to force users to use a particular url for the site is enabled, redirect users there as needed +// Now matches RFC 2616 (sec 3.2): case insensitive, https/:443 and http/:80 are equivalent. +// And, this is robust against hack attacks. Malignant users can put **anything** in HTTP_HOST! +if($pref['redirectsiteurl'] && $pref['siteurl']) { + // Find domain and port from user and from pref + list($urlbase,$urlport) = explode(':',$_SERVER['HTTP_HOST'].':'); + if (!$urlport) { $urlport = $_SERVER['SERVER_PORT']; } + if (!$urlport) { $urlport = 80; } + $aPrefURL = explode('/',$pref['siteurl'],4); + if (count($aPrefURL) > 2) { // we can do this -- there's at least http[s]://dom.ain/whatever + $PrefRoot = $aPrefURL[2]; + list($PrefSiteBase,$PrefSitePort) = explode(':',$PrefRoot.':'); + if (!$PrefSitePort) { + $PrefSitePort = ( $aPrefURL[0] == "https:" ) ? 443 : 80; // no port so set port based on 'scheme' + } + + // Redirect only if + // -- ports do not match (http <==> https) + // -- base domain does not match (case-insensitive) + // -- NOT admin area + if (($urlport != $PrefSitePort || stripos($PrefSiteBase, $urlbase) === FALSE) && strpos(e_SELF, ADMINDIR) === FALSE) { + $aeSELF = explode('/',e_SELF,4); + $aeSELF[0] = $aPrefURL[0]; // Swap in correct type of query (http, https) + $aeSELF[1] = ''; // Defensive code: ensure http:// not http:// + $aeSELF[2] = $aPrefURL[2]; // Swap in correct domain and possibly port + $location = implode('/',$aeSELF).(e_QUERY ? "?".e_QUERY : ""); + + header("Location: {$location}", true, 301); // send 301 header, not 302 + exit(); + } +} +} + +$page = substr(strrchr($_SERVER['PHP_SELF'], "/"), 1); +define("e_PAGE", $page); + +// sort out the users language selection +if (isset($_POST['setlanguage']) || isset($_GET['elan']) || isset($GLOBALS['elan'])) { + if($_GET['elan']) // query support, for language selection splash pages. etc + { + $_POST['sitelanguage'] = $_GET['elan']; + } + if($GLOBALS['elan'] && !isset($_POST['sitelanguage'])) + { + $_POST['sitelanguage'] = $GLOBALS['elan']; + } + + $sql->mySQLlanguage = $_POST['sitelanguage']; + $sql2->mySQLlanguage = $_POST['sitelanguage']; + + if ($pref['user_tracking'] == "session") { + $_SESSION['e107language_'.$pref['cookie_name']] = $_POST['sitelanguage']; + } else { + setcookie('e107language_'.$pref['cookie_name'], $_POST['sitelanguage'], time() + 86400, "/"); + $_COOKIE['e107language_'.$pref['cookie_name']] = $_POST['sitelanguage']; + if (strpos(e_SELF, ADMINDIR) === FALSE) { + $locat = ((!$_GET['elan'] && e_QUERY) || (e_QUERY && e_LANCODE)) ? e_SELF."?".e_QUERY : e_SELF; + header("Location:".$locat); + } + } +} + +$user_language=''; +// Multi-language options. +if (isset($pref['multilanguage']) && $pref['multilanguage']) { + + if ($pref['user_tracking'] == "session") { + $user_language=(array_key_exists('e107language_'.$pref['cookie_name'], $_SESSION) ? $_SESSION['e107language_'.$pref['cookie_name']] : ""); + $sql->mySQLlanguage=($user_language) ? $user_language : ""; + $sql2->mySQLlanguage = $sql->mySQLlanguage; + } else { + $user_language= (isset($_COOKIE['e107language_'.$pref['cookie_name']])) ? $_COOKIE['e107language_'.$pref['cookie_name']] : ""; + $sql->mySQLlanguage=($user_language) ? $user_language : ""; + $sql2->mySQLlanguage = $sql->mySQLlanguage; + } + + +} + +// Get Language List for rights checking. +if(!$tmplan = getcachedvars("language-list")){ + $handle=opendir(e_LANGUAGEDIR); + while ($file = readdir($handle)) { + if (is_dir(e_LANGUAGEDIR.$file) && $file !="." && $file !=".." && $file !="CVS") { + $lanlist[] = $file; + } + } + closedir($handle); + $tmplan = implode(",",$lanlist); + cachevars("language-list", $tmplan); +} + +define("e_LANLIST",(isset($tmplan) ? $tmplan : "")); + +$language=(isset($_COOKIE['e107language_'.$pref['cookie_name']]) ? $_COOKIE['e107language_'.$pref['cookie_name']] : ($pref['sitelanguage'] ? $pref['sitelanguage'] : "English")); +$language = preg_replace("#\W#", "", $language); +define("USERLAN", ($user_language && (strpos(e_SELF, $PLUGINS_DIRECTORY) !== FALSE || (strpos(e_SELF, $ADMIN_DIRECTORY) === FALSE && file_exists(e_LANGUAGEDIR.$user_language."/lan_".e_PAGE)) || (strpos(e_SELF, $ADMIN_DIRECTORY) !== FALSE && file_exists(e_LANGUAGEDIR.$user_language."/admin/lan_".e_PAGE)) || file_exists(dirname($_SERVER['SCRIPT_FILENAME'])."/languages/".$user_language."/lan_".e_PAGE) || ( (strpos(e_SELF, $ADMIN_DIRECTORY) == FALSE) && (strpos(e_SELF, $PLUGINS_DIRECTORY) == FALSE) && file_exists(e_LANGUAGEDIR.$user_language."/".$user_language.".php") ) ) ? $user_language : FALSE)); +define("e_LANGUAGE", (!USERLAN || !defined("USERLAN") ? $language : USERLAN)); + +e107_include(e_LANGUAGEDIR.e_LANGUAGE."/".e_LANGUAGE.".php"); +e107_include_once(e_LANGUAGEDIR.e_LANGUAGE."/".e_LANGUAGE."_custom.php"); + +if($pref['sitelanguage'] != e_LANGUAGE && isset($pref['multilanguage']) && $pref['multilanguage'] && !$pref['multilanguage_subdomain']){ + list($clc) = explode("_",CORE_LC); + define("e_LAN", strtolower($clc)); + define("e_LANQRY", "[".e_LAN."]"); + unset($clc); +}else{ + define("e_LAN", FALSE); + define("e_LANQRY", FALSE); +} +$sql->db_Mark_Time('(Start: Pref/multilang done)'); + +// +// N: misc setups: online user tracking, cache +// +$sql -> db_Mark_Time('Start: Misc resources. Online user tracking, cache'); +$e_online = new e_online(); + +// cache class +$e107cache = new ecache; + + +if (isset($pref['del_unv']) && $pref['del_unv'] && $pref['user_reg_veri'] != 2) { + $threshold=(time() - ($pref['del_unv'] * 60)); + $sql->db_Delete("user", "user_ban = 2 AND user_join < '{$threshold}' "); +} + +e107_require_once(e_HANDLER."override_class.php"); +$override=new override; + +e107_require_once(e_HANDLER."event_class.php"); +$e_event=new e107_event; + +if (isset($pref['notify']) && $pref['notify'] == true) { + e107_require_once(e_HANDLER.'notify_class.php'); +} + +// +// O: Start user session +// +$sql -> db_Mark_Time('Start: Init session'); +init_session(); + +// for multi-language these definitions needs to come after the language loaded. +define("SITENAME", trim($tp->toHTML($pref['sitename'], "", "emotes_off defs no_make_clickable"))); +define("SITEBUTTON", $pref['sitebutton']); +define("SITETAG", $tp->toHTML($pref['sitetag'], FALSE, "emotes_off defs")); +define("SITEDESCRIPTION", $tp->toHTML($pref['sitedescription'], "", "emotes_off defs")); +define("SITEADMIN", $pref['siteadmin']); +define("SITEADMINEMAIL", $pref['siteadminemail']); +define("SITEDISCLAIMER", $tp->toHTML($pref['sitedisclaimer'], "", "emotes_off defs")); +define("SITECONTACTINFO", $tp->toHTML($pref['sitecontactinfo'], TRUE, "emotes_off defs")); + +// legacy module.php file loading. +if (isset($pref['modules']) && $pref['modules']) { + $mods=explode(",", $pref['modules']); + foreach ($mods as $mod) { + if (is_readable(e_PLUGIN."{$mod}/module.php")) { + require_once(e_PLUGIN."{$mod}/module.php"); + } + } +} + +// Load e_modules after all the constants, but before the themes, so they can be put to use. +if(isset($pref['e_module_list']) && $pref['e_module_list']){ + foreach ($pref['e_module_list'] as $mod){ + if (is_readable(e_PLUGIN."{$mod}/e_module.php")) { + require_once(e_PLUGIN."{$mod}/e_module.php"); + } + } +} + +// +// P: THEME LOADING +// + +$sql->db_Mark_Time('Start: Load Theme'); + +//########### Module redefinable functions ############### +if (!function_exists('checkvalidtheme')) { + function checkvalidtheme($theme_check) { + // arg1 = theme to check + global $ADMIN_DIRECTORY, $tp, $e107; + + if (strpos(e_QUERY, "themepreview") !== FALSE) { + list($action, $id) = explode('.', e_QUERY); + require_once(e_HANDLER."theme_handler.php"); + $themeArray = themeHandler :: getThemes("id"); + define("PREVIEWTHEME", e_THEME.$themeArray[$id]."/"); + define("PREVIEWTHEMENAME", $themeArray[$id]); + define("THEME", e_THEME.$themeArray[$id]."/"); + define("THEME_ABS", e_THEME_ABS.$themeArray[$id]."/"); + return; + } + if (@fopen(e_THEME.$theme_check."/theme.php", "r")) { + define("THEME", e_THEME.$theme_check."/"); + define("THEME_ABS", e_THEME_ABS.$theme_check."/"); + $e107->site_theme = $theme_check; + } else { + function search_validtheme() { + global $e107; + $th=substr(e_THEME, 0, -1); + $handle=opendir($th); + while ($file = readdir($handle)) { + if (is_dir(e_THEME.$file) && is_readable(e_THEME.$file.'/theme.php')) { + closedir($handle); + $e107->site_theme = $file; + return $file; + } + } + closedir($handle); + } + $e107tmp_theme = search_validtheme(); + define("THEME", e_THEME.$e107tmp_theme."/"); + define("THEME_ABS", e_THEME_ABS.$e107tmp_theme."/"); + if (ADMIN && strpos(e_SELF, $ADMIN_DIRECTORY) === FALSE) { + echo ''; + } + } + $themes_dir = $e107->e107_dirs["THEMES_DIRECTORY"]; + $e107->http_theme_dir = "{$e107->server_path}{$themes_dir}{$e107->site_theme}/"; + } +} + +// +// Q: ALL OTHER SETUP CODE +// +$sql->db_Mark_Time('Start: Misc Setup'); + +//------------------------------------------------------------------------------------------------------------------------------------// +if (!class_exists('e107_table')) { + class e107table { + function tablerender($caption, $text, $mode = "default", $return = false) { + /* + # Render style table + # - parameter #1: string $caption, caption text + # - parameter #2: string $text, body text + # - return null + # - scope public + */ + global $override; + + if ($override_tablerender = $override->override_check('tablerender')) { + $result=call_user_func($override_tablerender, $caption, $text, $mode, $return); + + if ($result == "return") { + return; + } + extract($result); + } + + if ($return) { + ob_start(); + tablestyle($caption, $text, $mode); + $ret=ob_get_contents(); + ob_end_clean(); + return $ret; + } else { + tablestyle($caption, $text, $mode); + } + } + } +} +//############################################################# + +$ns=new e107table; + +$e107->ban(); + +if($pref['force_userupdate'] && USER) { + if(force_userupdate()) { + header("Location: ".e_BASE."usersettings.php?update"); + } +} + +$sql->db_Mark_Time('Start: Signup/splash/admin'); + +define("e_SIGNUP", e_BASE.(file_exists(e_BASE."customsignup.php") ? "customsignup.php" : "signup.php")); +define("e_LOGIN", e_BASE.(file_exists(e_BASE."customlogin.php") ? "customlogin.php" : "login.php")); + +if ($pref['membersonly_enabled'] && !USER && e_PAGE != e_SIGNUP && e_PAGE != "index.php" && e_PAGE != "fpw.php" && e_PAGE != e_LOGIN && strpos(e_PAGE, "admin") === FALSE && e_PAGE != 'membersonly.php' && e_PAGE != 'sitedown.php') { + header("Location: ".e_HTTP."membersonly.php"); + exit; +} + +$sql->db_Delete("tmp", "tmp_time < '".(time() - 300)."' AND tmp_ip!='data' AND tmp_ip!='submitted_link'"); + + + +if ($pref['maintainance_flag'] && ADMIN == FALSE && strpos(e_SELF, "admin.php") === FALSE && strpos(e_SELF, "sitedown.php") === FALSE) { + header("Location: ".SITEURL."sitedown.php"); + exit; +} + +$sql->db_Mark_Time('(Start: Login/logout/ban/tz)'); + +if (isset($_POST['userlogin']) || isset($_POST['userlogin_x'])) { + e107_require_once(e_HANDLER."login.php"); + $usr = new userlogin($_POST['username'], $_POST['userpass'], $_POST['autologin']); +} + +if (e_QUERY == 'logout') { + $ip = $e107->getip(); + $udata=(USER === TRUE) ? USERID.".".USERNAME : "0"; + $sql->db_Update("online", "online_user_id = '0', online_pagecount=online_pagecount+1 WHERE online_user_id = '{$udata}' LIMIT 1"); + + if ($pref['user_tracking'] == "session") { + session_destroy(); + $_SESSION[$pref['cookie_name']]=""; + } + + cookie($pref['cookie_name'], "", (time() - 2592000)); + $e_event->trigger("logout"); + echo "\n"; + exit; +} + + +/* +* Calculate time zone offset, based on session cookie set in e107.js. +* (Buyer beware: this may be wrong for the first pageview in a session, +* which is while the user is logged out, so not a problem...) +* +* Time offset is SECONDS. Seconds is much better than hours as a base, +* as some places have 30 and 45 minute time zones. +* It matches user clock time, instead of only time zones. +* Add the offset to MySQL/server time to get user time. +* Subtract the offset from user time to get server time. +* +*/ + +$e_deltaTime=0; + +if (isset($_COOKIE['e107_tdOffset'])) { + // Actual seconds of delay. See e107.js and footer_default.php + $e_deltaTime = $_COOKIE['e107_tdOffset']; +} + +if (isset($_COOKIE['e107_tzOffset'])) { + // Relative client-to-server time zone offset in seconds. + $e_deltaTime += (-($_COOKIE['e107_tzOffset'] * 60 + date("Z"))); +} + +define("TIMEOFFSET", $e_deltaTime); + +$sql->db_Mark_Time('Start: Get menus'); + +$menu_data = $e107cache->retrieve("menus_".USERCLASS_LIST."_".md5(e_LANGUAGE)); +$menu_data = $eArrayStorage->ReadArray($menu_data); +if(!is_array($menu_data)) { + if ($sql->db_Select('menus', '*', "menu_location > 0 AND menu_class IN (".USERCLASS_LIST.") ORDER BY menu_order")) { + while ($row = $sql->db_Fetch()) { + $eMenuList[$row['menu_location']][]=$row; + $eMenuActive[]=$row['menu_name']; + } + } + $menu_data['menu_list'] = $eMenuList; + $menu_data['menu_active'] = $eMenuActive; + $menu_data = $eArrayStorage->WriteArray($menu_data, false); + $e107cache->set("menus_".USERCLASS_LIST."_".md5(e_LANGUAGE), $menu_data); + unset($menu_data); +} else { + $eMenuList = $menu_data['menu_list']; + $eMenuActive = $menu_data['menu_active']; + unset($menu_data); +} + +$sql->db_Mark_Time('(Start: Find/Load Theme)'); + +if(!defined("THEME")){ + // any plugin file starting with 'admin_' is assumed to use admin theme + // any plugin file in a folder called admin/ is assumed to use admin theme. + // any file that specifies $eplug_admin = TRUE; + // this test: (strpos(e_SELF,'/'.$PLUGINS_DIRECTORY) !== FALSE && strpos(e_PAGE,"admin_") === 0) + // alternate test: match ANY file starting with 'admin_'... + // strpos(e_PAGE, "admin_") === 0 + // + // here we TEST the theme (see below for deciding what theme to USE) + // + + if((strpos(e_SELF, $ADMIN_DIRECTORY) !== FALSE || (strpos(e_SELF,'/'.$PLUGINS_DIRECTORY) !== FALSE && (strpos(e_PAGE,"admin_") === 0 || strpos(str_replace($e107->base_path, "", e_SELF), "admin/") !== FALSE)) || (isset($eplug_admin) && $eplug_admin == TRUE)) && $pref['admintheme']) { + + if (strpos(e_SELF.'?'.e_QUERY, 'menus.php?configure') !== FALSE) { + checkvalidtheme($pref['sitetheme']); + } else if (strpos(e_SELF, "newspost.php") !== FALSE) { + define("MAINTHEME", e_THEME.$pref['sitetheme']."/"); + checkvalidtheme($pref['admintheme']); + } + else { + checkvalidtheme($pref['admintheme']); + } + } else { + if (USERTHEME !== FALSE && USERTHEME != "USERTHEME") { + checkvalidtheme(USERTHEME); + } else { + checkvalidtheme($pref['sitetheme']); + } + } +} + + + +// -------------------------------------------------------------- + + // here we USE the theme + if (strpos(e_SELF.'?'.e_QUERY, 'menus.php?configure') === FALSE && (strpos(e_SELF, $ADMIN_DIRECTORY) !== FALSE || (strpos(e_SELF,'/'.$PLUGINS_DIRECTORY) !== FALSE && strpos(e_PAGE,"admin_") === 0) || (isset($eplug_admin) && $eplug_admin == TRUE))) { + if (file_exists(THEME.'admin_theme.php')) { + require_once(THEME.'admin_theme.php'); + } else { + require_once(THEME."theme.php"); + } +} else { + require_once(THEME."theme.php"); +} + +$exclude_lan = array("lan_signup.php"); // required for multi-language. + +if (strpos(e_SELF, $ADMIN_DIRECTORY) !== FALSE || strpos(e_SELF, "admin.php") !== FALSE) { + e107_include_once(e_LANGUAGEDIR.e_LANGUAGE."/admin/lan_".e_PAGE); + e107_include_once(e_LANGUAGEDIR."English/admin/lan_".e_PAGE); +} else if (!in_array("lan_".e_PAGE,$exclude_lan) && strpos(e_SELF, $PLUGINS_DIRECTORY) === FALSE) { + e107_include_once(e_LANGUAGEDIR.e_LANGUAGE."/lan_".e_PAGE); + e107_include_once(e_LANGUAGEDIR."English/lan_".e_PAGE); +} + + + +if(!defined("IMODE")) define("IMODE", "lite"); + +if ($pref['anon_post'] ? define("ANON", TRUE) : define("ANON", FALSE)); + +if (Empty($pref['newsposts']) ? define("ITEMVIEW", 15) : define("ITEMVIEW", $pref['newsposts'])); + +if ($pref['antiflood1'] == 1) { + define('FLOODPROTECT', TRUE); + define('FLOODTIMEOUT', $pref['antiflood_timeout']); +}else{ + define('FLOODPROTECT', FALSE); +} + +$layout = isset($layout) ? $layout : '_default'; +define("HEADERF", e_THEME."templates/header{$layout}.php"); +define("FOOTERF", e_THEME."templates/footer{$layout}.php"); + +if (!file_exists(HEADERF)) { + message_handler("CRITICAL_ERROR", "Unable to find file: ".HEADERF, __LINE__ - 2, __FILE__); +} + +if (!file_exists(FOOTERF)) { + message_handler("CRITICAL_ERROR", "Unable to find file: ".FOOTERF, __LINE__ - 2, __FILE__); +} + +define("LOGINMESSAGE", ""); +define("OPEN_BASEDIR", (ini_get('open_basedir') ? TRUE : FALSE)); +define("SAFE_MODE", (ini_get('safe_mode') ? TRUE : FALSE)); +define("FILE_UPLOADS", (ini_get('file_uploads') ? TRUE : FALSE)); +define("INIT", TRUE); +if(isset($_SERVER['HTTP_REFERER'])) { + $tmp = explode("?", $_SERVER['HTTP_REFERER']); + define("e_REFERER_SELF",($tmp[0] == e_SELF)); +} else { + define('e_REFERER_SELF', FALSE); +} + +if (!class_exists('convert')) +{ + require_once(e_HANDLER."date_handler.php"); +} + + + + + +//@require_once(e_HANDLER."IPB_int.php"); +//@require_once(e_HANDLER."debug_handler.php"); +//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------// +function js_location($qry){ + echo "\n"; exit; +} + +function check_email($email) { + return preg_match("/^([_a-zA-Z0-9-+]+)(\.[_a-zA-Z0-9-]+)*@([a-zA-Z0-9-]+)(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z]{2,6})$/" , $email) ? $email : FALSE; +} + +//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------// +function check_class($var, $userclass = USERCLASS, $peer = FALSE, $debug = FALSE) +{ + global $tp; + if($var == e_LANGUAGE){ + return TRUE; + } + + if (!$var || $var == "") + { + return TRUE; + } + + if(strpos($var, ",") !== FALSE) + { + $lans = explode(",",e_LANLIST); + $varList = explode(",", $var); + rsort($varList); // check the language first.(ie. numbers come last) + foreach($varList as $v) + { + if (in_array($v,$lans) && strpos($v, e_LANGUAGE) === FALSE) { + return FALSE; + } + + if(check_class($v, $userclass, $debug)) { + return TRUE; + } + } + return FALSE; + } + + if (preg_match("/^([0-9]+)$/", $var) && !$peer) + { + if ($var == e_UC_MAINADMIN && getperms('0')) + { + return TRUE; + } + + if ($var == e_UC_MEMBER && USER == TRUE) + { + return TRUE; + } + + if ($var == e_UC_GUEST && USER == FALSE) { + return TRUE; + } + + if ($var == e_UC_PUBLIC) { + return TRUE; + } + + if ($var == e_UC_NOBODY) { + return FALSE; + } + + if ($var == e_UC_ADMIN && ADMIN) { + return TRUE; + } + if ($var == e_UC_READONLY) { + return TRUE; + } + } + + if ($debug) { + echo "USERCLASS: ".$userclass.", \$var = $var : "; + } + + if (!defined("USERCLASS") || $userclass == "") { + if ($debug) { + echo "FALSE
"; + } + return FALSE; + } + + // user has classes set - continue + if (preg_match("/^([0-9]+)$/", $var)) { + $tmp=explode(',', $userclass); + if (is_numeric(array_search($var, $tmp))) { + if ($debug) { + echo "TRUE
"; + } + return TRUE; + } + } else { + // var is name of class ... + $sql=new db; + if ($sql->db_Select("userclass_classes", "*", "userclass_name='".$tp -> toDB($var)."' ")) { + $row=$sql->db_Fetch(); + $tmp=explode(',', $userclass); + if (is_numeric(array_search($row['userclass_id'], $tmp))) { + if ($debug) { + echo "TRUE
"; + } + return TRUE; + } + } + } + + if ($debug) { + echo "NOTNUM! FALSE
"; + } + + return FALSE; +} + +function getperms($arg, $ap = ADMINPERMS) { + global $PLUGINS_DIRECTORY; + if ($ap == "0") { + return TRUE; + } + if ($ap == "") { + return FALSE; + } + $ap='.'.$ap; + if ($arg == 'P' && preg_match("#(.*?)/".$PLUGINS_DIRECTORY."(.*?)/(.*?)#", e_SELF, $matches)) { + $psql=new db; + if ($psql->db_Select('plugin', 'plugin_id', "plugin_path = '".$matches[2]."' ")) { + $row=$psql->db_Fetch(); + $arg='P'.$row[0]; + } + } + if (strpos($ap, ".".$arg.".") !== FALSE) { + return TRUE; + } else { + return FALSE; + } +} + +/** + * Get the user data from user and user_extended tables + * + * @return array + */ +function get_user_data($uid, $extra = "") +{ + global $pref, $sql; + $uid = intval($uid); + $var = array(); + if($uid == 0) { return $var; } + if($ret = getcachedvars("userdata_{$uid}")) + { + return $ret; + } + + $qry = " + SELECT u.*, ue.* FROM #user AS u + LEFT JOIN #user_extended AS ue ON ue.user_extended_id = u.user_id + WHERE u.user_id='{$uid}' {$extra} + "; + if (!$sql->db_Select_gen($qry)) + { + $qry = "SELECT * FROM #user AS u WHERE u.user_id='{$uid}' {$extra}"; + if(!$sql->db_Select_gen($qry)) + { + return FALSE; + } + } + + $var = $sql->db_Fetch(); + $extended_struct = getcachedvars("extended_struct"); + if(!$extended_struct) + { + unset($extended_struct); + $qry = "SHOW COLUMNS FROM #user_extended "; + if($sql->db_Select_gen($qry)) + { + while($row = $sql->db_Fetch()) + { + if($row['Default'] != "") + { + $extended_struct[] = $row; + } + } + if(isset($extended_struct)) + { + cachevars("extended_struct", $extended_struct); + } + } + } + + if(isset($extended_struct)) + { + foreach($extended_struct as $row) + { + if($row['Default'] != "" && ($var[$row['Field']] == NULL || $var[$row['Field']] == "" )) + { + $var[$row['Field']] = $row['Default']; + } + } + } + cachevars("userdata_{$uid}", $var); + return $var; +} + +//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------// + +function save_prefs($table = 'core', $uid = USERID, $row_val = '') { + global $pref, $user_pref, $tp, $PrefCache, $sql, $eArrayStorage; + if ($table == 'core') { + if ($row_val == '') { + // Save old version as a backup + if(!$sql->db_Update('core', "e107_value='".addslashes($PrefCache)."' WHERE e107_name='SitePrefs_Backup'")){ + $sql->db_Insert('core', "'SitePrefs', '".addslashes($PrefCache)."'"); + } + + // traverse the pref array, with toDB on everything + $_pref = $tp -> toDB($pref, true, true); + // Create the data to be stored + $PrefCache1 = $eArrayStorage->WriteArray($_pref); + if(!$sql->db_Update('core', "e107_value='{$PrefCache1}' WHERE e107_name = 'SitePrefs'")){ + $sql->db_Insert('core', "'SitePrefs', '{$PrefCache1}'"); + } + ecache::clear('SitePrefs'); + } + } else { + + $_user_pref = $tp -> toDB($user_pref); + + $tmp=addslashes(serialize($_user_pref)); + $sql->db_Update("user", "user_prefs='$tmp' WHERE user_id=".intval($uid)); + return $tmp; + } +} + +//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------// + +class e_online { + function online($online_tracking = false, $flood_control = false) { + if($online_tracking == true || $flood_control == true) { + global $online_timeout, $online_warncount, $online_bancount; + if(!isset($online_timeout)) { + $online_timeout = 300; + } + if(!isset($online_warncount)) { + $online_warncount = 90; + } + if(!isset($online_bancount)) { + $online_bancount = 100; + } + global $sql, $pref, $e107, $listuserson, $e_event, $tp; + $page = (strpos(e_SELF, "forum_") !== FALSE) ? e_SELF.".".e_QUERY : e_SELF; + $page = (strpos(e_SELF, "comment") !== FALSE) ? e_SELF.".".e_QUERY : $page; + $page = (strpos(e_SELF, "content") !== FALSE) ? e_SELF.".".e_QUERY : $page; + $page = $tp -> toDB($page, true); + + $ip = $e107->getip(); + $udata = (USER === true ? USERID.".".USERNAME : "0"); + + if (USER) { + // Find record that matches IP or visitor, or matches user info + if ($sql->db_Select("online", "*", "(`online_ip` = '{$ip}' AND `online_user_id` = '0') OR `online_user_id` = '{$udata}'")) { + $row = $sql->db_Fetch(); + + if ($row['online_user_id'] == $udata) { + //Matching user record + if ($row['online_timestamp'] < (time() - $online_timeout)) { + //It has been at least 'timeout' seconds since this user has connected + //Update user record with timestamp, current IP, current page and set pagecount to 1 + $query = "online_timestamp='".time()."', online_ip='{$ip}', online_location='{$page}', online_pagecount=1 WHERE online_user_id='{$row['online_user_id']}' LIMIT 1"; + } else { + if (!ADMIN) { + $row['online_pagecount'] ++; + } + // Update user record with current IP, current page and increment pagecount + $query = "online_ip='{$ip}', `online_location` = '{$page}', `online_pagecount` = '".intval($row['online_pagecount'])."' WHERE `online_user_id` = '{$row['online_user_id']}' LIMIT 1"; + } + } else { + //Found matching visitor record (ip only) for this user + if ($row['online_timestamp'] < (time() - $online_timeout)) { + // It has been at least 'timeout' seconds since this user has connected + // Update record with timestamp, current IP, current page and set pagecount to 1 + $query = "`online_timestamp` = '".time()."', `online_user_id` = '{$udata}', `online_location` = '{$page}', `online_pagecount` = 1 WHERE `online_ip` = '{$ip}' AND `online_user_id` = '0' LIMIT 1"; + } else { + if (!ADMIN) { + $row['online_pagecount'] ++; + } + //Update record with current IP, current page and increment pagecount + $query = "`online_user_id` = '{$udata}', `online_location` = '{$page}', `online_pagecount` = ".intval($row['online_pagecount'])." WHERE `online_ip` = '{$ip}' AND `online_user_id` = '0' LIMIT 1"; + } + } + $sql->db_Update("online", $query); + } else { + $sql->db_Insert("online", " '".time()."', '0', '{$udata}', '{$ip}', '{$page}', 1, 0"); + } + } else { + //Current page request is from a visitor + if ($sql->db_Select("online", "*", "`online_ip` = '{$ip}' AND `online_user_id` = '0'")) { + $row = $sql->db_Fetch(); + + if ($row['online_timestamp'] < (time() - $online_timeout)) //It has been at least 'timeout' seconds since this ip has connected + { + //Update record with timestamp, current page, and set pagecount to 1 + $query = "`online_timestamp` = '".time()."', `online_location` = '{$page}', `online_pagecount` = 1 WHERE `online_ip` = '{$ip}' AND `online_user_id` = '0' LIMIT 1"; + } else { + //Update record with current page and increment pagecount + $row['online_pagecount'] ++; + // echo "here {$online_pagecount}"; + $query="`online_location` = '{$page}', `online_pagecount` = {$row['online_pagecount']} WHERE `online_ip` = '{$ip}' AND `online_user_id` = '0' LIMIT 1"; + } + $sql->db_Update("online", $query); + } else { + $sql->db_Insert("online", " '".time()."', 'null', '0', '{$ip}', '{$page}', 1, 0"); + } + } + + if (ADMIN || $pref['autoban'] != 1) { + $row['online_pagecount'] = 1; + } + if ($row['online_pagecount'] > $online_bancount && $row['online_ip'] != "127.0.0.1") { + $sql->db_Insert("banlist", "'{$ip}', '0', 'Hit count exceeded ({$row['online_pagecount']} requests within allotted time)' "); + $e_event->trigger("flood", $ip); + exit; + } + if ($row['online_pagecount'] >= $online_warncount && $row['online_ip'] != "127.0.0.1") { + echo "
".LAN_WARNING."

".CORE_LAN6."
"; + exit; + } + + $sql->db_Delete("online", "`online_timestamp` < ".(time() - $online_timeout)); + + global $members_online, $total_online, $member_list, $listuserson; + $total_online = $sql->db_Count("online"); + if ($members_online = $sql->db_Select("online", "*", "online_user_id != '0' ")) { + $member_list = ''; + $listuserson = array(); + while ($row = $sql->db_Fetch()) { + $vals = explode(".", $row['online_user_id'], 2); + $member_list .= "{$vals[1]} "; + $listuserson[$row['online_user_id']] = $row['online_location']; + } + } + define("TOTAL_ONLINE", $total_online); + define("MEMBERS_ONLINE", $members_online); + define("GUESTS_ONLINE", $total_online - $members_online); + define("ON_PAGE", $sql->db_Count("online", "(*)", "WHERE `online_location` = '{$page}' ")); + define("MEMBER_LIST", $member_list); + } else { + define("e_TRACKING_DISABLED", true); + define("TOTAL_ONLINE", ""); + define("MEMBERS_ONLINE", ""); + define("GUESTS_ONLINE", ""); + define("ON_PAGE", ""); + define("MEMBER_LIST", ""); // + } + } +} + +//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------// +function cachevars($id, $var) { + global $cachevar; + $cachevar[$id]=$var; +} + +function getcachedvars($id) { + global $cachevar; + return (isset($cachevar[$id]) ? $cachevar[$id] : false); +} + +//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------// +class floodprotect { + function flood($table, $orderfield) { + /* + # Test for possible flood + # + # - parameter #1 string $table, table being affected + # - parameter #2 string $orderfield, date entry in respective table + # - return boolean + # - scope public + */ + $sql=new db; + + if (FLOODPROTECT == TRUE) { + $sql->db_Select($table, "*", "ORDER BY ".$orderfield." DESC LIMIT 1", "no_where"); + $row=$sql->db_Fetch(); + return ($row[$orderfield] > (time() - FLOODTIMEOUT) ? FALSE : TRUE); + } else { + return TRUE; + } + } +} + +//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------// +//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------// +function init_session() { + /* + # Validate user + # + # - parameters none + # - return boolean + # - scope public + */ + global $sql, $pref, $user_pref, $tp, $currentUser, $e107; + + define('USERIP', $e107->getip()); + if (!isset($_COOKIE[$pref['cookie_name']]) && !isset($_SESSION[$pref['cookie_name']])) { + define("USER", FALSE); + define("USERTHEME", FALSE); + define("ADMIN", FALSE); + define("GUEST", TRUE); + define('USERCLASS', ''); + define('USEREMAIL', ''); + } else { + list($uid, $upw)=(isset($_COOKIE[$pref['cookie_name']]) && $_COOKIE[$pref['cookie_name']] ? explode(".", $_COOKIE[$pref['cookie_name']]) : explode(".", $_SESSION[$pref['cookie_name']])); + + if (empty($uid) || empty($upw)) { + cookie($pref['cookie_name'], "", (time() - 2592000)); + $_SESSION[$pref['cookie_name']] = ""; + session_destroy(); + define("ADMIN", FALSE); + define("USER", FALSE); + define("USERCLASS", ""); + define("LOGINMESSAGE",CORE_LAN10."

"); + return (FALSE); + } + + $result = get_user_data($uid); + if(is_array($result) && md5($result['user_password']) == $upw) + { + + define("USERID", $result['user_id']); + define("USERNAME", $result['user_name']); + define("USERURL", (isset($result['user_homepage']) ? $result['user_homepage'] : false)); + define("USEREMAIL", $result['user_email']); + define("USER", TRUE); + define("USERCLASS", $result['user_class']); + define("USERREALM", $result['user_realm']); + define("USERVIEWED", $result['user_viewed']); + define("USERIMAGE", $result['user_image']); + define("USERSESS", $result['user_sess']); + + $update_ip = ($result['user_ip'] != USERIP ? ", user_ip = '".USERIP."'" : ""); + + if($result['user_currentvisit'] + 3600 < time() || !$result['user_lastvisit']) + { + $result['user_lastvisit'] = $result['user_currentvisit']; + $result['user_currentvisit'] = time(); + $sql->db_Update("user", "user_visits = user_visits + 1, user_lastvisit = '{$result['user_lastvisit']}', user_currentvisit = '{$result['user_currentvisit']}', user_viewed = ''{$update_ip} WHERE user_id='".USERID."' "); + } + else + { + $result['user_currentvisit'] = time(); + $sql->db_Update("user", "user_currentvisit = '{$result['user_currentvisit']}'{$update_ip} WHERE user_id='".USERID."' "); + } + + $currentUser = $result; + $currentUser['user_realname'] = $result['user_login']; // Used by force_userupdate + define("USERLV", $result['user_lastvisit']); + + if ($result['user_ban'] == 1) { exit; } + + $user_pref = unserialize($result['user_prefs']); + + if (isset($_POST['settheme'])) { + $user_pref['sitetheme'] = ($pref['sitetheme'] == $_POST['sitetheme'] ? "" : $_POST['sitetheme']); + save_prefs("user"); + } + + define("USERTHEME", (isset($user_pref['sitetheme']) && file_exists(e_THEME.$user_pref['sitetheme']."/theme.php") ? $user_pref['sitetheme'] : FALSE)); + global $ADMIN_DIRECTORY, $PLUGINS_DIRECTORY; + if ($result['user_admin']) { + define("ADMIN", TRUE); + define("ADMINID", $result['user_id']); + define("ADMINNAME", $result['user_name']); + define("ADMINPERMS", $result['user_perms']); + define("ADMINEMAIL", $result['user_email']); + define("ADMINPWCHANGE", $result['user_pwchange']); + } else { + define("ADMIN", FALSE); + } + } else { + define("USER", FALSE); + define("USERTHEME", FALSE); + define("ADMIN", FALSE); + define("CORRUPT_COOKIE", TRUE); + define("USERCLASS", ""); + } + } + + define('USERCLASS_LIST', class_list()); + define('e_CLASS_REGEXP', "(^|,)(".str_replace(",", "|", USERCLASS_LIST).")(,|$)"); +} + +$sql->db_Mark_Time('Start: Go online'); +if(isset($pref['track_online']) && $pref['track_online']) { + $e_online->online($pref['track_online'], $pref['flood_protect']); +} + +function cookie($name, $value, $expire, $path = "/", $domain = "", $secure = 0) { + setcookie($name, $value, $expire, $path, $domain, $secure); +} + +// +// Use these to combine isset() and use of the set value. or defined and use of a constant +// i.e. to fix if($pref['foo']) ==> if ( varset($pref['foo']) ) will use the pref, or ''. +// Can set 2nd param to any other default value you like (e.g. false, 0, or whatever) +// $testvalue adds additional test of the value (not just isset()) +// Examples: +// $something = pref; // Bug if pref not set ==> $something = varset(pref); +// $something = isset(pref) ? pref : ""; ==> $something = varset(pref); +// $something = isset(pref) ? pref : default; ==> $something = varset(pref,default); +// $something = isset(pref) && pref ? pref : default; ==> $something = varset(pref,default, true); +// +function varset(&$val,$default='',$testvalue=false) { + if (isset($val)) { + return (!$testvalue || $val) ? $val : $default; + } + return $default; +} +function defset($str,$default='',$testvalue=false) { + if (defined($str)) { + return (!$testvalue || constant($str)) ? constant($str) : $default; + } + return $default; +} + +// +// These variants are like the above, but only return the value if both set AND 'true' +// +function varsettrue(&$val,$default='') { + if (isset($val) && $val) return $val; + return $default; +} +function defsettrue($str,$default='') { + if (defined($str) && constant($str)) return constant($str); + return $default; +} + +//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------// +function message_handler($mode, $message, $line = 0, $file = "") { + e107_require_once(e_HANDLER."message_handler.php"); + show_emessage($mode, $message, $line, $file); +} + +// ----------------------------------------------------------------------------- +function table_exists($check) { + if (!$GLOBALS['mySQLtablelist']) { + $tablist=mysql_list_tables($GLOBALS['mySQLdefaultdb']); + while (list($temp) = mysql_fetch_array($tablist)) { + $GLOBALS['mySQLtablelist'][] = $temp; + } + } + + $mltable=MPREFIX.strtolower($check); + + foreach ($GLOBALS['mySQLtablelist'] as $lang) { + if (strpos($lang, $mltable) !== FALSE) { + return TRUE; + } + } +} + +function class_list($uid = '') { + $clist=array(); + + if ($uid == '') + { + if (USER === TRUE) + { + if(USERCLASS) + { + $clist=explode(',', USERCLASS); + } + $clist[]=e_UC_MEMBER; + if (ADMIN === TRUE) { + $clist[] = e_UC_ADMIN; + } + } else { + $clist[] = e_UC_GUEST; + } + $clist[]=e_UC_READONLY; + $clist[]=e_UC_PUBLIC; + return implode(',', $clist); + } +} + +// --------------------------------------------------------------------------- +function e107_include($fname) { + global $e107_debug; + $ret = ($e107_debug ? include($fname) : @include($fname)); + return $ret; +} + +function e107_include_once($fname) { + global $e107_debug; + if(is_readable($fname)){ + $ret = (!$e107_debug)? @include_once($fname) : include_once($fname); + } + return (isset($ret)) ? $ret : ""; +} + +function e107_require_once($fname) { + global $e107_debug; + $ret = ($e107_debug ? require_once($fname) : @require_once($fname)); + return $ret; +} + +function e107_require($fname) { + global $e107_debug; + $ret = ($e107_debug ? require($fname) : @require($fname)); + return $ret; +} + +function include_lan($path, $force = false) { + if (!is_readable($path)) { + $path = str_replace(e_LANGUAGE, 'English', $path); + } + $ret = ($force) ? include($path) : include_once($path); + return (isset($ret)) ? $ret : ""; +} + +if(!function_exists("print_a")) { + function print_a($var, $return = false) { + if(!$return){ + echo '
'.print_r($var, true).'
'; + return true; + } else { + return '
'.print_r($var, true).'
'; + } + } +} + +function force_userupdate() { + + global $sql,$pref,$currentUser; + + if (e_PAGE == "usersettings.php" || strpos(e_SELF, ADMINDIR) == TRUE) + { + return FALSE; + } + + $signup_option_names = array("realname", "signature", "image", "timezone", "class"); + + foreach($signup_option_names as $key => $value) + { + if ($pref['signup_option_'.$value] == 2 && !$currentUser['user_'.$value]) + { + return TRUE; + } + } + + if($sql -> db_Select("user_extended_struct", "user_extended_struct_name", "user_extended_struct_required = '1'")) + { + while($row = $sql -> db_Fetch()) + { + $user_extended_struct_name = "user_{$row['user_extended_struct_name']}"; + + if(!$currentUser[$user_extended_struct_name]) + { + return TRUE; + } + } + } + + return FALSE; +} + +class error_handler { + + var $errors; + var $debug = false; + + function error_handler() { + if ((isset($_SERVER['QUERY_STRING']) && strpos($_SERVER['QUERY_STRING'], 'debug=') !== FALSE) || isset($_COOKIE['e107_debug_level'])) { + $this->debug = true; + error_reporting(E_ALL); + } else { + error_reporting(E_ERROR | E_PARSE); + } + } + + function handle_error($type, $message, $file, $line, $context) { + switch($type) { + case E_NOTICE: + if ($this->debug == true) { + $error['short'] = "Notice: {$message}, Line {$line} of {$file}
\n"; + $trace = debug_backtrace(); + $backtrace[0] = (isset($trace[1]) ? $trace[1] : ""); + $backtrace[1] = (isset($trace[2]) ? $trace[2] : ""); + $error['trace'] = $backtrace; + $this->errors[] = $error; + } + break; + case E_WARNING: + if ($this->debug == true) { + $error['short'] = "Warning: {$message}, Line {$line} of {$file}
\n"; + $trace = debug_backtrace(); + $backtrace[0] = (isset($trace[1]) ? $trace[1] : ""); + $backtrace[1] = (isset($trace[2]) ? $trace[2] : ""); + $error['trace'] = $backtrace; + $this->errors[] = $error; + } + break; + case E_USER_ERROR: + if ($this->debug == true) { + $error['short'] = "    Internal Error Message: {$message}, Line {$line} of {$file}
\n"; + $trace = debug_backtrace(); + $backtrace[0] = (isset($trace[1]) ? $trace[1] : ""); + $backtrace[1] = (isset($trace[2]) ? $trace[2] : ""); + $error['trace'] = $backtrace; + $this->errors[] = $error; + } + default: + return true; + break; + } + } + + function return_errors() { + $index = 0; $colours[0] = "#C1C1C1"; $colours[1] = "#B6B6B6"; + $ret = "\n"; + foreach ($this->errors as $key => $value) { + $ret .= "\t\n\t\t\n\t\n"; + $ret .= "\t\n\n"; + if($index == 0) { $index = 1; } else { $index = 0; } + } + $ret .= "
{$value['short']}
"; + return $ret; + } + + function trigger_error($information, $level) { + trigger_error($information); + } +} + +/** + * Strips slashes from a var if magic_quotes_gqc is enabled + * + * @param mixed $data + * @return mixed + */ +function strip_if_magic($data) { + if (MAGIC_QUOTES_GPC == true) { + return array_stripslashes($data); + } else { + return $data; + } +} + +/** + * Strips slashes from a string or an array + * + * @param mixed $value + * @return mixed + */ +function array_stripslashes($data) { + return is_array($data) ? array_map('array_stripslashes', $data) : stripslashes($data); +} + +$sql->db_Mark_Time('(After class2)'); + + +function e107_ini_set($var, $value){ + if (function_exists('ini_set')){ + ini_set($var, $value); + } +} + +?> diff --git a/comment.php b/comment.php new file mode 100644 index 000000000..052bd1cb7 --- /dev/null +++ b/comment.php @@ -0,0 +1,326 @@ +db_Select("polls", "poll_title", "`poll_id` = {$id} AND `poll_comment` = 1")) { + header("location: ".e_BASE."index.php"); + exit; + } + } else if($table == "news") { + if (!$sql->db_Select("news", "news_allow_comments", "`news_id` = {$id} AND `news_allow_comments` = 0")) { + header("location: ".e_BASE."index.php"); + exit; + } + } + + $pid = (isset($_POST['pid']) ? $_POST['pid'] : 0); + $pid = intval($pid); + + $editpid = intval((isset($_POST['editpid']) ? $_POST['editpid'] : false)); + + $clean_authorname = $_POST['author_name']; + $clean_comment = $_POST['comment']; + $clean_subject = $_POST['subject']; + + $cobj->enter_comment($clean_authorname, $clean_comment, $table, $id, $pid, $clean_subject); + if ($table == "news") { + $e107cache->clear("news"); + } else { + $e107cache->clear("comment.php?{$table}.{$id}"); + } + + if($editpid) { + $redir = preg_replace("#\.edit.*#si", "", e_QUERY); + header("Location: ".e_SELF."?{$redir}"); + exit; + } +} + +if (isset($_POST['replysubmit'])) +{ + + if ($table == "news" && !$sql->db_Select("news", "news_allow_comments", "news_id='{$nid}' ")) { + header("location:".e_BASE."index.php"); + exit; + } else { + $row = $sql->db_Fetch(); + if (!$row['news_id']) { + $pid = (isset($_POST['pid']) ? $_POST['pid'] : 0); + $pid = intval($pid); + + $clean_authorname = $_POST['author_name']; + $clean_comment = $_POST['comment']; + $clean_subject = $_POST['subject']; + + $cobj->enter_comment($clean_authorname, $clean_comment, $table, $nid, $pid, $clean_subject); + $e107cache->clear("comment.php?{$table}.{$id}"); + } + //plugin e_comment.php files + $plugin_redir = false; + $e_comment = $cobj->get_e_comment(); + if ($table == $e_comment[$table]['eplug_comment_ids']){ + $plugin_redir = TRUE; + $reply_location = str_replace("{NID}", $nid, $e_comment[$table]['reply_location']); + } + + if ($plugin_redir) + { + echo "\n"; + exit; + } elseif ($table == "news" || $table == "poll") + { + echo "\n"; + exit; + } elseif($table == "bugtrack") + { + echo "\n"; + exit; + } elseif($table == "faq") + { + echo "\n"; + exit; + } elseif ($table == "content") + { + echo "\n"; + exit; + } elseif ($table == "download") + { + echo "\n"; + exit; + } elseif ($table == "page") + { + echo "\n"; + exit; + } + } +} + +if ($action == "reply") { + if (!$pref['nested_comments']) { + header("Location: ".e_BASE."comment.php?comment.{$table}.{$nid}"); + exit; + } + $query = "`comment_id` = '{$id}' LIMIT 0,1"; + if ($sql->db_Select("comments", "comment_subject", "`comment_id` = '{$id}'")) { + list($comments['comment_subject']) = $sql->db_Fetch(); + $not_parsed_subject = $comments['comment_subject']; + $subject = $tp->toHTML($comments['comment_subject']); + + } + if ($subject == "") { + if ($table == "news") { + if (!$sql->db_Select("news", "news_title", "news_id='{$nid}' ")) { + header("location: ".e_BASE."index.php"); + exit; + } else { + list($news['news_title']) = $sql->db_Fetch(); + $subject = $news['news_title']; + $title = COMLAN_100; + } + } elseif ($table == "poll") { + if (!$sql->db_Select("polls", "poll_title", "poll_id='{$nid}' ")) { + header("location:".e_BASE."index.php"); + exit; + } else { + list($poll['poll_title']) = $sql->db_Fetch(); + $subject = $poll['poll_title']; + $title = COMLAN_101; + } + } elseif ($table == "content") { + $sql->db_Select("content", "content_heading", "content_id='{$nid}'"); + $subject = $content['content_heading']; + } elseif ($table == "bugtracker") { + $sql->db_Select("bugtrack", "bugtrack_summary", "bugtrack_id='{$nid}'"); + $subject = $content['content_heading']; + } + } + if ($table == "content") { + $sql->db_Select("content", "content_type", "content_id='{$nid}'"); + list($content['content_type']) = $sql->db_Fetch(); + if ($content['content_type'] == "0") { + $content_type = "article"; + $title = COMLAN_103; + } elseif ($content['content_type'] == "3") { + $content_type = "review"; + $title = COMLAN_104; + } elseif ($content['content_type'] == "1") { + $content_type = "content"; + $title = COMLAN_105; + } + } + + define('e_PAGETITLE', $title." / ".COMLAN_99." / ".COMLAN_102.$subject.""); + require_once(HEADERF); +} else { + + + if ($cache = $e107cache->retrieve("comment.php?{$table}.{$id}")) { + require_once(HEADERF); + echo $cache; + require_once(FOOTERF); + exit; + } else { + if ($table == "news") { + /* + changes by jalist 19/01/05: + updated db query removed one call + */ + + if(isset($pref['trackbackEnabled']) && $pref['trackbackEnabled']) { + $query = "SELECT COUNT(tb.trackback_pid) AS tb_count, n.*, u.user_id, u.user_name, u.user_customtitle, nc.category_name, nc.category_icon FROM #news AS n + LEFT JOIN #user AS u ON n.news_author = u.user_id + LEFT JOIN #news_category AS nc ON n.news_category = nc.category_id + LEFT JOIN #trackback AS tb ON tb.trackback_pid = n.news_id + WHERE n.news_class REGEXP '".e_CLASS_REGEXP."' + AND n.news_id={$id} + AND n.news_allow_comments=0 + GROUP by n.news_id"; + } else { + $query = "SELECT n.*, u.user_id, u.user_name, u.user_customtitle, nc.category_name, nc.category_icon FROM #news AS n + LEFT JOIN #user AS u ON n.news_author = u.user_id + LEFT JOIN #news_category AS nc ON n.news_category = nc.category_id + WHERE n.news_class REGEXP '".e_CLASS_REGEXP."' + AND n.news_id={$id} + AND n.news_allow_comments=0"; + } + + if (!$sql->db_Select_gen($query)) { + header("location:".e_BASE."index.php"); + exit; + } else { + $news = $sql->db_Fetch(); + $subject = $tp->toForm($news['news_title']); + define("e_PAGETITLE", COMLAN_100." / ".COMLAN_99." / {$subject}"); + require_once(HEADERF); + ob_start(); + $ix = new news; + $ix->render_newsitem($news, "extend"); // extend so that news-title-only news text is displayed in full when viewing comments. + $field = $news['news_id']; + $comtype = 0; + } + } + else if($table == "poll") { + if (!$sql->db_Select("polls", "*", "poll_id='{$id}'")) { + header("location:".e_BASE."index.php"); + exit; + } else { + $row = $sql->db_Fetch(); + $comments_poll = $row['poll_comment']; + $subject = $row['poll_title']; + define("e_PAGETITLE", COMLAN_101." / ".COMLAN_99." / ".$subject.""); + require_once(HEADERF); + require(e_PLUGIN."poll/poll_menu.php"); + $field = $row['poll_id']; + $comtype = 4; + + if(!$comments_poll) + { + require_once(FOOTERF); + exit; + } + } + } + require_once(HEADERF); + } +} + +if(isset($pref['trackbackEnabled']) && $pref['trackbackEnabled'] && $table == "news"){ + echo "".$pref['trackbackString']." ".$e107->http_path.e_PLUGIN."trackback/trackback.php?pid={$id}"; +} +$field = ($field ? $field : ($id ? $id : "")); +$width = (isset($width) && $width ? $width : ""); +$cobj->compose_comment($table, $action, $field, $width, $subject, $rate=FALSE); + +if (!strstr(e_QUERY, "poll")) { + $cache = ob_get_contents(); + $e107cache->set("comment.php?{$table}.{$field}", $cache); +} +ob_end_flush(); // dump the buffer we started + + +if(isset($pref['trackbackEnabled']) && $pref['trackbackEnabled'] && $table == "news"){ + if($sql->db_Select("trackback", "*", "trackback_pid={$id}")) + { + $tbArray = $sql -> db_getList(); + + if (file_exists(THEME."trackback_template.php")) { + require_once(THEME."trackback_template.php"); + } else { + require_once(e_THEME."templates/trackback_template.php"); + } + + $text = ""; + + foreach($tbArray as $trackback) + { + extract($trackback); + $TITLE = $trackback_title; + $EXCERPT = $trackback_excerpt; + $BLOGNAME = "{$trackback_blogname}"; + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TRACKBACK); + } + + if($TRACKBACK_RENDER_METHOD) + { + $ns->tablerender("".COMLAN_315, $text); + } + else + { + echo "".$text; + } + } + else + { + echo "".COMLAN_316; + } + if (ADMIN && getperms("B")) { + echo "
".COMLAN_317."

"; + } +} + + +require_once(FOOTERF); + +?> \ No newline at end of file diff --git a/contact.php b/contact.php new file mode 100644 index 000000000..a9e499723 --- /dev/null +++ b/contact.php @@ -0,0 +1,160 @@ +toEmail($_POST['author_name'],TRUE); + $sender = check_email($_POST['email_send']); + $subject = $tp->toEmail($_POST['subject'],TRUE); + $body = $tp->toEmail($_POST['body'],TRUE); + +// Check Image-Code + if (isset($_POST['rand_num']) && !$sec_img->verify_code($_POST['rand_num'], $_POST['code_verify'])) + { + $error .= LANCONTACT_15."\\n"; + } + +// Check message body. + if(strlen(trim($_POST['body'])) < 15) + { + $error .= LANCONTACT_12."\\n"; + } + +// Check subject line. + if(strlen(trim($_POST['subject'])) < 2) + { + $error .= LANCONTACT_13."\\n"; + } + + if(!strpos(trim($_POST['email_send']),"@")) + { + $error .= LANCONTACT_11."\\n"; + } + + +// Check email address on remote server (if enabled). + if ($pref['signup_remote_emailcheck'] && $error == "") + { + require_once(e_HANDLER."mail_validation_class.php"); + list($adminuser,$adminhost) = split ("@", SITEADMINEMAIL); + $validator = new email_validation_class; + $validator->localuser= $adminuser; + $validator->localhost= $adminhost; + $validator->timeout=3; + // $validator->debug=1; + // $validator->html_debug=1; + if($validator->ValidateEmailBox($sender) != 1) + { + $error .= LANCONTACT_11."\\n"; + } + + } + +// No errors - so proceed to email the admin and the user (if selected). + if(!$error) + { + $body .= "\n\nIP:\t".USERIP."\n"; + $body .= "User:\t#".USERID." ".USERNAME."\n"; + + if(!$_POST['contact_person'] && isset($pref['sitecontacts'])) // only 1 person, so contact_person not posted. + { + if($pref['sitecontacts'] == e_UC_MAINADMIN) + { + $query = "user_perms = '0' OR user_perms = '0.' "; + } + elseif($pref['sitecontacts'] == e_UC_ADMIN) + { + $query = "user_admin = 1 "; + } + else + { + $query = $pref['sitecontacts'] . " IN (user_class) "; + } + } + else + { + $query = "user_id = ".$_POST['contact_person']; + } + + if($sql -> db_Select("user", "user_name,user_email",$query." LIMIT 1")) + { + $row = $sql -> db_Fetch(); + $send_to = $row['user_email']; + $send_to_name = $row['user_name']; + } + else + { + $send_to = SITEADMINEMAIL; + $send_to_name = ADMIN; + } + + require_once(e_HANDLER."mail.php"); + $message = (sendemail($send_to,"[".SITENAME."] ".$subject, $body,$send_to_name,$sender,$sender_name)) ? LANCONTACT_09 : LANCONTACT_10; + if(isset($pref['contact_emailcopy']) && $pref['contact_emailcopy'] && $_POST['email_copy'] == 1){ + sendemail($sender,"[".SITENAME."] ".$subject, $body,ADMIN,$sender,$sender_name); + } + $ns -> tablerender('', $message); + require_once(FOOTERF); + exit; + } + else + { + require_once(e_HANDLER."message_handler.php"); + message_handler("P_ALERT", $error); + } + +} + +if(SITECONTACTINFO && $CONTACT_INFO) +{ + $text = $tp->toHTML($CONTACT_INFO,"","parse_sc"); + $ns -> tablerender(LANCONTACT_01, $text,"contact"); +} + +if(isset($pref['sitecontacts']) && $pref['sitecontacts'] != 255) +{ + require_once(e_FILE."shortcode/batch/contact_shortcodes.php"); + $text = $tp->parseTemplate($CONTACT_FORM, TRUE, $contact_shortcodes); + + if(trim($text) != "") + { + $ns -> tablerender(LANCONTACT_02, $text, "contact"); + } +} +require_once(FOOTERF); +exit; +?> diff --git a/content.php b/content.php new file mode 100644 index 000000000..cd47082f4 --- /dev/null +++ b/content.php @@ -0,0 +1,73 @@ + db_Select("plugin", "*", "plugin_path = 'content' AND plugin_installflag = '1' ")){ + //require_once($plugindir."handlers/content_class.php"); + //$aa = new content; + + $tmp = explode(".", e_QUERY); + if($tmp[0]){ + //get type_id from the row with heading content, article or review + //this will only work if the three main parents are not renamed ! + if(!$sql -> db_Select("pcontent", "content_id", "content_heading='".$tp -> toDB($tmp[0])."'")){ + header("location:".e_PLUGIN."content/content.php"); + }else{ + $row = $sql -> db_Fetch(); + } + } + if ($tmp[0] == "content") { + if (is_numeric($tmp[1])) { //content view + + $tmp[1] = intval($tmp[1]); + header("location:".e_PLUGIN."content/content.php?content.".$tmp[1]); + + }else{ //content recent page + header("location:".e_PLUGIN."content/content.php?recent.".$row['content_id']); + } + + }elseif ($tmp[0] == "article" || $tmp[0] == "review") { + + if (is_numeric($tmp[1])) { //item view + $tmp[1] = intval($tmp[1]); + header("location:".e_PLUGIN."content/content.php?content.".$tmp[1]); + + }elseif($tmp[1] == "cat" ) { //category page + + if(!$tmp[2] || $tmp[2] == "0") { //all categories + //$mainparent = $aa -> getMainParent($tmp[2]); + //header("location:".e_PLUGIN."content/content.php?cat.list.".$mainparent.""); + header("location:".e_PLUGIN."content/content.php"); + + }else{ //view category + header("location:".e_PLUGIN."content/content.php?cat.".$tmp[2]); + } + + } else { //recent page + header("location:".e_PLUGIN."content/content.php?recent.".$row['content_id']); + } + }else{ //redirect to new content main page + header("location:".e_PLUGIN."content/content.php"); + } +} +//##### END REDIRECTION MANAGEMENT ------------------------------------------------------------------------- + +?> \ No newline at end of file diff --git a/download.php b/download.php new file mode 100644 index 000000000..42feb3eb7 --- /dev/null +++ b/download.php @@ -0,0 +1,739 @@ +toHTML($pref['agree_text'],TRUE,"parse_sc"); +$cobj = new comment; +global $tp; + +if(!defined("USER_WIDTH")){ define("USER_WIDTH","width:100%"); } + +// To prevent display of sub-categories on the main display, un-comment the following line +//$pref['download_subsub'] = '0'; + + +/* define images */ +define("IMAGE_DOWNLOAD", (file_exists(THEME."images/download.png") ? THEME."images/download.png" : e_IMAGE."generic/".IMODE."/download.png")); +define("IMAGE_NEW", (file_exists(THEME."images/new.png") ? THEME."images/new.png" : e_IMAGE."generic/".IMODE."/new.png")); + +/* define image style */ + +if (!e_QUERY || $_GET['elan']) +{ + require_once(HEADERF); + // no qs - render categories ... + + if($cacheData = $e107cache->retrieve("download_cat",720)) // expires every 12 hours. + { + echo $cacheData; + require_once(FOOTERF); + exit; + } + + + if (!$DOWNLOAD_CAT_PARENT_TABLE) + { + if (is_readable(THEME."templates/download_template.php")) + { + require_once(THEME."templates/download_template.php"); + } + elseif (is_readable(THEME."download_template.php")) + { + require_once(THEME."download_template.php"); + } + else + { + require_once(e_BASE.$THEMES_DIRECTORY."templates/download_template.php"); + } + } + if(!defined("DL_IMAGESTYLE")){ define("DL_IMAGESTYLE","border:1px solid blue");} + + $qry = " + SELECT dc.*, SUM(d.download_filesize) AS d_size, + COUNT(d.download_id) AS d_count, + MAX(d.download_datestamp) as d_last, + SUM(d.download_requested) as d_requests, + COUNT(d2.download_id) AS d_subcount, + SUM(d2.download_filesize) AS d_subsize, + SUM(d2.download_requested) as d_subrequests + FROM #download_category AS dc + LEFT JOIN #download AS d ON dc.download_category_id = d.download_category AND d.download_active > 0 AND d.download_visible IN (".USERCLASS_LIST.") + LEFT JOIN #download_category as dc2 ON dc2.download_category_parent=dc.download_category_id + LEFT JOIN #download AS d2 ON dc2.download_category_id = d2.download_category AND d2.download_active > 0 AND d2.download_visible IN (".USERCLASS_LIST.") + WHERE dc.download_category_class IN (".USERCLASS_LIST.") + GROUP by dc.download_category_id ORDER by dc.download_category_order + "; + if (!$sql->db_Select_gen($qry)) + { + $ns->tablerender(LAN_dl_18, "
".LAN_dl_2."
"); + require_once(FOOTERF); + exit; + } + else + { + while($row = $sql->db_Fetch()) + { + $catList[$row['download_category_parent']][] = $row; + } + foreach($catList[0] as $row) + { // Display main category headings, then sub-categories, optionally with sub-sub categories expanded + $download_cat_table_string .= parse_download_cat_parent_table($row); + foreach($catList[$row['download_category_id']] as $crow) + { + if (isset($pref['download_subsub']) && ($pref['download_subsub'] == '0')) + { // Don't display sub-sub categories here + $download_cat_table_string .= parse_download_cat_child_table($crow, FALSE); + } + else + { // Display sub-sub categories + $download_cat_table_string .= parse_download_cat_child_table($crow, $catList[$crow['download_category_id']]); + } + } + } + } + + $download_cat_table_start = preg_replace("/\{(.*?)\}/e", '$\1', $DOWNLOAD_CAT_TABLE_START); + + $DOWNLOAD_CAT_NEWDOWNLOAD_TEXT = " ".LAN_dl_36; + $DOWNLOAD_CAT_SEARCH = " +
+

+ + + +

+
"; + + $download_cat_table_end = preg_replace("/\{(.*?)\}/e", '$\1', $DOWNLOAD_CAT_TABLE_END); + $text .= $download_cat_table_start.$download_cat_table_string.$download_cat_table_end; + + + ob_start(); + + if($DOWNLOAD_CAT_TABLE_RENDERPLAIN) { + echo $text; + } else { + $ns->tablerender(LAN_dl_18.$type, $text); + } + + $cache_data = ob_get_flush(); + $e107cache->set("download_cat", $cache_data); + + require_once(FOOTERF); + exit; +} + + +// Got a query string from now on +$tmp = explode(".", e_QUERY); +if (is_numeric($tmp[0])) +{ + $from = intval($tmp[0]); + $action = preg_replace("#\W#", "", $tp -> toDB($tmp[1])); + $id = intval($tmp[2]); + $view = intval($tmp[3]); + $order = preg_replace("#\W#", "", $tp -> toDB($tmp[4])); + $sort = preg_replace("#\W#", "", $tp -> toDB($tmp[5])); +} + else +{ + $action = preg_replace("#\W#", "", $tp -> toDB($tmp[0])); + $id = intval($tmp[1]); +} + +if (isset($_POST['commentsubmit'])) +{ + if (!$sql->db_Select("download", "download_comment", "download_id = '{$id}' ")) + { + header("location:".e_BASE."index.php"); + exit; + } + else + { + $row = $sql->db_Fetch(); + if ($row['download_comment'] && (ANON === TRUE || USER === TRUE)) + { + $clean_authorname = $_POST['author_name']; + $clean_comment = $_POST['comment']; + $clean_subject = $_POST['subject']; + + $cobj->enter_comment($clean_authorname, $clean_comment, "download", $id, $pid, $clean_subject); + $e107cache->clear("comment.download.{$sub_action}"); + } + } +} + +// ------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +if ($action == "list") { + + if (isset($_POST['view'])) { + extract($_POST); + } + + if (!$from) { + $from = 0; + } + if (!$order) { + $order = ($pref['download_order'] ? $pref['download_order'] : "download_datestamp"); + } + if (!$sort) { + $sort = ($pref['download_sort'] ? $pref['download_sort'] : "DESC"); + } + if (!$view) { + $view = ($pref['download_view'] ? $pref['download_view'] : "10"); + } + + $total_downloads = $sql->db_Count("download", "(*)", "WHERE download_category = '{$id}' AND download_active > 0 AND download_visible REGEXP '".e_CLASS_REGEXP."'"); + +// Next three lines extract page title + if ($sql->db_Select("download_category", "*", "(download_category_id='{$id}') AND (download_category_class IN (".USERCLASS_LIST."))") ) + { + $row = $sql->db_Fetch(); + extract($row); + + $type = $download_category_name; + + $type .= ($download_category_description) ? " [ ".$download_category_description." ]" : ""; + define("e_PAGETITLE", PAGE_NAME." / ".$download_category_name); + } + else + { // No access to this category + define("e_PAGETITLE", PAGE_NAME); + require_once(HEADERF); + $ns->tablerender(LAN_dl_18, "
".LAN_dl_3."
"); + require_once(FOOTERF); + exit; + } + + require_once(HEADERF); + + /* SHOW SUBCATS ... */ + + if($sql -> db_Select("download_category", "download_category_id", "download_category_parent='{$id}' ")) + { + /* there are subcats - display them ... */ + $qry = " + SELECT dc.*, dc2.download_category_name AS parent_name, dc2.download_category_icon as parent_icon, SUM(d.download_filesize) AS d_size, + COUNT(d.download_id) AS d_count, + MAX(d.download_datestamp) as d_last, + SUM(d.download_requested) as d_requests + FROM #download_category AS dc + LEFT JOIN #download AS d ON dc.download_category_id = d.download_category AND d.download_active > 0 AND d.download_visible IN (".USERCLASS_LIST.") + LEFT JOIN #download_category as dc2 ON dc2.download_category_id='{$id}' + WHERE dc.download_category_class IN (".USERCLASS_LIST.") AND dc.download_category_parent='{$id}' + GROUP by dc.download_category_id ORDER by dc.download_category_order + "; + $sql->db_Select_gen($qry); + $scArray = $sql -> db_getList(); + if (!$DOWNLOAD_CAT_PARENT_TABLE) + { + if (file_exists(THEME."download_template.php")) + { + require_once(THEME."download_template.php"); + } + else + { + require_once(e_BASE.$THEMES_DIRECTORY."templates/download_template.php"); + } + } + if(!defined("DL_IMAGESTYLE")){ define("DL_IMAGESTYLE","border:1px solid blue");} + foreach($scArray as $row) + { + $download_cat_table_string .= parse_download_cat_child_table($row, FALSE); + } + if(strstr($row['parent_icon'], chr(1))) { + list($download_category_icon, $download_category_icon_empty) = explode(chr(1), $row['parent_icon']); + } + $DOWNLOAD_CAT_MAIN_ICON = ($download_category_icon ? "" : " "); + $DOWNLOAD_CAT_MAIN_NAME = $tp->toHTML($row['parent_name']); + $download_cat_table_start = preg_replace("/\{(.*?)\}/e", '$\1', $DOWNLOAD_CAT_TABLE_START); + $DOWNLOAD_CAT_NEWDOWNLOAD_TEXT = " ".LAN_dl_36; + $download_cat_table_end = preg_replace("/\{(.*?)\}/e", '$\1', $DOWNLOAD_CAT_TABLE_END); + $text = $download_cat_table_start.$download_cat_table_string.$download_cat_table_end; + if($DOWNLOAD_CAT_TABLE_RENDERPLAIN) + { + echo $text; + } + else + { + $ns->tablerender($type, $text); + } + $text = ""; // If other files, show in a separate block + $type = ""; // Cancel title once displayed + } // End of subcategory display + +// Now display individual downloads + $core_total = $sql->db_Count("download WHERE download_category='{$id}' AND download_active > 0 AND download_visible IN (".USERCLASS_LIST.")"); + if (!check_class($download_category_class)) + { + + $ns->tablerender(LAN_dl_18, "
".LAN_dl_3."
"); + require_once(FOOTERF); + exit; + } + + if(strstr($download_category_icon, chr(1))) + { + list($download_category_icon, $download_category_icon_empty) = explode(chr(1), $download_category_icon); + } + $DOWNLOAD_CATEGORY_ICON = ($download_category_icon ? "" : " "); + + $DOWNLOAD_CATEGORY = $tp->toHTML($download_category_name,FALSE,"emotes_off, no_make_clickable"); + $DOWNLOAD_CATEGORY_DESCRIPTION = $tp -> toHTML($download_category_description, TRUE); + + if (!$DOWNLOAD_LIST_TABLE) { + if (file_exists(THEME."download_template.php")) { + require_once(THEME."download_template.php"); + } else { + require_once(e_BASE.$THEMES_DIRECTORY."templates/download_template.php"); + } + } + if(!defined("DL_IMAGESTYLE")){ define("DL_IMAGESTYLE","border:1px solid blue");} + + $gen = new convert; + require_once(e_HANDLER."rate_class.php"); + $rater = new rater; + $sql = new db; + $sql2 = new db; + + $filetotal = $sql->db_Select("download", "*", "download_category='{$id}' AND download_active > 0 AND download_visible IN (".USERCLASS_LIST.") ORDER BY {$order} {$sort} LIMIT {$from}, {$view}"); + $ft = ($filetotal < $view ? $filetotal : $view); + while ($row = $sql->db_Fetch()) { + extract($row); + $download_list_table_string .= parse_download_list_table($row); + $tdownloads += $download_requested; + } + + $DOWNLOAD_LIST_TOTAL_AMOUNT = $tdownloads." ".LAN_dl_16; + $DOWNLOAD_LIST_TOTAL_FILES = $ft." ".LAN_dl_17; + + $download_list_table_start = preg_replace("/\{(.*?)\}/e", '$\1', $DOWNLOAD_LIST_TABLE_START); + $download_list_table_end = preg_replace("/\{(.*?)\}/e", '$\1', $DOWNLOAD_LIST_TABLE_END); + $text .= $download_list_table_start.$download_list_table_string.$download_list_table_end; + + + if($DOWNLOAD_LIST_TABLE_RENDERPLAIN) { + echo $text; + } else { + $ns->tablerender($type, $text); + } + + + echo "
".LAN_dl_9."

"; + $parms = $total_downloads.",".$view.",".$from.",".e_SELF."?[FROM].list.{$id}.{$view}.{$order}.{$sort}."; + echo ($total_downloads > $view) ? "
 ".$tp->parseTemplate("{NEXTPREV={$parms}}")."
" : ""; + echo "
"; + + require_once(FOOTERF); + exit; +} // end of action=="list" + + +// ---------------- View Mode --------------------------------------------------------------------------------------------------------------------------------------------------- + +if ($action == "view") { + + $gen = new convert; + + $highlight_search = FALSE; + if (isset($_POST['highlight_search'])) { + $highlight_search = TRUE; + } + + $query = " + SELECT d.*, dc.* FROM #download AS d + LEFT JOIN #download_category AS dc ON d.download_category = dc.download_category_id + WHERE d.download_id = {$id} AND d.download_active > 0 + AND d.download_visible IN (".USERCLASS_LIST.") + AND dc.download_category_class IN (".USERCLASS_LIST.") + LIMIT 1"; + + if(!$sql -> db_Select_gen($query)){ + require_once(HEADERF); + $ns->tablerender(LAN_dl_18, "
".LAN_dl_3."
"); + require_once(FOOTERF); + exit; + } + + $dl = $sql -> db_Fetch(); + + if (!isset($DOWNLOAD_VIEW_TABLE) && is_readable(THEME."download_template.php")) + { + include_once(THEME."download_template.php"); + } + else + { + include_once(e_THEME."templates/download_template.php"); + } + + if(!defined("DL_IMAGESTYLE")){ define("DL_IMAGESTYLE","border:0px");} + if(!isset($DL_VIEW_PAGETITLE)) + { + $DL_VIEW_PAGETITLE = PAGE_NAME." / {DOWNLOAD_CATEGORY} / {DOWNLOAD_VIEW_NAME}"; + } + + $DL_TITLE = $tp->parseTemplate($DL_VIEW_PAGETITLE, TRUE, $download_shortcodes); + + define("e_PAGETITLE", $DL_TITLE); + + require_once(HEADERF); + $DL_TEMPLATE = $DOWNLOAD_VIEW_TABLE_START.$DOWNLOAD_VIEW_TABLE.$DOWNLOAD_VIEW_TABLE_END; + $text = $tp->parseTemplate($DL_TEMPLATE, TRUE, $download_shortcodes); + + if(!isset($DL_VIEW_CAPTION)) + { + $DL_VIEW_CAPTION = "{DOWNLOAD_VIEW_CAPTION}"; + } + + if(!isset($DL_VIEW_NEXTPREV)) + { + $DL_VIEW_NEXTPREV = " +
+ + + + + + +
{DOWNLOAD_VIEW_PREV}{DOWNLOAD_BACK_TO_LIST}{DOWNLOAD_VIEW_NEXT}
+
+ "; + } + // ------- Next/Prev ----------- + $text .= $tp->parseTemplate($DL_VIEW_NEXTPREV,TRUE,$download_shortcodes); + $caption = $tp->parseTemplate($DL_VIEW_CAPTION,TRUE,$download_shortcodes); + + if($DOWNLOAD_VIEW_TABLE_RENDERPLAIN) { + echo $text; + } else { + + $ns->tablerender($caption, $text); + } + + unset($text); + + if ($dl['download_comment']) { + $cobj->compose_comment("download", "comment", $id, $width,$dl['download_name'], $showrate=FALSE); + } + + require_once(FOOTERF); + exit; + +} + +// ---------------- Report Broken Link Mode --------------------------------------------------------------------------------------------------------------------------------------------------- + +if ($action == "report" && check_class($pref['download_reportbroken'])) { + if (!$sql->db_Select("download", "*", "download_id = {$id} AND download_active > 0")) { + require_once(HEADERF); + require_once(FOOTERF); + exit; + } + + $row = $sql -> db_Fetch(); + extract($row); + + if (isset($_POST['report_download'])) { + $report_add = $tp -> toDB($_POST['report_add']); + $download_name = $tp -> toDB($download_name); + $user = USER ? USERNAME : LAN_dl_52; + + if ($pref['download_email']) { // this needs to be moved into the NOTIFY, with an event. + require_once(e_HANDLER."mail.php"); + $subject = LAN_dl_60." ".SITENAME; + $report = LAN_dl_58." ".SITENAME.":\n".(substr(SITEURL, -1) == "/" ? SITEURL : SITEURL."/")."download.php?view.".$download_id."\n + ".LAN_dl_59." ".$user."\n".$report_add; + sendemail(SITEADMINEMAIL, $subject, $report); + } + + $sql->db_Insert('generic', "0, 'Broken Download', ".time().",'".USERID."', '{$download_name}', {$id}, '{$report_add}'"); + + define("e_PAGETITLE", PAGE_NAME." / ".LAN_dl_47); + require_once(HEADERF); + + $text = LAN_dl_48."

".LAN_dl_49."tablerender(LAN_dl_50, $text); + + } else { + define("e_PAGETITLE", PAGE_NAME." / ".LAN_dl_51." ".$download_name); + require_once(HEADERF); + + $text = "
+ + + + + + + + + + + + +
+ ".LAN_dl_32.": ".$download_name."
+ + ".LAN_dl_53." + +
+
".LAN_dl_54."
".LAN_dl_55." +
+ +

+ +
"; + $ns->tablerender(LAN_dl_50, $text); + } + require_once(FOOTERF); + exit; +} + +// ---------------- Mirror Mode --------------------------------------------------------------------------------------------------------------------------------------------------- + + +if($action == "mirror") +{ + require_once(HEADERF); + + if (!$DOWNLOAD_MIRROR_START) { + if (file_exists(THEME."download_template.php")) { + require_once(THEME."download_template.php"); + } else { + require_once(e_BASE.$THEMES_DIRECTORY."templates/download_template.php"); + } + } + + $sql -> db_Select("download_mirror"); + $mirrorList = $sql -> db_getList("ALL", 0, 200, "mirror_id"); + + if($sql -> db_Select("download", "*", "download_id = {$id}")) + { + $row = $sql->db_Fetch(); + + extract($row); + $array = explode(chr(1), $download_mirror); + + $c = (count($array)-1); + for ($i=1; $i<$c; $i++) { + $d = mt_rand(0, $i); + $tmp = $array[$i]; + $array[$i] = $array[$d]; + $array[$d] = $tmp; + } + + $download_mirror = ""; + foreach($array as $mirrorstring) + { + if($mirrorstring) + { + $download_mirror .= parse_download_mirror_table($row, $mirrorstring, $mirrorList); + } + } + + $DOWNLOAD_MIRROR_HOST_LAN = LAN_dl_68; + $DOWNLOAD_MIRROR_GET_LAN = LAN_dl_32; + $DOWNLOAD_MIRROR_LOCATION_LAN = LAN_dl_70; + $DOWNLOAD_MIRROR_DESCRIPTION_LAN = LAN_dl_71; + $DOWNLOAD_MIRROR_REQUEST = LAN_dl_72."'".$download_name."'"; + + $download_mirror_start = preg_replace("/\{(.*?)\}/e", '$\1', $DOWNLOAD_MIRROR_START); + $download_mirror_end = preg_replace("/\{(.*?)\}/e", '$\1', $DOWNLOAD_MIRROR_END); + + $text = $download_mirror_start.$download_mirror.$download_mirror_end; + + if($DOWNLOAD_MIRROR_RENDERPLAIN) { + echo $text; + } else { + $ns->tablerender(LAN_dl_67, $text); + } + + require_once(FOOTERF); + } +} + +function parse_download_mirror_table($row, $mirrorstring, $mirrorList) +{ + + global $DOWNLOAD_MIRROR; + list($mirrorHost_id, $mirrorHost_url, $mirrorRequests) = explode(",", $mirrorstring); + + extract($mirrorList[$mirrorHost_id]); + + $DOWNLOAD_MIRROR_NAME = "
{$mirror_name}"; + $DOWNLOAD_MIRROR_IMAGE = ($mirror_image ? "" : ""); + $DOWNLOAD_MIRROR_LOCATION = ($mirror_location ? $mirror_location : ""); + $DOWNLOAD_MIRROR_DESCRIPTION = ($mirror_description ? $mirror_description : ""); + + $DOWNLOAD_MIRROR_FILESIZE = parsesize($row['download_filesize']); + $DOWNLOAD_MIRROR_LINK = ""; + + $DOWNLOAD_MIRROR_REQUESTS = (ADMIN ? LAN_dl_73.$mirrorRequests : ""); + $DOWNLOAD_TOTAL_MIRROR_REQUESTS = (ADMIN ? LAN_dl_74.$mirror_count : ""); + + return(preg_replace("/\{(.*?)\}/e", '$\1', $DOWNLOAD_MIRROR)); +} + +function parsesize($size) { + $kb = 1024; + $mb = 1024 * $kb; + $gb = 1024 * $mb; + $tb = 1024 * $gb; + if(!$size) + { + return '0'; + } + if ($size < $kb) { + return $size." b"; + } + else if($size < $mb) { + return round($size/$kb, 2)." kb"; + } + else if($size < $gb) { + return round($size/$mb, 2)." mb"; + } + else if($size < $tb) { + return round($size/$gb, 2)." gb"; + } else { + return round($size/$tb, 2)." tb"; + } +} + +function parse_download_cat_parent_table($row) { + global $tp,$current_row,$DOWNLOAD_CAT_PARENT_TABLE; + extract($row); + $current_row = ($current_row) ? 0 : 1; // Alternating CSS for each row.(backwards compatible) + + + $template = ($current_row == 1) ? $DOWNLOAD_CAT_PARENT_TABLE : str_replace("forumheader3","forumheader3 forumheader3_alt",$DOWNLOAD_CAT_PARENT_TABLE); + + if (check_class($download_category_class)) { + $parent_status == "open"; + if(strstr($download_category_icon, chr(1))) + { + list($download_category_icon, $download_category_icon_empty) = explode(chr(1), $download_category_icon); + } + $DOWNLOAD_CAT_MAIN_ICON .= ($download_category_icon ? "" : " "); + $DOWNLOAD_CAT_MAIN_NAME .= $tp->toHTML($download_category_name,FALSE,"emotes_off, no_make_clickable"); + } else { + $parent_status == "closed"; + } + return(preg_replace("/\{(.*?)\}/e", '$\1', $template)); +} + +function parse_download_cat_child_table($row, $subList) +{ + + global $tp,$current_row, $DOWNLOAD_CAT_CHILD_TABLE, $DOWNLOAD_CAT_SUBSUB_TABLE; + + $current_row = ($current_row) ? 0 : 1; // Alternating CSS for each row.(backwards compatible) + $template = ($current_row == 1) ? $DOWNLOAD_CAT_CHILD_TABLE : str_replace("forumheader3","forumheader3 forumheader3_alt",$DOWNLOAD_CAT_CHILD_TABLE); + + + if(USER && $row['d_last'] > USERLV){ + $new = ""; + }else{ + $new = ""; + } + + list($download_category_icon, $download_category_icon_empty) = explode(chr(1), $row['download_category_icon']); + if (!$download_category_icon_empty) + { + $download_category_icon_empty = $download_category_icon; + } + + if(!$row['d_count'] && !$row['d_subcount']) + { + $download_icon = ""; + } + else + { + $download_icon = ""; + } + + $DOWNLOAD_CAT_SUB_ICON = ($row['download_category_icon'] ? $download_icon : " "); + $DOWNLOAD_CAT_SUB_NEW_ICON = $new; + $dcatname=$tp->toHTML($row['download_category_name'],FALSE,"emotes_off, no_make_clickable"); + $DOWNLOAD_CAT_SUB_NAME = ($row['d_count'] ? "".$dcatname."" : $dcatname); + $DOWNLOAD_CAT_SUB_NAME_LINKED = "".$$dcatname.""; + $DOWNLOAD_CAT_SUB_DESCRIPTION = $tp->toHTML($row['download_category_description']); + $DOWNLOAD_CAT_SUB_COUNT = ($row['d_subcount'] ? $row['d_subcount'] : $row['d_count']); + $DOWNLOAD_CAT_SUB_SIZE = parsesize(($row['d_subsize'] ? $row['d_subsize'] : $row['d_size'])); + $DOWNLOAD_CAT_SUB_DOWNLOADED = intval(($row['d_subrequests'] ? $row['d_subrequests'] : $row['d_requests'])); + $DOWNLOAD_CAT_SUBSUB = ""; + // check for subsub cats ... + if($subList != FALSE) + { + foreach($subList as $subrow) + { + list($sub_download_category_icon, $sub_download_category_icon_empty) = explode(chr(1), $subrow['download_category_icon']); + if (!$sub_download_category_icon_empty) + { + $sub_download_category_icon_empty = $sub_download_category_icon; + } + + if(!$row['d_count'] && !$row['d_subcount']) + { + $sub_download_icon = ""; + } + else + { + $sub_download_icon = ""; + } + + $DOWNLOAD_CAT_SUBSUB_ICON = ($subrow['download_category_icon'] ? "$sub_download_icon" : " "); + $DOWNLOAD_CAT_SUBSUB_DESCRIPTION = $tp->toHTML($subrow['download_category_description']); + $DOWNLOAD_CAT_SUBSUB_COUNT = intval($subrow['d_count']); + $DOWNLOAD_CAT_SUBSUB_SIZE = parsesize($subrow['d_size']); + $DOWNLOAD_CAT_SUBSUB_DOWNLOADED = intval($subrow['d_requests']); + + if(USER && $subrow['d_last'] > USERLV) { + $subsub_new = ""; + }else { + $subsub_new = ""; + } + $DOWNLOAD_CAT_SUBSUB_NEW_ICON = $subsub_new; + $DOWNLOAD_CAT_SUBSUB_NAME = ($subrow['d_count'] ? "".$tp->toHTML($subrow['download_category_name'])."" : $tp->toHTML($subrow['download_category_name'],FALSE,"emotes_off, no_make_clickable")); + $DOWNLOAD_CAT_SUBSUB .= preg_replace("/\{(.*?)\}/e", '$\1', $DOWNLOAD_CAT_SUBSUB_TABLE); + } + } + + return(preg_replace("/\{(.*?)\}/e", '$\1', $template)); +} + + +function parse_download_list_table($row) { + global $download_shortcodes,$tp,$current_row,$DOWNLOAD_LIST_TABLE, $rater, $pref, $gen, $agreetext; + + $current_row = ($current_row) ? 0 : 1; // Alternating CSS for each row.(backwards compatible) + $template = ($current_row == 1) ? $DOWNLOAD_LIST_TABLE : str_replace("forumheader3","forumheader3 forumheader3_alt",$DOWNLOAD_LIST_TABLE); + + return $tp->parseTemplate($template,TRUE,$download_shortcodes); + +} + +?> diff --git a/e107.htaccess b/e107.htaccess new file mode 100644 index 000000000..a08f4d689 --- /dev/null +++ b/e107.htaccess @@ -0,0 +1,5 @@ +ErrorDocument 400 /error.php?400 +ErrorDocument 401 /error.php?401 +ErrorDocument 403 /error.php?403 +ErrorDocument 404 /error.php?404 +ErrorDocument 500 /error.php?500 \ No newline at end of file diff --git a/e107_admin/ad_links.php b/e107_admin/ad_links.php new file mode 100644 index 000000000..41abf641e --- /dev/null +++ b/e107_admin/ad_links.php @@ -0,0 +1,465 @@ +"); +} +if (!defined('E_32_CAT_USER')) { + define('E_32_CAT_USER', ""); +} +if (!defined('E_32_CAT_CONT')) { + define('E_32_CAT_CONT', ""); +} +if (!defined('E_32_CAT_FILE')) { + define('E_32_CAT_FILE', ""); +} +if (!defined('E_32_CAT_TOOL')) { + define('E_32_CAT_TOOL', ""); +} +if (!defined('E_32_CAT_PLUG')) { + define('E_32_CAT_PLUG', ""); +} + +// Small Nav Images +if (!defined('E_16_NAV_MAIN')) { + define('E_16_NAV_MAIN', e_IMAGE.'admin_images/main_16.png'); +} +if (!defined('E_16_NAV_DOCS')) { + define('E_16_NAV_DOCS', e_IMAGE.'admin_images/docs_16.png'); +} +if (!defined('E_16_NAV_LEAV')) { + define('E_16_NAV_LEAV', e_IMAGE.'admin_images/leave_16.png'); +} +if (!defined('E_16_NAV_LGOT')) { + define('E_16_NAV_LGOT', e_IMAGE.'admin_images/logout_16.png'); +} +if (!defined('E_16_NAV_ARROW')) { + define('E_16_NAV_ARROW', e_IMAGE.'admin_images/arrow_16.png'); +} +if (!defined('E_16_NAV_ARROW_OVER')) { + define('E_16_NAV_ARROW_OVER', e_IMAGE.'admin_images/arrow_over_16.png'); +} + +// Large Nav Images +if (!defined('E_32_NAV_MAIN')) { + define('E_32_NAV_MAIN', ""); +} +if (!defined('E_32_NAV_DOCS')) { + define('E_32_NAV_DOCS', ""); +} +if (!defined('E_32_NAV_LEAV')) { + define('E_32_NAV_LEAV', ""); +} +if (!defined('E_32_NAV_LGOT')) { + define('E_32_NAV_LGOT', ""); +} +if (!defined('E_32_NAV_ARROW')) { + define('E_32_NAV_ARROW', ""); +} +if (!defined('E_32_NAV_ARROW_OVER')) { + define('E_32_NAV_ARROW_OVER', ""); +} + +// Small Admin Main Link Images +if (!defined('E_16_ADMIN')) { + define('E_16_ADMIN', ""); +} +if (!defined('E_16_ADPASS')) { + define('E_16_ADPASS', ""); +} +if (!defined('E_16_BANLIST')) { + define('E_16_BANLIST', ""); +} +if (!defined('E_16_BANNER')) { + define('E_16_BANNER', ""); +} +if (!defined('E_16_CACHE')) { + define('E_16_CACHE', ""); +} +if (!defined('E_16_CREDITS')) { + define('E_16_CREDITS', ""); +} +if (!defined('E_16_CUST')) { + define('E_16_CUST', ""); +} +if (!defined('E_16_DATAB')) { + define('E_16_DATAB', ""); +} +if (!defined('E_16_DOWNL')) { + define('E_16_DOWNL', ""); +} +if (!defined('E_16_EMOTE')) { + define('E_16_EMOTE', ""); +} +if (!defined('E_16_FILE')) { + define('E_16_FILE', ""); +} +if (!defined('E_16_FORUM')) { + define('E_16_FORUM', ""); +} +if (!defined('E_16_FRONT')) { + define('E_16_FRONT', ""); +} +if (!defined('E_16_IMAGES')) { + define('E_16_IMAGES', ""); +} +if (!defined('E_16_INSPECT')) { + define('E_16_INSPECT', ""); +} +if (!defined('E_16_LINKS')) { + define('E_16_LINKS', ""); +} +if (!defined('E_16_WELCOME')) { + define('E_16_WELCOME', ""); +} +if (!defined('E_16_MAIL')) { + define('E_16_MAIL', ""); +} +if (!defined('E_16_MAINTAIN')) { + define('E_16_MAINTAIN', ""); +} +if (!defined('E_16_MENUS')) { + define('E_16_MENUS', ""); +} +if (!defined('E_16_META')) { + define('E_16_META', ""); +} +if (!defined('E_16_NEWS')) { + define('E_16_NEWS', ""); +} +if (!defined('E_16_NEWSFEED')) { + define('E_16_NEWSFEED', ""); +} +if (!defined('E_16_NOTIFY')) { + define('E_16_NOTIFY', ""); +} +if (!defined('E_16_PHP')) { + define('E_16_PHP', ""); +} +if (!defined('E_16_POLLS')) { + define('E_16_POLLS', ""); +} +if (!defined('E_16_PREFS')) { + define('E_16_PREFS', ""); +} +if (!defined('E_16_SEARCH')) { + define('E_16_SEARCH', ""); +} +if (!defined('E_16_UPLOADS')) { + define('E_16_UPLOADS', ""); +} +if (!defined('E_16_USER')) { + define('E_16_USER', ""); +} +if (!defined('E_16_USER_EXTENDED')) { + define('E_16_USER_EXTENDED', ""); +} +if (!defined('E_16_USERCLASS')) { + define('E_16_USERCLASS', ""); +} +if (!defined('E_16_LANGUAGE')) { + define('E_16_LANGUAGE', ""); +} + +// Small Admin Other Link Images +if (!defined('E_16_PLUGIN')) { + define('E_16_PLUGIN', ""); +} +if (!defined('E_16_PLUGMANAGER')) { + define('E_16_PLUGMANAGER', ""); +} +if (!defined('E_16_DOCS')) { + define('E_16_DOCS', ""); +} +if (!defined('E_16_THEMEMANAGER')) { + define('E_16_THEMEMANAGER', ""); +} + +// Small Admin Other Images +if (!defined('E_16_COMMENT')) { + define('E_16_COMMENT', ""); +} +if (!defined('E_16_ADMINLOG')) { + define('E_16_ADMINLOG', ""); +} + +// Large Admin Main Link Images +if (!defined('E_32_ADMIN')) { + define('E_32_ADMIN', ""); +} +if (!defined('E_32_ADPASS')) { + define('E_32_ADPASS', ""); +} +if (!defined('E_32_BANLIST')) { + define('E_32_BANLIST', ""); +} +if (!defined('E_32_BANNER')) { + define('E_32_BANNER', ""); +} +if (!defined('E_32_CACHE')) { + define('E_32_CACHE', ""); +} +if (!defined('E_32_CREDITS')) { + define('E_32_CREDITS', ""); +} +if (!defined('E_32_CUST')) { + define('E_32_CUST', ""); +} +if (!defined('E_32_DATAB')) { + define('E_32_DATAB', ""); +} +if (!defined('E_32_DOWNL')) { + define('E_32_DOWNL', ""); +} +if (!defined('E_32_EMOTE')) { + define('E_32_EMOTE', ""); +} +if (!defined('E_32_FILE')) { + define('E_32_FILE', ""); +} +if (!defined('E_32_FORUM')) { + define('E_32_FORUM', ""); +} +if (!defined('E_32_FRONT')) { + define('E_32_FRONT', ""); +} +if (!defined('E_32_IMAGES')) { + define('E_32_IMAGES', ""); +} +if (!defined('E_32_INSPECT')) { + define('E_32_INSPECT', ""); +} +if (!defined('E_32_LINKS')) { + define('E_32_LINKS', ""); +} +if (!defined('E_32_WELCOME')) { + define('E_32_WELCOME', ""); +} +if (!defined('E_32_MAIL')) { + define('E_32_MAIL', ""); +} +if (!defined('E_32_MAINTAIN')) { + define('E_32_MAINTAIN', ""); +} +if (!defined('E_32_MENUS')) { + define('E_32_MENUS', ""); +} +if (!defined('E_32_META')) { + define('E_32_META', ""); +} +if (!defined('E_32_NEWS')) { + define('E_32_NEWS', ""); +} +if (!defined('E_32_NEWSFEED')) { + define('E_32_NEWSFEED', ""); +} +if (!defined('E_32_NOTIFY')) { + define('E_32_NOTIFY', ""); +} +if (!defined('E_32_PHP')) { + define('E_32_PHP', ""); +} +if (!defined('E_32_POLLS')) { + define('E_32_POLLS', ""); +} +if (!defined('E_32_PREFS')) { + define('E_32_PREFS', ""); +} +if (!defined('E_32_SEARCH')) { + define('E_32_SEARCH', ""); +} +if (!defined('E_32_UPLOADS')) { + define('E_32_UPLOADS', ""); +} +if (!defined('E_32_USER')) { + define('E_32_USER', ""); +} +if (!defined('E_32_USER_EXTENDED')) { + define('E_32_USER_EXTENDED', ""); +} +if (!defined('E_32_USERCLASS')) { + define('E_32_USERCLASS', ""); +} +if (!defined('E_32_LANGUAGE')) { + define('E_32_LANGUAGE', ""); +} + +// Large Admin Other Link Images +if (!defined('E_32_PLUGIN')) { + define('E_32_PLUGIN', ""); +} +if (!defined('E_32_PLUGMANAGER')) { + define('E_32_PLUGMANAGER', ""); +} +if (!defined('E_32_DOCS')) { + define('E_32_DOCS', ""); +} +if (!defined('E_32_MAIN')) { + define('E_32_MAIN', ""); +} + +if (!defined('E_32_THEMEMANAGER')) { + define('E_32_THEMEMANAGER', ""); +} + +// Large Admin Other Images +if (!defined('E_32_COMMENT')) { + define('E_32_COMMENT', ""); +} +if (!defined('E_32_ADMINLOG')) { + define('E_32_ADMINLOG', ""); +} +if (!defined('E_32_LOGOUT')) { + define('E_32_LOGOUT', ""); +} + +$e_icon_array = array( + 'main' => E_32_MAIN, + 'admin' => E_32_ADMIN, + 'admin_pass' => E_32_ADPASS, + 'banlist' => E_32_BANLIST, + 'banner' => E_32_BANNER, + 'cache' => E_32_CACHE, + 'credits' => E_32_CREDITS, + 'custom' => E_32_CUST, + 'database' => E_32_DATAB, + 'docs' => E_32_DOCS, + 'download' => E_32_DOWNL, + 'emoticon' => E_32_EMOTE, + 'filemanage' => E_32_FILE, + 'fileinspector' => E_32_INSPECT, + 'frontpage' => E_32_FRONT, + 'image' => E_32_IMAGES, + 'language' => E_32_LANGUAGE, + 'links' => E_32_LINKS, + 'mail' => E_32_MAIL, + 'menus' => E_32_MENUS, + 'meta' => E_32_META, + 'newsfeed' => E_32_NEWSFEED, + 'news' => E_32_NEWS, + 'notify' => E_32_NOTIFY, + 'phpinfo' => E_32_PHP, + 'plug_manage' => E_32_PLUGMANAGER, + 'poll' => E_32_POLLS, + 'prefs' => E_32_PREFS, + 'search' => E_32_SEARCH, + 'theme_manage' => E_32_THEMEMANAGER, + 'maintain' => E_32_MAINTAIN, + 'upload' => E_32_UPLOADS, + 'userclass' => E_32_USERCLASS, + 'user_extended' => E_32_USER_EXTENDED, + 'users' => E_32_USER, + 'wmessage' => E_32_WELCOME ); + +$admin_cat['title'][1] = ADLAN_CL_1; +$admin_cat['id'][1] = 'setMenu'; +$admin_cat['img'][1] = E_16_CAT_SETT; +$admin_cat['lrg_img'][1] = E_32_CAT_SETT; + +$admin_cat['title'][2] = ADLAN_CL_2; +$admin_cat['id'][2] = 'userMenu'; +$admin_cat['img'][2] = E_16_CAT_USER; +$admin_cat['lrg_img'][2] = E_32_CAT_USER; + +$admin_cat['title'][3] = ADLAN_CL_3; +$admin_cat['id'][3] = 'contMenu'; +$admin_cat['img'][3] = E_16_CAT_CONT; +$admin_cat['lrg_img'][3] = E_32_CAT_CONT; + +$admin_cat['title'][4] = ADLAN_CL_6; +$admin_cat['id'][4] = 'toolMenu'; +$admin_cat['img'][4] = E_16_CAT_TOOL; +$admin_cat['lrg_img'][4] = E_32_CAT_TOOL; + +$admin_cat['title'][5] = ADLAN_CL_7; +$admin_cat['id'][5] = 'plugMenu'; +$admin_cat['img'][5] = E_16_CAT_PLUG; +$admin_cat['lrg_img'][5] = E_32_CAT_PLUG; + +// Info about attributes +/* +attribute 1 = link +attribute 2 = title +attribute 3 = description +attribute 4 = perms +attribute 5 = category +attribute 6 = 16 x 16 image +attribute 7 = 32 x 32 image +*/ + +$array_functions = array( + 0 => array(e_ADMIN."administrator.php", ADLAN_8, ADLAN_9, "3", 2, E_16_ADMIN, E_32_ADMIN), + 1 => array(e_ADMIN."updateadmin.php", ADLAN_10, ADLAN_11, "", 2, E_16_ADPASS, E_32_ADPASS), + 2 => array(e_ADMIN."banlist.php", ADLAN_34, ADLAN_35, "4", 2, E_16_BANLIST, E_32_BANLIST), + 3 => array(e_ADMIN."banner.php", ADLAN_54, ADLAN_55, "D", 3, E_16_BANNER, E_32_BANNER), + 4 => array(e_ADMIN."cache.php", ADLAN_74, ADLAN_75, "C", 1, E_16_CACHE, E_32_CACHE), + 5 => array(e_ADMIN."cpage.php", ADLAN_42, ADLAN_43, "5", 3, E_16_CUST, E_32_CUST), + 6 => array(e_ADMIN."db.php", ADLAN_44, ADLAN_45, "0", 4, E_16_DATAB, E_32_DATAB), + 7 => array(e_ADMIN."download.php", ADLAN_24, ADLAN_25, "R", 3, E_16_DOWNL, E_32_DOWNL), + 8 => array(e_ADMIN."emoticon.php", ADLAN_58, ADLAN_59, "F", 1, E_16_EMOTE, E_32_EMOTE), + 9 => array(e_ADMIN."filemanager.php", ADLAN_30, ADLAN_31, "6", 4, E_16_FILE, E_32_FILE), + 10 => array(e_ADMIN."frontpage.php", ADLAN_60, ADLAN_61, "G", 1, E_16_FRONT, E_32_FRONT), + 11 => array(e_ADMIN."image.php", ADLAN_105, ADLAN_106, "A", 1, E_16_IMAGES, E_32_IMAGES), + 12 => array(e_ADMIN."links.php", ADLAN_138, ADLAN_139, "I", 1, E_16_LINKS, E_32_LINKS), + 13 => array(e_ADMIN."wmessage.php", ADLAN_28, ADLAN_29, "M", 3, E_16_WELCOME, E_32_WELCOME), + 14 => array(e_ADMIN."ugflag.php", ADLAN_40, ADLAN_41, "9", 4, E_16_MAINTAIN, E_32_MAINTAIN), + 15 => array(e_ADMIN."menus.php", ADLAN_6, ADLAN_7, "2", 3, E_16_MENUS, E_32_MENUS), + 16 => array(e_ADMIN."meta.php", ADLAN_66, ADLAN_67, "T", 1, E_16_META, E_32_META), + 17 => array(e_ADMIN."newspost.php", ADLAN_0, ADLAN_1, "H", 3, E_16_NEWS, E_32_NEWS), + 18 => array(e_ADMIN."phpinfo.php", ADLAN_68, ADLAN_69, "0", 4, E_16_PHP, E_32_PHP), + 19 => array(e_ADMIN."prefs.php", ADLAN_4, ADLAN_5, "1", 1, E_16_PREFS, E_32_PREFS), + 20 => array(e_ADMIN."search.php", ADLAN_142, ADLAN_143, "X", 1, E_16_SEARCH, E_32_SEARCH), + 21 => array(e_ADMIN."theme.php", ADLAN_140, ADLAN_141, "1", 4, E_16_THEMEMANAGER, E_32_THEMEMANAGER), + 22 => array(e_ADMIN."upload.php", ADLAN_72, ADLAN_73, "V", 3, E_16_UPLOADS, E_32_UPLOADS), + 23 => array(e_ADMIN."users.php", ADLAN_36, ADLAN_37, "4", 2, E_16_USER, E_32_USER), + 24 => array(e_ADMIN."userclass2.php", ADLAN_38, ADLAN_39, "4", 2, E_16_USERCLASS, E_32_USERCLASS), + 25 => array(e_ADMIN."language.php", ADLAN_132, ADLAN_133, "0", 1, E_16_LANGUAGE, E_32_LANGUAGE), + 26 => array(e_ADMIN."mailout.php", ADLAN_136, ADLAN_137, "W", 2, E_16_MAIL, E_32_MAIL), + 27 => array(e_ADMIN."users_extended.php", ADLAN_78, ADLAN_79, "4", 2, E_16_USER_EXTENDED, E_32_USER_EXTENDED), + 28 => array(e_ADMIN."fileinspector.php", ADLAN_147, ADLAN_148, "Y", 4, E_16_INSPECT, E_32_INSPECT), + 29 => array(e_ADMIN."notify.php", ADLAN_149, ADLAN_150, "O", 4, E_16_NOTIFY, E_32_NOTIFY) + ); +?> diff --git a/e107_admin/admin.php b/e107_admin/admin.php new file mode 100644 index 000000000..eb443c266 --- /dev/null +++ b/e107_admin/admin.php @@ -0,0 +1,269 @@ +
+
".$HANDLERS_DIRECTORY."htmlarea/
".$ADMIN_DIRECTORY."htmlarea/
"; + $ns -> tablerender(ADLAN_ERR_1, $text); +} + +// check for old modules. +if(getperms('0') && isset($pref['modules']) && $pref['modules'] && $sql->db_Field("plugin",5) == "plugin_addons"){ + + $mods=explode(",", $pref['modules']); + $thef = "e_module.php"; + foreach ($mods as $mod) + { + if (is_readable(e_PLUGIN."{$mod}/module.php")) + { + $mod_found[] = e_PLUGIN."{$mod}/module.php"; + } + } + + if($mod_found) + { + $text = ADLAN_ERR_5." ".$thef.":

    "; + foreach($mod_found as $val){ + $text .= "
  • ".str_replace("../","",$val)."
  • \n"; + } + $text .="

+ + ".ADLAN_ERR_6." + +
"; + $ns -> tablerender(ADLAN_ERR_4,$text); + } +} + +// check for file-types; +if (is_readable(e_ADMIN.'filetypes.php')) { + $a_types = strtolower(trim(file_get_contents(e_ADMIN.'filetypes.php'))); +} else { + $a_types = 'zip, gz, jpg, png, gif'; +} + +$a_types = explode(',', $a_types); +foreach ($a_types as $f_type) { + $allowed_types[] = '.'.trim(str_replace('.', '', $f_type)); +} + +// avatar check. +$public = array(e_FILE.'public', e_FILE.'public/avatars'); +foreach ($public as $dir) { + if (is_dir($dir)) { + if ($dh = opendir($dir)) { + while (($file = readdir($dh)) !== false) { + if (is_dir($dir."/".$file) == FALSE && $file != '.' && $file != '..' && $file != '/' && $file != 'CVS' && $file != 'avatars' && $file != 'Thumbs.db' && $file !=".htaccess" && $file !="php.ini") { + $fext = substr(strrchr($file, "."), 0); + if (!in_array(strtolower($fext), $allowed_types) ) { + if ($file == 'index.html' || $file == "null.txt") { + if (filesize($dir.'/'.$file)) { + $potential[] = str_replace('../', '', $dir).'/'.$file; + } + } else { + $potential[] = str_replace('../', '', $dir).'/'.$file; + } + } + } + } + closedir($dh); + } + } +} + +if (isset($potential)) { + $text = ADLAN_ERR_3."

"; + + foreach ($potential as $p_file) { + $text .= $p_file.'
'; + } + + $ns -> tablerender(ADLAN_ERR_1, $text); +} + +// update users using old layout names to their new names +$update_prefs = FALSE; +if (!$pref['adminstyle'] || $pref['adminstyle'] == 'default') { + $pref['adminstyle'] = 'compact'; + $update_prefs = true; +} +if ($pref['adminstyle'] == 'adminb') { + $pref['adminstyle'] = 'cascade'; + $update_prefs = true; +} +if ($pref['adminstyle'] == 'admin_etalkers') { + $pref['adminstyle'] = 'categories'; + $update_prefs = true; +} +if ($pref['adminstyle'] == 'admin_combo') { + $pref['adminstyle'] = 'combo'; + $update_prefs = true; +} +if ($pref['adminstyle'] == 'admin_classis') { + $pref['adminstyle'] = 'classis'; + $update_prefs = true; +} + +// temporary code to switch users using admin_jayya to jayya + +if ($pref['admintheme'] == 'admin_jayya') { + $pref['admintheme'] = 'jayya'; + $update_prefs = true; +} + +if ($pref['sitetheme'] == 'admin_jayya') { + $pref['sitetheme'] = 'jayya'; + $update_prefs = true; +} + +// --------------------------------------------------------- + + +if ($update_prefs == true) { + save_prefs(); +} + +// auto db update +if ('0' == ADMINPERMS) { + require_once(e_ADMIN.'update_routines.php'); + update_check(); +} +// end auto db update + +if (e_QUERY == 'purge' && getperms('0')) { + $admin_log->purge_log_events(false); +} + +$td = 1; +if(!defined("ADLINK_COLS")){ + define("ADLINK_COLS",5); +} +function render_links($link, $title, $description, $perms, $icon = FALSE, $mode = FALSE) { + global $td,$tp; + $text = ''; + if (getperms($perms)) { + if ($mode == 'adminb') { + $text = " +
+ ".$icon." ".$title." ".($description ? "[ ".$description." ]" : "")."
"; + } else { + if ($td == (ADLINK_COLS+1)) { + $text .= ''; + $td = 1; + } + if ($td == 1) { + $text .= ''; + } + if ($mode == 'default') { + $text .= "".$icon." ".$tp->toHTML($title,FALSE,"defs emotes_off").""; + } + else if ($mode == 'classis') { + $text .= "".$icon."
+ ".$tp->toHTML($title,FALSE,"defs emotes_off")."

"; + }elseif ($mode == 'beginner'){ + $text .= "".$icon." +
+ ".$tp->toHTML($title,FALSE,"defs emotes_off")."



"; + } + $td++; + } + } + return $text; +} + +function render_clean() { + global $td; + while ($td <= ADLINK_COLS) { + $text .= ""; + $td++; + } + $text .= ""; + $td = 1; + return $text; +} + +$newarray = asortbyindex($array_functions, 1); + +require_once(e_ADMIN.'includes/'.$pref['adminstyle'].'.php'); + +function admin_info() { + global $tp; + + $width = (getperms('0')) ? "33%" : "50%"; + + $ADMIN_INFO_TEMPLATE = " +
+ + + + "; + + if(getperms('0')) + { + $ADMIN_INFO_TEMPLATE .= " + "; + } + + $ADMIN_INFO_TEMPLATE .= " +
+ {ADMIN_STATUS} + + {ADMIN_LATEST} + {ADMIN_LOG}
"; + + return $tp->parseTemplate($ADMIN_INFO_TEMPLATE); +} + +function status_request() { + global $pref; + if ($pref['adminstyle'] == 'classis' || $pref['adminstyle'] == 'cascade' || $pref['adminstyle'] == 'beginner') { + return TRUE; + } else { + return FALSE; + } +} + +function latest_request() { + global $pref; + if ($pref['adminstyle'] == 'classis' || $pref['adminstyle'] == 'cascade' || $pref['adminstyle'] == 'beginner') { + return TRUE; + } else { + return FALSE; + } +} + +function log_request() { + global $pref; + if ($pref['adminstyle'] == 'classis' || $pref['adminstyle'] == 'cascade'|| $pref['adminstyle'] == 'beginner') { + return TRUE; + } else { + return FALSE; + } +} + +require_once("footer.php"); + +?> diff --git a/e107_admin/admin_classis.php b/e107_admin/admin_classis.php new file mode 100644 index 000000000..88d452c31 --- /dev/null +++ b/e107_admin/admin_classis.php @@ -0,0 +1,27 @@ + \ No newline at end of file diff --git a/e107_admin/admin_combo.php b/e107_admin/admin_combo.php new file mode 100644 index 000000000..8fc0da148 --- /dev/null +++ b/e107_admin/admin_combo.php @@ -0,0 +1,27 @@ + \ No newline at end of file diff --git a/e107_admin/admin_etalkers.php b/e107_admin/admin_etalkers.php new file mode 100644 index 000000000..cebcc1886 --- /dev/null +++ b/e107_admin/admin_etalkers.php @@ -0,0 +1,27 @@ + \ No newline at end of file diff --git a/e107_admin/admin_log.php b/e107_admin/admin_log.php new file mode 100644 index 000000000..9e827a2ea --- /dev/null +++ b/e107_admin/admin_log.php @@ -0,0 +1,114 @@ +db_Delete('dblog'); +} + +$total = $sql -> db_Select("dblog", "*", "ORDER BY `dblog_datestamp` DESC", "no_where"); +$query = "SELECT l.*, u.user_name FROM #dblog AS l LEFT JOIN #user AS u ON l.dblog_user_id = u.user_id ORDER BY l.dblog_datestamp DESC LIMIT $from,$amount"; +$sql -> db_Select_gen($query); + +if(!is_object($gen)) { + $gen = new convert; +} + $parms = $total.",".$amount.",".$from.",".e_SELF.'?fm=[FROM]'; + $text .= "

".$tp->parseTemplate("{NEXTPREV={$parms}}")."

"; +$text .= "
\n"; + +$text .= " + + + + + + + + \n"; + +while ($row = $sql -> db_Fetch()) { + $datestamp = $gen->convert_date($row['dblog_datestamp'], 'short'); + $image = get_log_img($row['dblog_type']); + $text .= " \n"; + $text .= " \n"; + $text .= " \n"; + $text .= " \n"; + $text .= " \n"; + $text .= " \n"; + $text .= ($row['user_name']) ? " \n" : " \n"; + $text .= " \n"; +} + +$text .= "
 ".LAN_ADMINLOG_1."".LAN_ADMINLOG_2."".LAN_ADMINLOG_3."".LAN_ADMINLOG_4."".LAN_ADMINLOG_5."
{$image}{$datestamp}".$tp->toHtml($row['dblog_title'],FALSE,"defs")."".$tp->toHtml($row['dblog_remarks'],FALSE,"defs")."{$row['dblog_ip']}{$row['user_name']}{$row['dblog_user_id']}
\n"; + + $text .= "

".$tp->parseTemplate("{NEXTPREV={$parms}}")."
"; + +$ns->tablerender(LAN_ADMINLOG_0, $text); +require_once("footer.php"); + +function get_log_img($log_type) { + switch ($log_type) { + case E_LOG_INFORMATIVE: + return "".LAN_ADMINLOG_6.""; + break; + case E_LOG_NOTICE: + return "".LAN_ADMINLOG_8.""; + break; + case E_LOG_WARNING: + return "".LAN_ADMINLOG_10.""; + break; + case E_LOG_FATAL: + return "".LAN_ADMINLOG_12.""; + break; + case E_LOG_PLUGIN; + return "".LAN_ADMINLOG_6.""; + break; + } + return $log_type; +} + +function headerjs() { +?> + + diff --git a/e107_admin/adminb.php b/e107_admin/adminb.php new file mode 100644 index 000000000..df223b1ec --- /dev/null +++ b/e107_admin/adminb.php @@ -0,0 +1,27 @@ + \ No newline at end of file diff --git a/e107_admin/administrator.php b/e107_admin/administrator.php new file mode 100644 index 000000000..9168d4e5f --- /dev/null +++ b/e107_admin/administrator.php @@ -0,0 +1,377 @@ +db_Select("user", "*", "user_id='".$_POST['a_id']."' "); + $row = $sql->db_Fetch(); + $a_name = $row['user_name']; + + $perm = ""; + + foreach($_POST['perms'] as $value) + { + if ($value == "0") + { + if (!getperms('0')) { $value = ""; break; } + + $perm = "0."; break; + } + + if ($value) + { + $perm .= $value."."; + } + } + + admin_update($sql -> db_Update("user", "user_perms='$perm' WHERE user_name='$a_name' "), 'update', ADMSLAN_56." ".$_POST['ad_name']." ".ADMSLAN_2."
"); + unset($ad_name, $a_perms); +} + +if ($_POST['edit_admin'] || $action == "edit") +{ + $edid = array_keys($_POST['edit_admin']); + $theid = ($edid[0]) ? $edid[0] : $sub_action; + $sql->db_Select("user", "*", "user_id=".$theid); + $row = $sql->db_Fetch(); + + if ($a_perms == "0") + { + $text = "
$ad_name ".ADMSLAN_3." +

+ ".ADMSLAN_4."
"; + $ns->tablerender(LAN_ERROR, $text); + require_once("footer.php"); + exit; + } +} + +if (isset($_POST['del_admin'])) +{ + $delid = array_keys($_POST['del_admin']); + $sql->db_Select("user", "*", "user_id= ".$delid[0]); + $row = $sql->db_Fetch(); + + if ($row['user_id'] == 1) + { + $text = "
".$row['user_name']." ".ADMSLAN_6." +

+ ".ADMSLAN_4.""; + $ns->tablerender(ADMSLAN_5, $text); + require_once("footer.php"); + exit; + } + + admin_update($sql -> db_Update("user", "user_admin=0, user_perms='' WHERE user_id= ".$delid[0]), 'update', ADMSLAN_61, LAN_DELETED_FAILED); +} + +if($_POST['edit_admin'] || $action == "edit"){ + edit_administrator($row); +}else{ + show_admins(); +} + +function show_admins(){ + global $sql,$tp,$ns,$pref; + + $sql->db_Select("user", "*", "user_admin='1'"); + + $text = "
+
+
+ + + + + + + + "; + + while ($row = $sql->db_Fetch()) + { + + $text .= " + + + + + + + "; + } + + $text .= "
ID".ADMSLAN_56."".ADMSLAN_18."".LAN_OPTIONS."
".$row['user_id']."".$row['user_name'].""; + + $permtxt = ""; + $text .= renderperms($row['user_perms'],$row['user_id'],"words"); + $text .= ""; + if($row['user_id'] != "1") + { + $text .= " + + toJS(ADMSLAN_59."? [".$row['user_name']."]")."') \" title='".ADMSLAN_59."' style='border:0px' />"; + } + $text .= " 
\n
\n
"; + + $ns->tablerender(ADMSLAN_13, $text); + +} + + + + +function edit_administrator($row){ + global $sql,$tp,$ns,$pref; + $lanlist = explode(",",e_LANLIST); + + $a_id = $row['user_id']; + $ad_name = $row['user_name']; + $a_perms = $row['user_perms']; + + $text = "
+
+ + + + + "; + + $text .=" + + + + "; + + $text .= " + + +
".ADMSLAN_16.": + "; + + $text .= $ad_name; + $text .= ""; + + $text .= " +
".ADMSLAN_18.":
"; + + $text .= checkb("1", $a_perms).ADMSLAN_19."
"; // Alter site preferences + $text .= checkb("2", $a_perms).ADMSLAN_20."
"; // Alter Menus + $text .= checkb("3", $a_perms).ADMSLAN_21."
"; // Modify administrator permissions + $text .= checkb("4", $a_perms).ADMSLAN_22."
"; // Moderate users/bans etc + $text .= checkb("5", $a_perms).ADMSLAN_23."
"; // create/edit custom pages/menus + $text .= checkb("Q", $a_perms).ADMSLAN_24."
"; // Manage download categories + $text .= checkb("6", $a_perms).ADMSLAN_25."
"; // Upload /manage files + $text .= checkb("Y", $a_perms).ADMSLAN_67."
"; // file inspector + $text .= checkb("O", $a_perms).ADMSLAN_68."
"; // notify + $text .= checkb("7", $a_perms).ADMSLAN_26."
"; // Oversee news categories + $text .= checkb("8", $a_perms).ADMSLAN_27."
"; // Oversee link categories + $text .= checkb("C", $a_perms).ADMSLAN_64."
"; // Clear Cache - Previously moderate chatbox + $text .= checkb("9", $a_perms).ADMSLAN_28."
"; // Take site down for maintenance + $text .= checkb("W", $a_perms).ADMSLAN_65."

"; // Configure mail settings and mailout + + $text .= checkb("D", $a_perms).ADMSLAN_29."
"; // Manage banners + $text .= checkb("E", $a_perms).ADMSLAN_30."
"; // Configure news feed headlines + $text .= checkb("F", $a_perms).ADMSLAN_31."
"; // Configure emoticons + $text .= checkb("G", $a_perms).ADMSLAN_32."
"; // Configure front page content + $text .= checkb("S", $a_perms).ADMSLAN_33."
"; // Configure log/stats + $text .= checkb("T", $a_perms).ADMSLAN_34."
"; // Configure meta tags + $text .= checkb("V", $a_perms).ADMSLAN_35."
"; // Configure public file uploads + $text .= checkb("X", $a_perms).ADMSLAN_66."
"; // Configure Search + $text .= checkb("A", $a_perms).ADMSLAN_36."
"; // Configure Image Settings (Previously Moderate forums - NOW PLUGIN) + $text .= checkb("B", $a_perms).ADMSLAN_37."
"; // Moderate comments + $text .= checkb("H", $a_perms).ADMSLAN_39."
"; // Post news + $text .= checkb("I", $a_perms).ADMSLAN_40."
"; // Post links +// $text .= checkb("J", $a_perms).ADMSLAN_41."
"; // Post articles - NOW PLUGIN +// $text .= checkb("K", $a_perms).ADMSLAN_42."
"; // Post reviews - NOW PLUGIN +// $text .= checkb("L", $a_perms).ADMSLAN_43."
"; // Post content pages - NOW PLUGIN + $text .= checkb("R", $a_perms).ADMSLAN_44."
"; // Post downloads + $text .= checkb("U", $a_perms).ADMSLAN_45."
"; // Post polls + $text .= checkb("M", $a_perms).ADMSLAN_46."
"; // Welcome message + $text .= checkb("N", $a_perms).ADMSLAN_47."

"; // Moderate submitted news + + $text .= "
".ADLAN_CL_7."

"; + $text .= checkb("Z", $a_perms).ADMSLAN_62."

"; // Plugin Manager + + $sql->db_Select("plugin", "*", "plugin_installflag='1'"); + while ($row = $sql->db_Fetch()) + { + $text .= checkb("P".$row['plugin_id'], $a_perms).LAN_PLUGIN." - ".$row['plugin_name']."
"; + } + +// Language Rights.. -------------- + if($pref['multilanguage']) + { + sort($lanlist); + $text .= "
".ADLAN_132."

\n"; + $text .= checkb($pref['sitelanguage'], $a_perms).$pref['sitelanguage']."
\n"; + foreach($lanlist as $langval) + { + $langname = $langval; + $langval = ($langval == $pref['sitelanguage']) ? "" : $langval; + if ($langval) + { + $text .= checkb($langval, $a_perms).$langval."
\n"; + } + } + } + // ------------------------- + + if (getperms('0')) + { + $text .= "

".ADMSLAN_58."

"; + $text .= checkb("0", $a_perms).ADMSLAN_58."
"; + } + + $text .= "

+ ".ADMSLAN_49." - + ".ADMSLAN_51."
+
+
"; + + $text .= " + "; + + $text .= "
+
+
"; + + $text .= "

".ADMSLAN_70."
"; + $ns->tablerender(ADMSLAN_52, $text); +} + + + +require_once("footer.php"); + + + + + + +function checkb($arg, $perms) +{ + if (getperms($arg, $perms)) + { + $par = "\n"; + } + else + { + $par = "\n"; + } + return $par; +} + + +function renderperms($perm,$id){ + global $pref,$sql,$pt; + if($perm == "0"){ + return ADMSLAN_58; + } + $sql2 = new db; + $lanlist = explode(",",e_LANLIST); + + + if(!$pt){ + $pt["1"] = ADMSLAN_19; + $pt["2"] = ADMSLAN_20; + $pt["3"] = ADMSLAN_21; + $pt["4"] = ADMSLAN_22; // Moderate users/bans etc + $pt["5"] = ADMSLAN_23; // create/edit custom pages/menus + $pt["Q"] = ADMSLAN_24; // Manage download categories + $pt["6"] = ADMSLAN_25; // Upload /manage files + $pt["Y"] = ADMSLAN_67; // file inspector + $pt["O"] = ADMSLAN_68; // notify + $pt["7"] = ADMSLAN_26; + $pt["8"] = ADMSLAN_27; + $pt["C"] = ADMSLAN_64; + $pt["9"] = ADMSLAN_28; + $pt["W"] = ADMSLAN_65; + $pt["D"] = ADMSLAN_29; + $pt["E"] = ADMSLAN_30; + $pt["F"] = ADMSLAN_31; + $pt["G"] = ADMSLAN_32; + $pt["S"] = ADMSLAN_33; + $pt["T"] = ADMSLAN_34; + $pt["V"] = ADMSLAN_35; + $pt["X"] = ADMSLAN_66; + $pt["A"] = ADMSLAN_36; // Configure Image Settings + $pt["B"] = ADMSLAN_37; + $pt["H"] = ADMSLAN_39; + $pt["I"] = ADMSLAN_40; + $pt["L"] = ADMSLAN_43; + $pt["R"] = ADMSLAN_44; + $pt["U"] = ADMSLAN_45; + $pt["M"] = ADMSLAN_46; + $pt["N"] = ADMSLAN_47; + $pt["Z"] = ADMSLAN_62; + + + // foreach($lanlist as $lan){ + // $pt[$lan] = $lan; + // } + + $sql2->db_Select("plugin", "*", "plugin_installflag='1'"); + while ($row2 = $sql2->db_Fetch()){ + $pt[("P".$row2['plugin_id'])] = LAN_PLUGIN." - ".$row2['plugin_name']; + } + } + + $tmp = explode(".", $perm); + $langperm = ""; + foreach($tmp as $pms){ + if(in_array($pms, $lanlist)){ + $langperm .= $pms." "; + }else{ + $permtxt[] = $pms; + if($pt[$pms]){ + $ptext[] = $pt[$pms]; + } + } + } + + $ret = implode(" ",$permtxt); + if($pref['multilanguage']){ + $ret .= ", ". $langperm; + } + + $text = "
$ret
+ "; + return $text; + + +} + +?> diff --git a/e107_admin/article.php b/e107_admin/article.php new file mode 100644 index 000000000..5dd55ed0e --- /dev/null +++ b/e107_admin/article.php @@ -0,0 +1,23 @@ + \ No newline at end of file diff --git a/e107_admin/auth.php b/e107_admin/auth.php new file mode 100644 index 000000000..304a8eb42 --- /dev/null +++ b/e107_admin/auth.php @@ -0,0 +1,175 @@ +verify_code($_POST['rand_num'], $_POST['code_verify'])) + { + echo "\n"; + header("location: ../index.php"); + exit; + } + } + + $row = $authresult = $obj->authcheck($_POST['authname'], $_POST['authpass']); + if ($row[0] == "authfail") { + echo "\n"; + header("location: ../index.php"); + exit; + } else { + + $userpass = md5($_POST['authpass']); + $cookieval = $row['user_id'].".".md5($userpass); + + $sql->db_Select("user", "*", "user_name='".$tp -> toDB($_POST['authname'])."'"); + list($user_id, $user_name, $userpass) = $sql->db_Fetch(); + if ($pref['user_tracking'] == "session") { + $_SESSION[$pref['cookie_name']] = $cookieval; + } else { + cookie($pref['cookie_name'], $cookieval, (time()+3600 * 24 * 30)); + } + echo "\n"; + } + } + + $e_sub_cat = 'logout'; + require_once(e_ADMIN."header.php"); + + if (ADMIN == FALSE) { + $obj = new auth; + $obj->authform(); + require_once(e_ADMIN."footer.php"); + exit; + } +} + +//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------// +class auth +{ + + function authform() + { + /* + # Admin auth login + # + # - parameters none + # - return null + # - scope public + */ + + global $use_imagecode, $sec_img; + + $text = "
+
\n + + + + + + + + + + "; + + if ($use_imagecode) { + $text .= " + + + + + "; + } + + $text .= " + + + +
".ADLAN_89."\n
".ADLAN_90."\n
".ADLAN_152." + ". + $sec_img->r_image(). + "
+ + +
+
+
"; + + $au = new e107table; + $au->tablerender(ADLAN_92, $text); + } + + function authcheck($authname, $authpass) + { + /* + # Admin auth check + # - parameter #1: string $authname, entered name + # - parameter #2: string $authpass, entered pass + # - return boolean if fail, else result array + # - scope public + */ + global $tp; + $sql_auth = new db; + $authname = $tp -> toDB(preg_replace("/\sOR\s|\=|\#/", "", $authname)); + if ($sql_auth->db_Select("user", "*", "user_loginname='$authname' AND user_admin='1' ")) + { + $row = $sql_auth->db_Fetch(); + } + else + { + if ($sql_auth->db_Select("user", "*", "user_name='$authname' AND user_admin='1' ")) + { + $row = $sql_auth->db_Fetch(); + } + } + if($row['user_id']) + { + if($row['user_password'] == md5($authpass)) + { + return $row; + } + } + return array("authfail"); + } +} + +//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------// +?> diff --git a/e107_admin/banlist.php b/e107_admin/banlist.php new file mode 100644 index 000000000..b807efaec --- /dev/null +++ b/e107_admin/banlist.php @@ -0,0 +1,131 @@ +toDB($_POST['ban_reason']); + admin_update($sql -> db_Insert("banlist", "'".$_POST['ban_ip']."', '".ADMINID."', '".$_POST['ban_reason']."'"), 'insert'); + unset($ban_ip); +} + +if (isset($_POST['update_ban']) && $_POST['ban_ip'] != "" && strpos($_POST['ban_ip'], ' ') === false) { + $_POST['ban_reason'] = $tp->toDB($_POST['ban_reason']); + admin_update($sql -> db_Update("banlist", "banlist_ip='".$_POST['ban_ip']."', banlist_admin=".ADMINID.", banlist_reason='".$_POST['ban_reason']."' WHERE banlist_ip='".$_POST['old_ip']."'")); + unset($ban_ip); +} + +if ($action == "remove" && isset($_POST['ban_secure'])) { + $sql -> db_Delete("generic", "gen_type='failed_login' AND gen_ip='$sub_action'"); + admin_update($sql -> db_Delete("banlist", "banlist_ip='$sub_action'"), 'delete'); +} + +if ($action == "edit") { + $sql->db_Select("banlist", "*", "banlist_ip='$sub_action'"); + $row = $sql->db_Fetch(); + extract($row); +} else { + unset($banlist_ip, $banlist_reason); + if (e_QUERY && strpos($_SERVER["HTTP_REFERER"], "userinfo")) { + $banlist_ip = $action; + } +} + +$text = ""; + + + +$text .= "
+
+ + + + + + + + + + + + + + + +
".BANLAN_5.": {$rdns_warn} + +
".BANLAN_7.": + +
". +($action == "edit" ? "" : "")." + +
+
+
"; + +if(!varsettrue($pref['enable_rdns'])) +{ + $text .= "

".BANLAN_12."
"; +} + +$ns->tablerender(BANLAN_9, $text); + +if ($action != "edit") { + $text = $rs->form_open("post", e_SELF, "ban_form")."
".$rs->form_hidden("ban_secure", "1"); + if (!$ban_total = $sql->db_Select("banlist","*","ORDER BY banlist_ip","nowhere")) { + $text .= "
".BANLAN_2."
"; + } else { + $text .= " + + + + "; + $count = 0; + while ($row = $sql->db_Fetch()) { + extract($row); + $banlist_reason = str_replace("LAN_LOGIN_18", BANLAN_11, $banlist_reason); + $text .= " + \n"; + $count++; + } + $text .= "
".BANLAN_10."".LAN_OPTIONS."
$banlist_ip
".BANLAN_7.": $banlist_reason
".$rs->form_button("submit", "main_edit_$count", LAN_EDIT, "onclick=\"document.getElementById('ban_form').action='".e_SELF."?edit-$banlist_ip'\"").$rs->form_button("submit", "main_delete_$count", BANLAN_4, "onclick=\"document.getElementById('ban_form').action='".e_SELF."?remove-$banlist_ip'\"")."
\n"; + } + $text .= "
".$rs->form_close(); + $ns->tablerender(BANLAN_3, $text); +} + +require_once("footer.php"); +?> diff --git a/e107_admin/banner.php b/e107_admin/banner.php new file mode 100644 index 000000000..d0b23aadb --- /dev/null +++ b/e107_admin/banner.php @@ -0,0 +1,677 @@ +get_files(e_IMAGE."banners/","",$reject); + +if (isset($_POST['update_menu'])) { + + $menu_pref['banner_caption'] = $tp->toDB($_POST['banner_caption']); + $menu_pref['banner_amount'] = intval($_POST['banner_amount']); + $menu_pref['banner_rendertype'] = intval($_POST['banner_rendertype']); + + if (isset($_POST['catid'])) { + $array_cat = explode("-", $_POST['catid']); + $cat=''; + for($i = 0; $i < count($array_cat); $i++) { + $cat .= $tp->toDB($array_cat[$i])."|"; + } + $cat = substr($cat, 0, -1); + $menu_pref['banner_campaign'] = $cat; + } + + $sysprefs->setArray('menu_pref'); + $message = BANNER_MENU_L2; +} + + + +if ($_POST['createbanner'] || $_POST['updatebanner']) +{ + + $start_date = (!$_POST['startmonth'] || !$_POST['startday'] || !$_POST['startyear'] ? 0 : mktime (0, 0, 0, $_POST['startmonth'], $_POST['startday'], $_POST['startyear'])); + + $end_date = (!$_POST['endmonth'] || !$_POST['endday'] || !$_POST['endyear'] ? 0 : mktime (0, 0, 0, $_POST['endmonth'], $_POST['endday'], $_POST['endyear'])); + + $cli = ($_POST['client_name'] ? $_POST['client_name'] : $_POST['banner_client_sel']); + + if ($_POST['banner_pages']) { + $postcampaign = ($_POST['banner_campaign'] ? $_POST['banner_campaign'] : $_POST['banner_campaign_sel']); + $pagelist = explode("\r\n", $_POST['banner_pages']); + for($i = 0 ; $i < count($pagelist) ; $i++) { + $pagelist[$i] = trim($pagelist[$i]); + } + $plist = implode("|", $pagelist); + $pageparms = $postcampaign."^".$_POST['banner_listtype']."-".$plist; + $pageparms = preg_replace("#\|$#", "", $pageparms); + $pageparms = (trim($_POST['banner_pages']) == '') ? '' : + $pageparms; + $cam = $pageparms; + } else { + $cam = ($_POST['banner_campaign'] ? $_POST['banner_campaign'] : $_POST['banner_campaign_sel']); + } + + if ($_POST['createbanner']) { + admin_update($sql->db_Insert("banner", "0, '".$cli."', '".$_POST['client_login']."', '".$_POST['client_password']."', '".$_POST['banner_image']."', '".$_POST['click_url']."', '".intval($_POST['impressions_purchased'])."', '$start_date', '$end_date', '".$_POST['banner_class']."', 0, 0, '', '".$cam."'"), 'insert', BNRLAN_63); + } else { + admin_update($sql->db_Update("banner", "banner_clientname='".$cli."', banner_clientlogin='".$_POST['client_login']."', banner_clientpassword='".$_POST['client_password']."', banner_image='".$_POST['banner_image']."', banner_clickurl='".$_POST['click_url']."', banner_impurchased='".intval($_POST['impressions_purchased'])."', banner_startdate='$start_date', banner_enddate='$end_date', banner_active='".$_POST['banner_class']."', banner_campaign='".$cam."' WHERE banner_id='".$_POST['eid']."'"), 'update', BNRLAN_64); + } + unset($_POST['client_name'], $_POST['client_login'], $_POST['client_password'], $_POST['banner_image'], $_POST['click_url'], $_POST['impressions_purchased'], $start_date, $end_date, $_POST['banner_enabled'], $_POST['startday'], $_POST['startmonth'], $_POST['startyear'], $_POST['endday'], $_POST['endmonth'], $_POST['endyear'], $_POST['banner_class'], $_POST['banner_pages'], $_POST['banner_listtype']); +} + +if (isset($_POST['confirm'])) { + admin_update($sql->db_Delete("banner", "banner_id='".$_POST['id']."' "), 'delete', BNRLAN_1); +} + +if ($action == "delete" && $sub_action) { + $text = "
+ ".BNRLAN_2." +

+
+ + + +
+
"; + $ns->tablerender(BNRLAN_5, $text); + + require_once("footer.php"); + exit; +} +if (isset($_POST['cancel'])) { + $message = BNRLAN_6; +} + +if (isset($message)) { + $ns->tablerender("", "
".$message."
"); +} + +if ($sql->db_Select("banner")) { + while ($row = $sql->db_Fetch()) { + extract($row); + + if (strpos($banner_campaign, "^") !== FALSE) { + $campaignsplit = explode("^", $banner_campaign); + $banner_campaign = $campaignsplit[0]; + } + + if ($banner_campaign) { + $campaigns[] = $banner_campaign; + } + if ($banner_clientname) { + $clients[] = $banner_clientname; + } + if ($banner_clientlogin) { + $logins[] = $banner_clientlogin; + } + if ($banner_clientpassword) { + $passwords[] = $banner_clientpassword; + } + } +} + + +if (!$action) { + $text = " + + + + + + + + + + + "; + + if (!$banner_total = $sql->db_Select("banner")) { + $text .= ""; + } else { + while ($row = $sql->db_Fetch()) { + extract($row); + + $clickpercentage = ($banner_clicks && $banner_impressions ? round(($banner_clicks / $banner_impressions) * 100)."%" : "-"); + $impressions_left = ($banner_impurchased ? $banner_impurchased - $banner_impressions : BNRLAN_16); + $impressions_purchased = ($banner_impurchased ? $banner_impurchased : BNRLAN_16); + + $start_date = ($banner_startdate ? strftime("%d %B %Y", $banner_startdate) : BNRLAN_17); + $end_date = ($banner_enddate ? strftime("%d %B %Y", $banner_enddate) : BNRLAN_17); + + if (strpos($banner_campaign, "^") !== FALSE) { + $campaignsplit = explode("^", $banner_campaign); + $banner_campaign = $campaignsplit[0]; + $textvisivilitychanged = "(*)"; + } else { + $textvisivilitychanged = ""; + } + + $text .= " + + + + + + + + + + + + + + + "; + } + } + $text .= "
".BNRLAN_7."
".BNRLAN_8."".BNRLAN_9."".BNRLAN_10."".BNRLAN_11."".BNRLAN_12."".BNRLAN_13."".LAN_OPTIONS."
".BNRLAN_15."
".$banner_id."".$banner_clientname."".$banner_clicks."".$clickpercentage."".$impressions_purchased."".$impressions_left."".ADMIN_EDIT_ICON." ".ADMIN_DELETE_ICON."
 ".$banner_campaign."".r_userclass_name($banner_active)." ".$textvisivilitychanged."".BNRLAN_45.": ".$start_date." <> ".BNRLAN_21.": ".$end_date."
 
"; + + $ns->tablerender(BNRLAN_42, $text); +} + +if ($action == "create") { + + if ($sub_action == "edit" && $id) { + if (!$sql->db_Select("banner", "*", "banner_id = '".$id."' " )) { + $text .= "
".BNRLAN_15."
"; + } else { + while ($row = $sql->db_Fetch()) { + extract($row); + + $_POST['client_name'] = $banner_clientname; + $_POST['client_login'] = $banner_clientlogin; + $_POST['client_password'] = $banner_clientpassword; + $_POST['banner_image'] = $banner_image; + $_POST['click_url'] = $banner_clickurl; + $_POST['impressions_purchased'] = $banner_impurchased; + $_POST['banner_campaign'] = $banner_campaign; + $_POST['banner_active'] = $banner_active; + + if ($banner_startdate) { + $tmp = getdate($banner_startdate); + $_POST['startmonth'] = $tmp['mon']; + $_POST['startday'] = $tmp['mday']; + $_POST['startyear'] = $tmp['year']; + } + if ($banner_enddate) { + $tmp = getdate($banner_enddate); + $_POST['endmonth'] = $tmp['mon']; + $_POST['endday'] = $tmp['mday']; + $_POST['endyear'] = $tmp['year']; + } + + if (strpos($_POST['banner_campaign'], "^") !== FALSE) { + $campaignsplit = explode("^", $_POST['banner_campaign']); + $listtypearray = explode("-", $campaignsplit[1]); + $listtype = $listtypearray[0]; + $campaign_pages = str_replace("|", "\n", $listtypearray[1]); + $_POST['banner_campaign'] = $campaignsplit[0]; + } else { + $_POST['banner_campaign'] = $banner_campaign; + } + + } + } + } + + $text = " +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
".($sub_action == "edit" ? BNRLAN_22 : BNRLAN_23)."
".BNRLAN_24.""; + if (count($campaigns)) { + $text .= " ".BNRLAN_25."  "; + } + $text .= " + ".BNRLAN_26." +
".BNRLAN_27.""; + + if (count($clients)) { + $text .= " ".BNRLAN_28."  "; + $text .= ""; + } + + $text .= " + ".BNRLAN_29." +
".BNRLAN_30." + +
".BNRLAN_31." + +
".BNRLAN_32." + +

"; + $c = 0; + while ($images[$c]) + { + + $image = $images[$c]['path'].$images[$c]['fname']; + + $fileext1 = substr(strrchr($image, "."), 1); + $fileext2 = substr(strrchr($image, "."), 0); + + $text .= " + + +
"; + } + else if($fileext1 == "php" || $fileext1 == "html" || $fileext1 == "js") { + $text .= " /> ".BNRLAN_46.": ".$images[$c]['fname']."
"; + } else { + $text .= " />
"; + } + $c++; + } + $text .= "
".BNRLAN_33." + +
".BNRLAN_34." + 0 = ".BNRLAN_35." +
".BNRLAN_36." ".BNRLAN_38." +
".BNRLAN_37." + ".BNRLAN_38." +
".BNRLAN_39." + ".MENLAN_4." + ".r_userclass("banner_class", $_POST['banner_active'], "off", "public,member,guest,admin,classes,nobody,classes")." +
"; + $text .= ($sub_action == "edit" && $id ? ""); + + $text .= "
+
"; + + $ns->tablerender(BNRLAN_42, $text); + +} + + + +if ($action == "menu") +{ + + $array_cat_in = explode("|", $menu_pref['banner_campaign']); + if (!$menu_pref['banner_caption']) + { + $menu_pref['banner_caption'] = BANNER_MENU_L1; + } + + $category_total = $sql -> db_Select("banner", "DISTINCT(banner_campaign) as banner_campaign", "ORDER BY banner_campaign", "mode=no_where"); + while ($row = $sql -> db_Fetch()) + { + extract($row); + if (in_array($banner_campaign, $array_cat_in)) + { + $in_catname[] = $banner_campaign; + } else { + $out_catname[] = $banner_campaign; + } + } + + + $text = "
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
".BANNER_MENU_L3.": + +
".BANNER_MENU_L6." + + + + + + +
".BANNER_MENU_L7."
+ +
".BANNER_MENU_L8."
+

+ + +
+ +
".BANNER_MENU_L19." + +
".BANNER_MENU_L10." +
+
+
"; + + + + + + + + + + + + + + + + + + $ns->tablerender(BANNER_MENU_L5, $text); + echo "\n"; +} + + +function banner_adminmenu() { + + global $action, $sql, $sub_action, $id; + $act = $action; + if ($act == "") { + $act = "main"; + } + $var['main']['text'] = BNRLAN_58; + $var['main']['link'] = e_SELF; + + $var['create']['text'] = BNRLAN_59; + $var['create']['link'] = e_SELF."?create"; + + $var['menu']['text'] = BNRLAN_61; + $var['menu']['link'] = e_SELF."?menu"; + + show_admin_menu(BNRLAN_62, $act, $var); +} + +require_once("footer.php"); + +?> \ No newline at end of file diff --git a/e107_admin/cache.php b/e107_admin/cache.php new file mode 100644 index 000000000..0e6098fc5 --- /dev/null +++ b/e107_admin/cache.php @@ -0,0 +1,87 @@ +clear(); + $update = true; + } + admin_update($update, 'update', CACLAN_4); +} + +if (isset($_POST['empty_cache'])) { + $ec->clear(); + $ns->tablerender(LAN_UPDATE, "
".CACLAN_6."
"); +} + +$text = "
+
+ + + + + + + + + + + + + + + +
".CACLAN_1."
"; +$text .= (!$pref['cachestatus']) ? "" : + ""; +$text .= CACLAN_7." +
"; +if (is_writable(e_FILE."cache")) { + $text .= ('1' == $pref['cachestatus']) ? "" : + ""; + $text .= CACLAN_9; +} else { + $text .= CACLAN_9."

".CACLAN_10.""; +} +$text .= "
+ + + + +
+
+
"; + +$ns->tablerender(CACLAN_3, $text); + +require_once("footer.php"); +?> \ No newline at end of file diff --git a/e107_admin/cascade.php b/e107_admin/cascade.php new file mode 100644 index 000000000..39faaa92c --- /dev/null +++ b/e107_admin/cascade.php @@ -0,0 +1,27 @@ + \ No newline at end of file diff --git a/e107_admin/categories.php b/e107_admin/categories.php new file mode 100644 index 000000000..6386c692c --- /dev/null +++ b/e107_admin/categories.php @@ -0,0 +1,27 @@ + \ No newline at end of file diff --git a/e107_admin/classis.php b/e107_admin/classis.php new file mode 100644 index 000000000..3351beb8d --- /dev/null +++ b/e107_admin/classis.php @@ -0,0 +1,27 @@ + \ No newline at end of file diff --git a/e107_admin/combo.php b/e107_admin/combo.php new file mode 100644 index 000000000..0b364a72f --- /dev/null +++ b/e107_admin/combo.php @@ -0,0 +1,27 @@ + \ No newline at end of file diff --git a/e107_admin/comment.php b/e107_admin/comment.php new file mode 100644 index 000000000..2729a1a38 --- /dev/null +++ b/e107_admin/comment.php @@ -0,0 +1,47 @@ +db_Update("comments", "comment_blocked='1' WHERE comment_id='$id' "); + } + if ($action == "unblock") { + $sql->db_Update("comments", "comment_blocked='0' WHERE comment_id='$id' "); + } + if ($action == "delete") { + $sql->db_Delete("comments", "comment_id='$id' "); + } + if (!$e107cache->clear($item)) { + $tmp = explode("?", $item); + $item = $tmp[0]."?news.".$c_item; + $e107cache->clear($item); + } +} +echo "\n"; +?> \ No newline at end of file diff --git a/e107_admin/compact.php b/e107_admin/compact.php new file mode 100644 index 000000000..599fcb53c --- /dev/null +++ b/e107_admin/compact.php @@ -0,0 +1,27 @@ + \ No newline at end of file diff --git a/e107_admin/content.php b/e107_admin/content.php new file mode 100644 index 000000000..7fc8c7395 --- /dev/null +++ b/e107_admin/content.php @@ -0,0 +1,23 @@ + \ No newline at end of file diff --git a/e107_admin/core_image.php b/e107_admin/core_image.php new file mode 100644 index 000000000..65a966add --- /dev/null +++ b/e107_admin/core_image.php @@ -0,0 +1,5711 @@ + + array ( + 'includes' => + array ( + 'beginner.php' => '399d299a1ad1dece1776fa3e477fdd31', + 'cascade.php' => 'f02f4e7c20f7590a19681f0324307800', + 'categories.php' => 'a99113a6cabb51bc0bcded28892a0957', + 'classis.php' => '5648c4272072a1f3bbf2665329d480bd', + 'combo.php' => '416828015462d3e305c002a3798ad76e', + 'compact.php' => '2c5c2b4d66971f1b0aaa0ac8e81097e7', + ), + 'sql' => + array ( + 'db_update' => + array ( + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 'core_pg.php' => 'af38d186d0a03cde899b4e0939b6ee6c', + 'core_sql.php' => 'cc00538c4f8b87a107ac6d2dacbaf9b2', + 'extended_country.php' => '0ef441f85dc0628bbf00c91e1163f114', + ), + 'ad_links.php' => 'd4d181f5337ba8bc939828d9068c8d43', + 'admin.php' => '3300cf551a1fa5ecc473e2f355c97ea7', + 'admin_classis.php' => 'ed861d18477db9ce0bc3620a69443723', + 'admin_combo.php' => '8958300a2a42fd2aa68977d566c1edb9', + 'admin_etalkers.php' => '9d684ef56c54bbf919e3346927cf4509', + 'admin_log.php' => '38c702ad61600d3c48851ee1dc868dfd', + 'adminb.php' => '1e31b2ad3907c7cba29dca04342cee1d', + 'administrator.php' => 'bd8de4773ebe49ab0884ba3d1c19568c', + 'article.php' => '7b21dc8ef4bc68ceb9ecf4d1c519a645', + 'auth.php' => '6bdf6b7895598b70c76e219069b930c6', + 'banlist.php' => 'f858a52c69ad86e1ed66127434a12915', + 'banner.php' => '3913e712c16227a49c5333b7f0e64489', + 'cache.php' => '62fc17d1f4c6db977c66642c5a76127a', + 'cascade.php' => '3d70a650778f09e6c85efd91b6ab5e4a', + 'categories.php' => 'cbbed37d26ab602700d46a0cb1955205', + 'classis.php' => 'ae46c368d41390a44cd6005404d651d7', + 'combo.php' => '6b0f9e175585ef0b42585b444b003678', + 'comment.php' => '96f04e71003de6b6a6ea3a0f2ede285d', + 'compact.php' => '20bccea2ef81cc86a86782fa4841e45f', + 'content.php' => 'bf2239404990afed185913002429e682', + 'core_image.php' => 'e989fac71ee65a3db9047565d6f34b48', + 'cpage.php' => '57ab65c7fa55e1dcfc5f3a9a94bc2528', + 'credits.php' => '322fe1169cd992db88624e84d7f51288', + 'db.php' => 'a48795e26302b874c1fe397689f01d9f', + 'db_verify.php' => 'e14434e165ac07b4cb630809dd4b3150', + 'docs.php' => 'e5ebdd8fd30362636cfe1a3878b3fb18', + 'download.php' => '636316389ea0a9dd8d6dc7b9d2044c81', + 'e107_update.php' => 'c23624862e7dc50fab29aa1890c7872a', + 'emoticon.php' => '4139a4c00680ed7b94bb2848bb9c7cec', + 'fileinspector.php' => '7430c97538e5d63ced422b4d552344ae', + 'filemanager.php' => 'af7dfc6ef908953d0208cd18ba5d444d', + 'filetypes_.php' => 'f951037335e993337792606cc1475cec', + 'fla.php' => 'c44c289dcdbe2bcf53305103275ce899', + 'footer.php' => '0cc1b838f19770de51917dd614b7b246', + 'frontpage.php' => '78acc7a2d9f879636291a2b45d06c80a', + 'header.php' => 'a61922daac7e562e86251bd9a67877f3', + 'image.php' => 'fc510663610cbf4b53eec2f9948999b6', + 'index.php' => 'e4e143ee2d34d4ce1f17b3f043cc6cd6', + 'lancheck.php' => '8b8fea89e7d9a0dc3d1931971a9b4939', + 'language.php' => '67569d7ab4a4e25984c19353a143e31c', + 'links.php' => '39c7ab07f379c047fe20f0415735b474', + 'mailout.php' => '9779b609afed1f62c16bf7694f1a68e5', + 'menus.php' => '1abba8d34311ca3795d37d4526a41042', + 'message.php' => 'a598b5e493298500d81b815f1455280b', + 'meta.php' => '346305add7d4a15981103cd42ae02d15', + 'modcomment.php' => 'b8787d8ebce9cc813ccaa416ec3a923c', + 'newspost.php' => '6aba9db62369e328f78f623644ea04a8', + 'notify.php' => 'a988fd7416b4595e72975b22ccc6362b', + 'phpinfo.php' => '994ea857810fe5f47ac8612f570aadb1', + 'plugin.php' => '3714121cbb762b83f29f28a9fa1d094f', + 'prefs.php' => 'e9ac6b838ef5368d1861481e629c8c08', + 'review.php' => '1919d31943803a66cb2d12828bd92db2', + 'search.php' => 'b1239e5af6795205648d8965ec3a1ec9', + 'theme.php' => 'b05f7265501a3e1c5e7c47cb3f891831', + 'ugflag.php' => 'b3b47767137dd7ea5e3726150507e158', + 'update_routines.php' => '16e3369df255bb5d6f76e8288830e3e1', + 'updateadmin.php' => '770fff43134883ea4d502498b28d70d2', + 'upload.php' => '69b274043c816b5a8c7241c20de0b9fb', + 'userclass.php' => 'b7fd96c785b6f3eead88fd5acd5760ad', + 'userclass2.php' => 'f0a95f4feecabe0d801b4a7f64c89ec0', + 'userinfo.php' => 'fcbb4c620a0a9ed430588ee7539fb2d7', + 'users.php' => '97cf741f0e67b3be9a55232c4a189932', + 'users_extended.php' => 'c0cc2efb094dbb76b7e73fd31aedd06a', + 'users_extended_predefined.php' => 'a1bd4adc6a6c1996e304b467aed9d2c0', + 'ver.php' => '50bdc51a07a780bad3c7b109feeb22b1', + 'wmessage.php' => '17afb0f8ef07cfd675cd92e9f7e606a3', + ), + $coredir['docs'] => + array ( + 'help' => + array ( + 'English' => + array ( + 'Administrators' => '2d001305d3842ccda086c69d8480b7b5', + 'BBCode' => '5fa5841472b4f5ef147cdc3dfcf64583', + 'Banlist' => 'c26dea7d5c19e89270b6a4c66f7c5367', + 'Banners' => '07ec3ec7746666e5c8dc62d126e69cdf', + 'Cache' => 'd277d62ce899f0c85b5f9ab2721e2359', + 'Chatbox' => 'ee6779c1a022095e1384da1696a62a90', + 'Classes' => 'ee095eb315ad639cbda7e961f9ace940', + 'Downloads' => '8da67c083574a267ea6a82fe75f27329', + 'Emoticons' => '14a0d74aea591e0f8d82577aff8fe979', + 'Errors' => '46381d88a2326ff760562fea385b2fd0', + 'Forums' => '5976f081c2e1822a1261975cba4fcadf', + 'Front_Page' => 'f3f5ee030265c5892c022771b5f218e5', + 'Help!' => 'ad2abff800199fb22078a9d5b825b9d7', + 'Links' => '320eb08defa1360070a4f0c062e5fc84', + 'Maintainance' => 'f248eeafde7e99293b77d662304bfb52', + 'Menus' => '7344815f36b8aa616047ec8152ad54fa', + 'News' => '6eadf4f45748cad4f37e67fea04e05db', + 'Preferences' => '9b3d173843f5ac04b8cac472a8e213f2', + 'Uploads' => '1a979ee608d8dd812dd2752ba8d9f48a', + 'Users' => 'd62e15078e8d9d7ab8da7ec654cdef43', + 'Welcome_Message' => 'd3a3a4dfd02ec7258dd91364be7d6aa8', + ), + ), + 'README.html' => '0f900f790eb4081e213fef89b92a5125', + 'README_UPGRADE.html' => 'bd278a384e14d6306fc557a0560231fe', + 'gpl.txt' => 'e19d8295ecad01988af40b5a943bd55f', + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'style.css' => '2e3b2c9e4bff6d8de091af58589faa1c', + ), + $coredir['files'] => + array ( + 'bbcode' => + array ( + 'b.bb' => '467bfb5e80f460fcebcdc2e6a3a8d38b', + 'blockquote.bb' => '2cfbbd3ab3fe2872d1a9873223d21522', + 'br.bb' => 'cb8d211703f0459735baa8dfbebb4bb4', + 'center.bb' => '5a1957946e3d8898a0b3d86650771809', + 'code.bb' => 'fbc07a20865e76438614cb49d4f50b4b', + 'color.bb' => '98b9d0ddcc76d2ee37af0f36eab8b1c3', + 'email.bb' => '123a8b604a28524320639ba1e09bef35', + 'file.bb' => '37ef44e5f420205d6c4f4519e69e7a32', + 'flash.bb' => 'd008adf0a77ce5b3398e908765247646', + 'hide.bb' => 'cf30f78c78855565b0bf868a01142fb8', + 'html.bb' => '9938499c3ef8c80a2598b9c3aed7e371', + 'i.bb' => 'ec842cfda8a6f33d53f8232763b56719', + 'img.bb' => '55dbceb76b1d0f3ac070c0122ed7ee10', + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'justify.bb' => '016500f910beb0f820dd58c4915f2489', + 'left.bb' => '990ddba32b14bea648745cc373035bde', + 'link.bb' => '0682a13d56650ba5ca6859e9da761e6b', + 'list.bb' => 'a2b5f8075b9752bb5b60c3862c5d96ca', + 'php.bb' => '18bfe745513afb3bb7ec4d69f0683d95', + 'quote.bb' => '12bfbba32661e309a33972e388b0e912', + 'right.bb' => '9bd60ca738b30f35742a0049c5efc191', + 'size.bb' => 'bd62172ecb7083b85b534c2e45e79d48', + 'spoiler.bb' => '5929f20a04438093df87b7246e843bf0', + 'stream.bb' => '9661057e8db23c681e3ec2340ff3a4fa', + 'textarea.bb' => '51f2669f52dfec3ed57f38402fcc7652', + 'time.bb' => '3d83b0dfa9b139004bb19ee34b142b44', + 'u.bb' => '7f8703e65a5f24bd9d2edd5fc0dfef48', + 'url.bb' => 'ded6e905c2f5d9a12707d3bfa63d1d82', + ), + 'cache' => + array ( + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'user_extended.xml' => 'd0aebe83cdec17b0a33d8a3dca37bd14', + ), + 'downloadimages' => + array ( + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'null.txt' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 'downloads' => + array ( + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'null.txt' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 'downloadthumbs' => + array ( + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'null.txt' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 'images' => + array ( + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'null.txt' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 'import' => + array ( + 'import_mapper.php' => '78a98bfedbe66b043e8562bcd6449125', + 'import_readme.txt' => 'a76f8a52208d648e1c9e3afe71929755', + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'mambo.php' => 'bbcff57b96ca83045d9f4afa982a6ff4', + 'phpbb2.php' => '80bdbe33731a881d122d68003096c4ad', + 'phpnuke.php' => '732653b3f39cf02364be2dcb0f065f3a', + ), + 'misc' => + array ( + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'null.txt' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 'public' => + array ( + 'avatars' => + array ( + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 'resetcore' => + array ( + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'resetcore.php' => '8a69dad2ea719f5f8a85160b049d34eb', + 'style.css' => 'e294495db6f91c4514c4f40d7b09fcd5', + ), + 'shortcode' => + array ( + 'batch' => + array ( + 'bbcode_shortcodes.php' => 'ea6a74e0a309ad82b29f3fa467e77c39', + 'comment_shortcodes.php' => 'd443298b9ca99525f12817f6a3234706', + 'contact_shortcodes.php' => 'd593f9dadff312c61eb27e32457d7f95', + 'download_shortcodes.php' => '7ab132b79c308f5d010743e135dedce3', + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'news_archives.php' => '1115fe90b0de9f170fce31c94680dabf', + 'news_shortcodes.php' => '6db3c049835db41b7fdace7e6c494d81', + 'signup_shortcodes.php' => '8726a38b93ea99fc74355f6188723c8f', + 'sitedown_shortcodes.php' => '3ae9199cbae645d23869d517a5f6cef4', + 'user_shortcodes.php' => '7f8fb9882adb3bcffdbd41435e62f154', + 'usersettings_shortcodes.php' => '0ba56f47a83cdbbdf3a5c72475ec100c', + ), + 'admin_alt_nav.sc' => '412e8fb7acac7746ea48b17854decfc4', + 'admin_credits.sc' => '0eb1784fcb76e13c8addd81d9a741074', + 'admin_docs.sc' => 'b010b7ac7618fa669c8777754a8337c6', + 'admin_help.sc' => '1ad9d6f1c5af06e7ce2d0e1744b02cd4', + 'admin_icon.sc' => 'e479849c3b09aae88aae3532b0550a92', + 'admin_lang.sc' => 'f5bf42455eb337119639528aa7fea705', + 'admin_latest.sc' => '96a92eb5000eb6e8f120b70734239968', + 'admin_log.sc' => 'ad42fe098b732d8985cd44b11a3402d5', + 'admin_logged.sc' => 'dec16fb0a9f5485db6ca1b4955753c2e', + 'admin_logo.sc' => 'ff7174ceae0a5e01bfd0bc7a343c16a4', + 'admin_menu.sc' => '33785fcda56c60c219a4cc30f6018f5b', + 'admin_msg.sc' => '1906530f20e337964878fd144b1047c5', + 'admin_nav.sc' => 'c22be64cb31ee333f0510f6dd8778363', + 'admin_plugins.sc' => 'cdf52aad6688cde7741d695a62be944d', + 'admin_preset.sc' => 'f27d1c59bb7459581fde09d29cfe6303', + 'admin_pword.sc' => 'abbe3f9d2709e86cfb37b378f2b3d13f', + 'admin_sel_lan.sc' => '6c2dbc4e17bdcc5f5260664ddb8c3280', + 'admin_siteinfo.sc' => '63bfd9a632b66f9368337983dd921537', + 'admin_status.sc' => 'ee77ec3ec0d56adfdc8681900a85bfc6', + 'admin_userlan.sc' => 'cbaf3dda959b6a36f6b3f4cf0a6f7536', + 'banner.sc' => '4a23a473eb15c7afbedbd4816f3922ea', + 'breadcrumb.sc' => '0591ee7dc26ded7ac9a359dea4b8fdf6', + 'custom.sc' => 'eae664abbaed381856936600574839a7', + 'e_image.sc' => '3819fdf5b9dfc7b189fb4073d33ae0d5', + 'email.sc' => 'a864fe0d78a0c9641b36d65688c63b10', + 'email_item.sc' => 'a23b3abbb722bbf5bc58be9d23906583', + 'emailto.sc' => '05843b1a7c7feb8f4985a55ac01ba9f3', + 'extended.sc' => '868d45e725d7565a1d9c5b743aba0967', + 'extended_icon.sc' => 'db16dbaa0dfa2f8fc944ba87c15a09d1', + 'extended_text.sc' => '5a1426815f88bb2239912638af30beb0', + 'extended_value.sc' => '1b720e5d3155c6d4a1464fc1e9cac5f1', + 'imageselector.sc' => '31d9db59fdc34235656d40a275e63c26', + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'languagelinks.sc' => '46f5c006e1b1f5e5b941a6330711bf77', + 'linkstyle.sc' => '5ed64d972bc892a798f80179878f1266', + 'logo.sc' => '9fb4b737a74ac8d1168fa29fe88766ac', + 'menu.sc' => '44ea3e93ac49feeda0632a76773e2829', + 'news_alt.sc' => '25596ffed2cf4bed831b80397c77e295', + 'news_categories.sc' => 'c520fdee0b041b3622c93ca85f63f6fb', + 'news_category.sc' => '25596ffed2cf4bed831b80397c77e295', + 'newsfile.sc' => 'afe0363c51236eacdf1a5434d17533a3', + 'newsimage.sc' => '75738371cff6146174ea00971730a0da', + 'nextprev.sc' => 'c1c872831b48abb3c34d531e8ccdf2da', + 'picture.sc' => '0f4d00920f1ddbac7293549862b3c0da', + 'plugin.sc' => '3b827418651f2a8f070d1cf80fe2405f', + 'print_item.sc' => '8ca4f150e4758249c346dd0edd5623f3', + 'profile.sc' => 'ea7fc4eca12f39e19a735d2014fe341f', + 'search.sc' => '12a174161a186e9a936fc10c946f0517', + 'setstyle.sc' => '88ec920b668233bd21ba95e2cdd607e7', + 'sitecontactinfo.sc' => '5467f65cd62b910389014b5fb8b33fe5', + 'sitedescription.sc' => 'c617f50a35752e7cb8de2d15f7e6b614', + 'sitedisclaimer.sc' => 'cd111b6abc576ca1ab70c103f3f2a49b', + 'sitelinks.sc' => '754259e3bdab4efc147d92b50efdf262', + 'sitelinks_alt.sc' => '24ee01a0e4b5181620320b936a63245e', + 'sitename.sc' => 'a62bd1e1600931a2585f16b611fd0c6b', + 'sitetag.sc' => '338e16589e67c9fe45613e3c6dbb9b0d', + 'stylesheet.sc' => '40a390253676a08790cbadcd434619b3', + 'uploadfile.sc' => '85ea5b2a10cde7c2267a40c359694aed', + 'user_avatar.sc' => '1501550f2414900d47edee2621b2e624', + 'user_extended.sc' => '8fdffc090d07e85ceb203542ecbb0d32', + 'wmessage.sc' => 'b6bf7054c5f9ece93c13f2f1bfd13a31', + ), + 'def_e107_prefs.php' => '0886a4b7774f246f31aa027d4b8eb18b', + 'e107.css' => 'e5cfa4047831f19def7df032ef8bc830', + 'e107.js' => '2089336ebd5204061afce9be3094ad73', + 'e_ajax.js' => 'b583773e72852158e27af8a9bba7c97f', + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'nav_menu.css' => '58ca165986f7428fb05e8b7b82c2ee13', + 'nav_menu.js' => 'f6345dfb29d05884a5017ff17ed36387', + 'nav_menu_alt.js' => 'cbfeb53bb0dfc7136f097c00265731ff', + 'popup.js' => 'a9d1e17d0a4c399736fc7bf16ac48fa8', + 'resetcore.php' => '8329fb938f7ae0058ab9582efc098c4c', + 'sleight_img.gif' => '7616b49c48ca0cd6cbd15e9f747c8886', + 'sleight_js.php' => '038fc3cccae701fab1c6aa35339a0853', + 'thumb.php' => '1506afd0bc12c8663688f7ca449aa853', + 'user.js' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + $coredir['handlers'] => + array ( + 'calendar' => + array ( + 'language' => + array ( + 'English.js' => '3eae52209f3587e2339a010280e22150', + ), + 'cal.gif' => 'c1e5255bd358fcd5a0779a0cc310a2fe', + 'calendar-setup.js' => 'bcdf616f6ebfe8fdb0235d389fb1d238', + 'calendar-setup_stripped.js' => '21fe92ab10616e9d40b066538b4d1fdb', + 'calendar.css' => '33ea70fdc6b81e988ffce30ad8f7c4f2', + 'calendar.js' => '0dca67d72cc4e8df1d64003ab4738d60', + 'calendar_class.php' => '79d604e52ab3b9fa60b9d0cd84e9bd6e', + 'calendar_stripped.js' => '3222e372b909b3eb246cdf3423493bda', + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'menuarrow.gif' => 'b5a91d7a2755198b2eb729541ad3288c', + 'menuarrow2.gif' => '1f8c673c8f76832febaeeac88a5f4353', + 'sample.php' => '1d99312cd3ba1d6b9ef0484e6d138641', + ), + 'phpmailer' => + array ( + 'language' => + array ( + 'phpmailer.lang-en.php' => 'dca429b3dfc000a241f32ed11d3a6aca', + ), + 'class.phpmailer.php' => 'cf32be10ca659080ad4550acd26c102e', + 'class.pop3.php' => '5a96ba537abceb27300abeef11041302', + 'class.smtp.php' => 'dcae7f76c4549f804401195e06e2cb3a', + 'e107.htaccess' => '507de3fb6f951cafa6b1a346d232604f', + 'mailout_process.php' => '51fae3c946ebe47c33b298c36ef6f545', + ), + 'search' => + array ( + 'advanced_comment.php' => 'be2b0d04f5abfb8d659288a69cb73d49', + 'advanced_download.php' => 'fa435e7792317196d187e494212d0988', + 'advanced_news.php' => '4dd2b43f9acb91ea02b39fa44ccf4299', + 'advanced_pages.php' => '82c313fb52d708bd9aaad142a00dc2c4', + 'advanced_user.php' => '0f1f1668327d513090f6e13824d281ad', + 'comments_download.php' => '2cabddfffb2986e96bb7779da03d1f0a', + 'comments_news.php' => '771713752895af10bfa75c3c2bac4d1e', + 'comments_page.php' => '6e5a89313087d403e30cfeb8ddf4da78', + 'comments_user.php' => 'caa387a56d6f1b35610e80061e18cc1c', + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'search_comment.php' => 'd6969967014e8c14e613bad64a091253', + 'search_download.php' => 'ba62e1be41cdd3457cfc2be8de146d01', + 'search_event.php' => '17c68ea4f5728e87e7009b96b978006c', + 'search_news.php' => 'bc0321e07ae69c925ac83a72ae67c136', + 'search_pages.php' => '57521d1569a214c3ccb99406561a229f', + 'search_user.php' => '90b545d731c887cef2715096d52cb968', + ), + 'tiny_mce' => + array ( + 'langs' => + array ( + 'en.js' => 'f304920296d23ba3ed1a8ec3a2a1844d', + ), + 'plugins' => + array ( + 'contextmenu' => + array ( + 'css' => + array ( + 'contextmenu.css' => 'f3cb9b44e37f0dc452bed97c02bec4c4', + ), + 'images' => + array ( + 'spacer.gif' => '12bf9e19374920de3146a64775f46a5e', + ), + 'contextmenu.css' => '93ad8b3e8a5e1a48bf6ed727ca0384e2', + 'editor_plugin.js' => 'f4df4d4889b61ecd067ea2d6977420ca', + 'editor_plugin_src.js' => '7772eef735b088e4a6fdfdf707e33e65', + ), + 'emoticons' => + array ( + 'images' => + array ( + 'emoticons.png' => '2867c94a2d99dedf5964a4a0de9e5839', + ), + 'langs' => + array ( + 'en.js' => '25334d4a3d329cc805a54c3f815ff26a', + ), + 'editor_plugin.js' => 'ede01e828a3698e2e00a9dbd503e7d95', + 'emoticons.php' => '31f361fda0b760ad25d72a9cf8bed070', + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 'ibrowser' => + array ( + 'images' => + array ( + 'constrain.gif' => '0ed8ffef1fb5cce76e51e2d720063ea9', + 'ibrowser.gif' => '3f92a28951b2d3048473262f5367d12d', + 'textflow.gif' => '2b34d07b43d1159590455146078cb4cc', + ), + 'langs' => + array ( + 'en.js' => '5bc48956a398ac86f36edb041a898a85', + ), + 'config.php' => '4e178e32efb96453c26523ded26f6ee7', + 'editor_plugin.js' => 'e16d63db65af69d1db26ff64b706a0d9', + 'ibrowser.php' => '1865b7afd71373cfff0cb986b632ee35', + ), + 'iespell' => + array ( + 'images' => + array ( + 'iespell.gif' => 'eb12c26b5768fcd344ea6205aa98e761', + ), + 'langs' => + array ( + 'en.js' => 'b262530d5b63841b50ab5b67f94883aa', + ), + 'editor_plugin.js' => 'fae3a5e1abb9e78c55eb4dab42d8dfd1', + 'editor_plugin_src.js' => '24caf83859f447628508cd99c907352c', + ), + 'media' => + array ( + 'css' => + array ( + 'content.css' => 'f665ed43e62a4ab7c0661d00fa4f0fdb', + 'media.css' => 'af181e09ae05dd73b0d32c0caa87d1a4', + ), + 'images' => + array ( + 'flash.gif' => '709d9df69d8c2030e56321046d76ab8b', + 'media.gif' => '0541d5bf542ee730346a5f4641416356', + 'quicktime.gif' => '4a4709a92bb1ef6bc1621019c92a83b8', + 'realmedia.gif' => '51de6342ba5327787eba762116d20130', + 'shockwave.gif' => 'acad15b370f34deb12355bea4b89c2e1', + 'windowsmedia.gif' => '825f4eca28a633397050f9a6cca9358f', + ), + 'jscripts' => + array ( + 'embed.js' => '2288f2d23b707283921aaeff2dfeb005', + 'media.js' => 'ff44b627774307f3ae807e6c27d66a06', + ), + 'langs' => + array ( + 'en.js' => 'de38190b0b16ff997c6f7a2e09818f3c', + ), + 'editor_plugin.js' => '6c1cbbc18a0f3a07757ee1a3969d55f8', + 'editor_plugin_src.js' => '9603968370efb4b25ae25d701db8ffd1', + 'media.htm' => 'd3fce5ed41db220e12ebfebd143e1f47', + ), + 'table' => + array ( + 'css' => + array ( + 'cell.css' => 'a51b50f9a8153e7f55fe06a03caca016', + 'row.css' => '6d95ac81b478e4e8a176e209c739c38d', + 'table.css' => '8357d1c13919a34806d23fa2160a8064', + ), + 'images' => + array ( + 'buttons.gif' => '7e50c576bb169b5dd93d9e28da67bb14', + 'table.gif' => '476b000e94b74dac818f1ce03681ace5', + 'table_cell_props.gif' => '6912d92a00e3e81a9baba3e251b7f0c0', + 'table_delete.gif' => '060899ca004398671369f92ef6a88a90', + 'table_delete_col.gif' => '333372a2469c8dfa12a002a2aad8de59', + 'table_delete_row.gif' => 'c58d9413b1d8150011db91818595871b', + 'table_insert_col_after.gif' => '5d19acf7a25262cf3ddc7a926a076218', + 'table_insert_col_before.gif' => 'd5910a210405a8cc7a24086104b06fa1', + 'table_insert_row_after.gif' => '6b3167fde6db6ac271488b9cef404792', + 'table_insert_row_before.gif' => '0e37e4c48dcddb1123bc6140ce323694', + 'table_merge_cells.gif' => 'd5552fd387ff429fbfe7b8aebc76b3c0', + 'table_row_props.gif' => '639bc7a8c034d99ab1cbef8f602f8aa8', + 'table_split_cells.gif' => 'aa2082cf1eb2e62eecda57fd2f986ab7', + ), + 'jscripts' => + array ( + 'cell.js' => 'df27f8a9de847dcc4b433960c72f99fa', + 'merge_cells.js' => 'f75d50d1dea59b83bd7f091fe53be6d3', + 'row.js' => '5564b689e370fc84c47b192de29e472b', + 'table.js' => '260a2bfaa8e3a3313fb14904f6daf7ea', + ), + 'langs' => + array ( + 'en.js' => 'efb577fa33557c4f819d45f8be16ff20', + ), + 'cell.htm' => '19a425a22f5dc25f42e755ad38d3ba98', + 'editor_plugin.js' => '21d04eeb64cf88af767f0641f1c360ee', + 'editor_plugin_src.js' => 'aeac85b281a5aff98f76157bbbbfb3f0', + 'merge_cells.htm' => '9470fcdf7575a48d499fdde3f20d8d5e', + 'row.htm' => '7c8c219909be04d09bad3bfeb048c560', + 'table.htm' => 'ec13d5c3ebb1e460e4a99de394664dc0', + ), + 'zoom' => + array ( + 'editor_plugin.js' => 'b4029d6df8bb33172ea5c44a9ba409ac', + 'editor_plugin_src.js' => '5a3aef8ef6b914daefb467674be73989', + ), + ), + 'themes' => + array ( + 'advanced' => + array ( + 'css' => + array ( + 'editor_content.css' => '4950d1774a92d46045b57911d41706ef', + 'editor_popup.css' => 'e2c24b08b5fdb21ca55da439aa30564a', + 'editor_ui.css' => '5d74992a65ac983a065f7c3d3012779e', + ), + 'images' => + array ( + 'xp' => + array ( + 'tab_bg.gif' => '3d53300281d4652d1fe2482f1bbec413', + 'tab_end.gif' => 'de9e554769bc24fc7f2acefddb04e895', + 'tab_sel_bg.gif' => 'f330e9c65e356cb6829596e421cf1116', + 'tab_sel_end.gif' => '6a4ffda436f2ffe5a56107d6c8c5a332', + 'tabs_bg.gif' => 'b3a2d232dd5bf5e8a829571bbec08522', + ), + 'anchor.gif' => '9997d8cbba012a0a8295ff92bced1207', + 'anchor_symbol.gif' => '5cb42865ce70a58d420786854fed4ae1', + 'backcolor.gif' => '9d4f0c287ef6a09ff25595c366920f61', + 'bold.gif' => 'd4eac7372d4d546db5110407596720dd', + 'bold_de_se.gif' => 'fa8d362da3c15cab263bc7eb2d192dd1', + 'bold_es.gif' => 'eedfd6c0dc13c5db5054bd893ac92ca0', + 'bold_fr.gif' => '8fbda35d5ebfc1474f93f808953b1386', + 'bold_ru.gif' => 'c227dfb4b70957d31c240fd0fd9f55b6', + 'browse.gif' => '2babc35c383abee1260e021dd87fd7a5', + 'bullist.gif' => 'f360470402affab13062de5ffbfb7f74', + 'button_menu.gif' => 'ed293e6a817f44328f74c0853c628e69', + 'buttons.gif' => '23c32309ebbca60a52fd064860788620', + 'cancel_button_bg.gif' => '57b808096854d5eeb5785effcd10c468', + 'center.gif' => '652af6256deb0eeb781b0793ee4142f2', + 'charmap.gif' => '3c3625a993caca8262dd93d61ff1a747', + 'cleanup.gif' => 'f082f5fdea8020fd9cdd714a30ca8e71', + 'close.gif' => '99fb1b6d91aca9519cfc18e182de8600', + 'code.gif' => '158e1ad2922f59a800e27e459c71d051', + 'color.gif' => 'c8e11c751b5575025fc50b7701719f0f', + 'copy.gif' => 'ef9a435cc72f9fe652ebc49498b89e86', + 'custom_1.gif' => 'bd1f96d299847c47fd535b1b54d3a2df', + 'cut.gif' => '4e3e44cccf150856322ba78ccf2533e7', + 'ecode.gif' => 'd78d5418d4c6883c837fdbeb7b824bb4', + 'forecolor.gif' => '160b10bd5949887d251eb5b96291b799', + 'full.gif' => '009750822e228e10f51e746ddf8d1fec', + 'help.gif' => 'e244d2c9d8f1d1910c7145699f767a9c', + 'hr.gif' => '8d92cb73437c32a0327323b538ad2214', + 'image.gif' => 'decae954176586ab7504c178b28b5041', + 'indent.gif' => '89c00ba134c89eb949411194060c135c', + 'insert_button_bg.gif' => '13a80583b2bf71103ea378514ac717e5', + 'italic.gif' => 'c8652735e55a968a2dd24d286c89642e', + 'italic_de_se.gif' => '2eafa516095a0d8b3cd03e7b8a4430f7', + 'italic_es.gif' => '61553fb992530dbbbad211eddcc66eb9', + 'italic_ru.gif' => 'bbc7be374d89a1ced0441287eeba297a', + 'justifycenter.gif' => '652af6256deb0eeb781b0793ee4142f2', + 'justifyfull.gif' => '009750822e228e10f51e746ddf8d1fec', + 'justifyleft.gif' => '7e1153a270935427f7b61c7b6c21ab8a', + 'justifyright.gif' => 'b91052a13211f6b1bc0a5ca596fe4a6b', + 'left.gif' => '7e1153a270935427f7b61c7b6c21ab8a', + 'link.gif' => '59cbc5812b993e7f6823937e89e85c18', + 'menu_check.gif' => '889563a22f10dd4535d0050b807e42ad', + 'newdocument.gif' => 'e6d9f7d0bdc4d21d9b9fd1ad6b888733', + 'numlist.gif' => 'd4c72d6e6d56fee2315ad59426a99a4e', + 'opacity.png' => 'bd2babb5fb15f4ad5352dd05be54e898', + 'outdent.gif' => 'b7249cc5a3bce3971f0b19fccac07f60', + 'paste.gif' => '14d2f6c0e090ce821ca302a6b5d7e7d9', + 'quote.gif' => '83277c79354c0cebed4b93b92ca96c56', + 'redo.gif' => '0fb531683cf59bb0e1c9911d475e640c', + 'removeformat.gif' => '2a5f195e9ec54e7e0e2fb40238678444', + 'right.gif' => 'b91052a13211f6b1bc0a5ca596fe4a6b', + 'separator.gif' => 'b0daa6a4ec9acc86c3b2b1bb71f5b6a5', + 'spacer.gif' => '12bf9e19374920de3146a64775f46a5e', + 'statusbar_resize.gif' => '4bece76f20ee7cd203d54c6ebd7a8153', + 'strikethrough.gif' => '0dcca301aa909817a82d705cc9a62952', + 'sub.gif' => 'dfbcf5f590c7a7d972f2750bf3e56a72', + 'sup.gif' => '15145f77c6f9629bfdb83669f14338a9', + 'table.gif' => '476b000e94b74dac818f1ce03681ace5', + 'table_delete_col.gif' => '333372a2469c8dfa12a002a2aad8de59', + 'table_delete_row.gif' => 'c58d9413b1d8150011db91818595871b', + 'table_insert_col_after.gif' => '5d19acf7a25262cf3ddc7a926a076218', + 'table_insert_col_before.gif' => 'd5910a210405a8cc7a24086104b06fa1', + 'table_insert_row_after.gif' => '6b3167fde6db6ac271488b9cef404792', + 'table_insert_row_before.gif' => '0e37e4c48dcddb1123bc6140ce323694', + 'underline.gif' => '203e5139ee72c00d597e4b00ed96d84b', + 'underline_es.gif' => '027608183023f80b0c9bf663c9e81301', + 'underline_fr.gif' => '027608183023f80b0c9bf663c9e81301', + 'underline_ru.gif' => '843cb1b52316024629bdc6adc665b918', + 'undo.gif' => '7883b9e1f9bf0b860e77b904e1941591', + 'unlink.gif' => 'dcd93dd109c065562fe9f5d6f978a028', + 'visualaid.gif' => '491fbaab8d180fdd051cece94f2b8845', + ), + 'jscripts' => + array ( + 'about.js' => '7168d330431da1d7c082c84df665a6f0', + 'anchor.js' => '5bffefe6a515c1b10fd636a4fbd45a34', + 'charmap.js' => '124138e299a3ef0c823010d2fbbdaf0f', + 'color_picker.js' => '9dcf13f6303af0db5d3fb280fa526f62', + 'image.js' => 'bf79747eacc011f3902a1804b49d6265', + 'link.js' => '3df42cdbae98782ae9a9bffaeba7ab53', + 'source_editor.js' => 'f2419d8fb2804a46ed626e6a8b953539', + ), + 'langs' => + array ( + 'en.js' => 'd954dbe69d706823e7ce2acc99ca16c6', + ), + 'about.htm' => 'fc2c574502ccf3e53fd00f52d9aa3869', + 'anchor.htm' => '15ace71eb4c333034944ef7cfb1646d2', + 'charmap.htm' => '9848d7254d4979ce94dfbdee055900ba', + 'color_picker.htm' => 'c00bae115f05a96d5a561dd46cfb9fa4', + 'editor_content.css' => '99f256c087e16872937f6cf9e4ea0c32', + 'editor_popup.css' => 'a2bbb5f95ba2d3422c1666222170d700', + 'editor_template.js' => '34f49851a46c0c3f5f90929fb5a1260e', + 'editor_template_src.js' => 'cd30e9a71b4422f62e370538a3b24dc4', + 'editor_ui.css' => '62632779c868eddf46f3a8e121083d31', + 'image.htm' => '4a2a0fe9cc33b4997f718b58af1be6ca', + 'link.htm' => '8f96d1fee5e848c10bd1c73faf0b38a6', + 'source_editor.htm' => '7b533802f9534af465bb276a2c318f35', + ), + ), + 'utils' => + array ( + 'editable_selects.js' => 'fafc283bd5b48b6cd188cf12856aac88', + 'form_utils.js' => '74cf73cde95e530009a570facd900874', + 'mclayer.js' => '1c7d5ff736bf571af7b1407758db937e', + 'mctabs.js' => '70249b9a54761a08db2006afb99079a1', + 'validate.js' => '50799f6a9ebc837f3d0345c4a42367bd', + ), + 'blank.htm' => '72406c871a9be7972922686221a885a2', + 'filelist.php' => '63d5fa62565bc100d3345de82ab36985', + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'tiny_mce.js' => 'ae9f1a863b1d3686cf0c6ab0994acf2b', + 'tiny_mce_gzip.php' => '846511eed428312feca1f0e5fec6cd91', + 'tiny_mce_popup.js' => '0a5ce4187f9d2f58e36302d7d40bf3d2', + 'tiny_mce_src.js' => '1a99b9dcd773d76df1fee42e072cb1a4', + 'wysiwyg.php' => '3cc70beacb90d7c9ea9dcfea7288a8be', + ), + 'admin_handler.php' => '2d593943e40bf02d5d46cf6b6af6b7e7', + 'admin_log_class.php' => 'a19c073089c6149a755e253133594d65', + 'arraystorage_class.php' => '4862b38926c8f68029c95d31990435a4', + 'avatar_handler.php' => '54c9f790d9f17e30f52b8011633d486c', + 'bbcode_handler.php' => '4871033a545a98c465e3b0aa6e911374', + 'cache_handler.php' => 'e9b35486958d34ecf84afb69bed7fe16', + 'comment_class.php' => 'e525ee48e0f89300368bf201aed95783', + 'date_handler.php' => '900262e3d47034c444cf3da1abc9371d', + 'db_debug_class.php' => 'a1ac847f296f4701473806f80d5f7d23', + 'debug_handler.php' => 'fe93f06640b293a65a068d800c22daf6', + 'e107_Compat_handler.php' => 'e76211b3178e4a9724933ecfe85ba8ea', + 'e107_class.php' => '4ce6554308d42363e08c45c5b711df27', + 'e_parse_class.php' => '39060ea3a2092ca529710b0fc4d69037', + 'emailprint_class.php' => 'c7de0da4205693ddb952e9723a7fc226', + 'emote.php' => 'b5d34cd652e828769f49b855b090c96f', + 'emote_filter.php' => 'fedbb8c9daf1acd5f6dbbb9914b05dc4', + 'encrypt_handler.php' => '7a6f592c0900d68fcf5cbf7b0eb1e364', + 'equery_secure.php' => '00121b097ba978d5330349abbd350737', + 'event_class.php' => 'd14906b7576984e7d9467c097e285b65', + 'file_class.php' => 'f193a200c2717c932e3dd1ae7d378fcb', + 'form_handler.php' => '67deba10eb6acf65d941b760deec6134', + 'forum.php' => 'da5c0d4378b7288610945979d269a79c', + 'forum_include.php' => '8b562f8ba508cc3572c84b443c4e7a6c', + 'forum_mod.php' => 'fd1adbf1660996aeb4f51384506e0045', + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'input_class.php' => 'f819fe76d1fa518f430410aa4e6c803e', + 'language_class.php' => '93fe59f6606cafbf4dddb8546fdd3a9b', + 'level_handler.php' => 'a231a4e63fcf4f498f9bfd7411250faf', + 'login.php' => 'cc67e51d6ea138cb66b9ada17adebaac', + 'magpie_rss.php' => '1297fc8132b5ec0a2c04436b38ec6aee', + 'mail.php' => '407db4ce0e57e22b7db8252af7f3085d', + 'mail_validation_class.php' => '75e722bf8c6975349ec402682323314e', + 'message_handler.php' => '176ebf4b88fb8267f143d28714bda42b', + 'mysql_class.php' => '4dc9c8b12ad9395b93c2452197c64259', + 'news_class.php' => 'c8c699da336670173562ede6f0f6a27c', + 'notify_class.php' => '2b2908df0eb85e94686bfed263389e77', + 'np_class.php' => '68a8edcf50703e47e19f165c1a108a45', + 'override_class.php' => 'a1f7451103a7fb47f3e541c31cf32343', + 'parser_functions.php' => '81daef0e484ee070d440e4ebc9bc8095', + 'parser_handler.php' => '650775595b663683a426c61dba6215cc', + 'pclerror.lib.php' => '7b1498a7efb4524dd899c954526c3ca2', + 'pcltar.lib.php' => 'b9313066aad3049bb0041099137a648e', + 'pcltrace.lib.php' => 'eb165fe908cc30c85975b7d35614990b', + 'pclzip.lib.php' => '1b0212a9a1e09b781172c8f6964296c2', + 'php_compatibility_handler.php' => 'f77929f2cd211a855516e3e72873ee99', + 'plugin_class.php' => 'd05c2666377d3c51de5c79119a56edc8', + 'pop3_class.php' => '3164abd686583e15f96901ab722cd272', + 'popup_handler.php' => '8915aa18adc4e69df003becaf508003d', + 'pref_class.php' => '4d2d63ee3f969ee742d6b989863b11e7', + 'preset_class.php' => '5a4df9b9b87aa3862dda2afd44165acd', + 'profanity_filter.php' => 'd41dc2dcd84a33f37f3ea1200fef3814', + 'rate_class.php' => '21ab83661e35eeb568386dc907a9726c', + 'ren_help.php' => '75ebce4f529d186cede57846d7f63693', + 'resize_handler.php' => '44e5777433fa18d97e80a4c16552f785', + 'search_class.php' => 'fe9c65c10349512b91164b8b67e724be', + 'secure_img_handler.php' => '18e7e3827ad38b79c3ff46b67e6627e1', + 'secure_img_render.php' => 'e772c2042868b1d9ecafbee3b4eab4ef', + 'session_handler.php' => '54f987aa4f0f2a31c646d9e0f81cd061', + 'shortcode_handler.php' => '845f8b0fdfe8b6d273d8e02f3cf8efd5', + 'sitelinks_class.php' => '64e7edf9541a0256066b9b636e550c18', + 'smtp.php' => '71008c80b0a5e12faef990c0560f8226', + 'theme_handler.php' => 'b38c4812a67c22705a15a263c66f3c92', + 'traffic_class.php' => 'd9939fec7c60e3c8b95111dca22ce918', + 'traffic_class_display.php' => '4583aae09eb49619d1b302160c27b721', + 'upload_handler.php' => '8720ea79c13c327e5c1c019daf077d4c', + 'user_extended_class.php' => '893014f71353a16c7eadaed563ac5dc7', + 'user_func.php' => 'bb871abafb6c91109c809afa9514afcc', + 'user_select_class.php' => '5f08187de31a562d5ea8ad88e1f6a3b2', + 'userclass_class.php' => '141c0e6732238a2c8d2dbfee515fb376', + 'usersession_class.php' => 'dcd6889bc9e8a11cba08fdd13f629615', + 'xml_class.php' => '2625ffa68fd7516ddf64eea40e47f218', + ), + $coredir['images'] => + array ( + 'admin_images' => + array ( + 'adminlogs_16.png' => 'fbfd5c6e0baadff05bda59e2f077a0d1', + 'adminlogs_32.png' => 'efd307a26601627eeebf563e22c8e5e7', + 'adminpass_16.png' => 'fbba9d9f7580b2f98337f8c0f18d5c53', + 'adminpass_32.png' => '57fa674965e09299b6cc340c7d406a36', + 'admins_16.png' => '64ad9ccbbcf1be92f0822150034b9c1a', + 'admins_32.png' => 'dc9cb0a7263efa4ea1dbb17ee1cdaa92', + 'arrow_16.png' => '38b69b179e7cdf232aa367a0dc3c4cbd', + 'arrow_32.png' => '95eb3ca28bf59f4cdbefec8fa86c3895', + 'arrow_over_16.png' => 'c37f8d92046ccd1ea70cc3cfc8f0fbdf', + 'arrow_over_32.png' => '93b788fd693c261aa8ea9ad788fce9b1', + 'articles_16.png' => '2d99036d870389c45c140370ec296050', + 'articles_32.png' => 'dbcdcd9f704906b9f3e1b48394abd545', + 'banlist_16.png' => 'e2f4be1afe16286a0a5363ba5a88ffe8', + 'banlist_32.png' => '5545b900ef6b8c90bce85143e5a985c9', + 'banners_16.png' => '052830d01fdf73ed2e1955ab76f3859e', + 'banners_32.png' => '3331be741e6c3f336034d6ddc5d223c3', + 'blocked.png' => 'd2b20874ccf7079dbb71b6c94e117d21', + 'cache_16.png' => 'f9aefee07fadf8f40e3883bac2973470', + 'cache_32.png' => '76ddb6584a9096bab54567a082357f8d', + 'cat_content_16.png' => 'af826022cad1ad5c5d2703d0a440aaf8', + 'cat_content_32.png' => '80f9caf4f37acd5bdcdd4afb7ceeb6e9', + 'cat_files_16.png' => '936037636275ca4c41a08fb962c79b86', + 'cat_files_32.png' => 'e6d063e74e730d05d688626c6d375b89', + 'cat_plugins_16.png' => 'a6bac798e6dad7b2e40487e3dedf51ad', + 'cat_plugins_32.png' => '74b17e491961633f65a2510e92ebde18', + 'cat_settings_16.png' => 'd981addefa729f697bf0b0dbf70293ea', + 'cat_settings_32.png' => '707034db3893c074c959a226ac6f6732', + 'cat_tools_16.png' => 'd1405a8ef3d0320c3ce7c8e870bd50b0', + 'cat_tools_32.png' => 'ffeca06ab80ddeb1453b397ac30816c1', + 'cat_users_16.png' => '32441383ed5d50d6fa9188b98d957dde', + 'cat_users_32.png' => 'a331baef28f6e923bad1a26ba5d17e4f', + 'chatbox_16.png' => '6524280b8f44bde11dd5ca5581432c14', + 'chatbox_32.png' => '2e6ae5a5be12ec8d09b5083e959347b9', + 'comments_16.png' => '721b2c81aa4fa1c43fe4211fb35c2ce0', + 'comments_32.png' => 'd5ba6ada9b084efe6209e1d9d603f749', + 'content_16.png' => '0205fc5130dc19a8b279244aeeeb4729', + 'content_32.png' => '2d2b276bf5f57a38575446262ac4fc75', + 'credits_16.png' => 'a24c7cbe05d44b7effcb6386f6a69455', + 'credits_32.png' => '6b96e92e85026907fcc4be6c45ae60df', + 'custom_16.png' => '3fdd7c500f2a5c8f9fe221d710958593', + 'custom_32.png' => 'a3813ae977ea3567b61d9bd3dfc398fb', + 'database_16.png' => '61541674f83748834b299d27d3aa5eb9', + 'database_32.png' => '83bb87a7cbaf1d57cdded1fc7078f2ec', + 'delete_16.png' => '3efc7450de9b20183c7196e3fd9a0b8b', + 'delete_32.png' => '5c479d67b5dc9f8fcc567d4201619b5a', + 'docs_16.png' => '70c3594a0a096d55e2af638a4bd7105e', + 'docs_32.png' => '2903138ad0be7ee641704dceca59089b', + 'down.png' => '434814c2c747f4062c6306fbfbec0622', + 'downloads_16.png' => '98cbf2ae49e39048e7ca60cc56898477', + 'downloads_32.png' => '1c745a271507abccff12574123b14f0d', + 'edit_16.png' => 'b6a25f62385219e73803e16c9682d438', + 'edit_32.png' => '17546bbd5fe9b8975fca44318f693932', + 'emoticons_16.png' => 'b92db0a7212cee1023293df03ae5bc90', + 'emoticons_32.png' => 'fa8974be1a06298f9819a1a203be02d8', + 'extended_16.png' => '4a6f3c5952ca3417e278c11d2551388e', + 'extended_32.png' => '72490efba6641db9a7521ff440cd9af9', + 'failedlogin_16.png' => '8888638ff60c8b47131f02a66c8df598', + 'fileinspector_16.png' => '7f7e61d6ed995277ce5fb60496d1a512', + 'fileinspector_32.png' => 'ca4961289d1d1a0aa22f561c6df68f3b', + 'filemanager_16.png' => '936037636275ca4c41a08fb962c79b86', + 'filemanager_32.png' => 'e6d063e74e730d05d688626c6d375b89', + 'forums_16.png' => '5773aa73ab08e4e575ceb2d60001f8f5', + 'forums_32.png' => '543708df3b2731ea4607ea5741a21f12', + 'frontpage_16.png' => 'e60c942e6e9a06ef05d167d7baceb2d5', + 'frontpage_32.png' => '2f385c03a9223119729ae2a08c28c1c9', + 'images_16.png' => 'baedd05460c41fd50c3eb4560cf1d574', + 'images_32.png' => '594f730d41b24b6c2da4b18e7173712b', + 'installed.png' => '31969aa03c0d7315e6b7d6b6b82e9e8c', + 'language_16.png' => '15f89da876e53572a12521378b92dc0f', + 'language_32.png' => '361c4a919639d165831e65a3a2c4fef1', + 'leave_16.png' => '536b996002b22632e757a82256e09417', + 'leave_32.png' => '171a1609e849b1836046e84cbd590bad', + 'links_16.png' => 'd3da622046d044d11ee0f4418eafc426', + 'links_32.png' => '41df266db1ae2cb292804acb1993e383', + 'logout_16.png' => '1344f00789bc5007f0219ee412bc59cc', + 'logout_32.png' => 'a97a480f681f58ef845d441fb3cb5eba', + 'mail_16.png' => '0ef7b53ee7a39baaba506f330f7ae161', + 'mail_32.png' => 'eb62361ca3d16865045a224fd8c74cf3', + 'main_16.png' => '7df71fa173411541ec291f858ac33c40', + 'main_32.png' => '1573eaa39de50801aa3e612ad99cd44c', + 'maintain_16.png' => '8914863c97d297e7952034ee35b9580d', + 'maintain_32.png' => '18c74535a7ecea3f53e05ff4ceb47c49', + 'menus_16.png' => '45889621dc7577c1b5ec6627d1260ecd', + 'menus_32.png' => '1df6ff20ba41d511667aeb95ec79b024', + 'meta_16.png' => 'd016ee58c8a4b3be2347e1e6a560f575', + 'meta_32.png' => 'cebc0933e6f32ebdcd174f1cd2c84175', + 'news_16.png' => 'bbc0eb1411a21d970b3f3c9855e516af', + 'news_32.png' => '5d7c3b72896f141b62dc256fa317db5d', + 'newsfeeds_16.png' => '861fa883c8f6068c7826805013d07373', + 'newsfeeds_32.png' => 'f0f57c5173167da962adb1517b2f98ff', + 'noinstall.png' => 'f89fe8f057694f93e4e163e4daf3de2e', + 'nopreview.png' => '49737d3c5a4ec9283374d6d0ad51d0f5', + 'notify_16.png' => '18ec179018401ce76acc5c1c06907844', + 'notify_32.png' => 'f766bf524380a6a38516cbd66ce9c5fb', + 'phpinfo_16.png' => '5948f2468a9c5103a70f0e6e1345335e', + 'phpinfo_32.png' => '2a7d8e07347e42d4e0b33e48bc7adffb', + 'plugins_16.png' => 'a6bac798e6dad7b2e40487e3dedf51ad', + 'plugins_32.png' => '74b17e491961633f65a2510e92ebde18', + 'plugmanager_16.png' => 'c9e73da3fd4c7599a95898def126e2da', + 'plugmanager_32.png' => '07f656ab0bae75a4dd83abdec439b4e5', + 'polls_16.png' => 'dfa11ad7ecf088f5bc50152e3c8318de', + 'polls_32.png' => '7c98815961fc0215e8bd38aef5e1c295', + 'prefs_16.png' => 'ee40f8fae0672844fe428863e7b9b28f', + 'prefs_32.png' => 'adcc28e37b40a339342bd1777c88efe3', + 'reviews_16.png' => '8d3eb23e13ea9c11108fe0e2959a0ced', + 'reviews_32.png' => '22750ab40ad6355053b9f6d88662f775', + 'search_16.png' => 'f1f617ae57346558eefce7d0b79b71c2', + 'search_32.png' => 'e0035406d30341e044c130ec0543a6c0', + 'stats_16.png' => 'f24d43706a08a9b56af5a32b63450ddb', + 'stats_32.png' => '403f0037feb233afd45899101b1a5630', + 'sub_forums_16.png' => '16a40908a7b37e8353c978ce3ecd1910', + 'sublink.png' => 'ccdbd8fa6d0d55ab04db69d55b4b85fc', + 'sublink_16.png' => '01e36bad2b292ae96fc802fc3a13d3b2', + 'themes_16.png' => 'dd5f28c2c4d15fae13310583371bde31', + 'themes_32.png' => '17c89daac72616669908555e43dfc127', + 'uninstalled.png' => '5b2f9aac0af8a3946a22e0ec066817eb', + 'up.png' => 'f023b6d5e7688dc3bdc0f42bbb8ba002', + 'upgrade.png' => 'd22e7b79c115c954255120aee1718277', + 'uploads_16.png' => '971a694016a861f18d746bbd2912be9d', + 'uploads_32.png' => '7a1d3f37f5f724f45fb2b9a8bace7582', + 'userclass_16.png' => '1ec9ff416999d28f737495e5de9a50a6', + 'userclass_32.png' => '7b017b1b700055243424f94aefeba3e4', + 'users_16.png' => '32441383ed5d50d6fa9188b98d957dde', + 'users_32.png' => 'a331baef28f6e923bad1a26ba5d17e4f', + 'welcome_16.png' => '997361b25db69ead1224a55f44ca7a41', + 'welcome_32.png' => '2bd4b95221a8d83bb03d9f488e9879b9', + ), + 'avatars' => + array ( + 'avatar_1.png' => 'afcfe041eed1d882cc4931d389a53f6b', + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 'banners' => + array ( + 'banner1.png' => '3d15e8b33ec2644f1c63e75b5878cd32', + 'banner2.png' => '1f7e31b2d7608c12d2f77612780846b7', + 'banner3.png' => 'e0d62559bab3b6634281900187fa548b', + ), + 'custom' => + array ( + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 'emotes' => + array ( + 'default' => + array ( + 'alien.png' => '132447203b23b5ea2b27f163ae147375', + 'amazed.png' => '76ccc59194f25ef34164935d0ebdc81a', + 'angry.png' => '6339c6e824beaf63c72d01e7fc1c5039', + 'biglaugh.png' => 'd640e904627dec36da78083017e77e71', + 'cheesey.png' => 'c69f60044b7e243c1fefc24e2097c923', + 'confused.png' => '68af16e7f4d1031ea0976a73896d3dd2', + 'cry.png' => '75b3ff5af3f778c338a8e035005bfd96', + 'dead.png' => 'd1e3e9babb3aa762ec12444ab14b9029', + 'dodge.png' => '191aaaf658e90d1038fe56c3cf457f48', + 'frown.png' => '93e1b4df23ce2f4ea9f311c16b3feb78', + 'gah.png' => 'e86e47f9879750f6b65c4abf11c3b676', + 'grin.png' => 'a7ca30b7e3e2ff04324c5dc4b5a9f10b', + 'heart.png' => '6725f455e4bee2790a1e41409ea442fb', + 'idea.png' => 'bd3714d2834a24f37e44c75d8945aad6', + 'ill.png' => 'f19506e014a984c51d353e91ab407b63', + 'mad.png' => '728d6690e01f2e71609042976617ae31', + 'mistrust.png' => '3b6461df233511acb6b11cbcaf561675', + 'neutral.png' => 'cbedaeb373af5636babb772e867d53de', + 'question.png' => 'b90dd830b597832793e79b6cde609039', + 'rolleyes.png' => '79d5a5bb55e2bea788a1295ee8f3822a', + 'sad.png' => 'a9c921562b864bccc37d22661bed896a', + 'shades.png' => 'bc0d623f3569ab29cffcd59ceaf0c7ea', + 'shy.png' => 'f89a41079638cfbf785a59689b92b628', + 'smile.png' => '98412834fb8063733c819817150a6706', + 'special.png' => 'b54e4cddfb082fcf4104e44a71a9599f', + 'suprised.png' => 'c37ca48c0545b29439594f39e7a11964', + 'tongue.png' => '2ae4736fd035307f24332e603156e09a', + 'wink.png' => '5d4053942a4eb9fc6546b981b94fb9b6', + ), + ), + 'fileinspector' => + array ( + 'blank.png' => '36d4a4e95c2b83ac5aa338420d1c5bf9', + 'close.png' => '2955a752035c039435b4b0a8a37b3ee7', + 'contract.png' => '0fe7c9f9bcb9b3ab1b08d7e8e04c7a0e', + 'expand.png' => '265205998404f04e3e2341b5af839054', + 'file.png' => '853ef1ee108dbf52dc94a30b71e34e4e', + 'file_check.png' => '221397df4726589bb54824f6168d5484', + 'file_core.png' => '14659f2933ff4d012e0de7c1906a243a', + 'file_fail.png' => '354ee40218c997f8c91505b7f5921ff5', + 'file_missing.png' => '98ab830e6df162aef5bcc01f27d4703b', + 'file_old.png' => '594e132af5820c784354ea1f2266867f', + 'file_uncalc.png' => 'a64ad7faba8f6cc0cf223a5eb5edd52b', + 'file_unknown.png' => 'a8c3227bd1a34953f4cf399d8a3fca9d', + 'file_warning.png' => 'c89ce9c864175d152e68f52da184a50f', + 'fileinspector.png' => '7f7e61d6ed995277ce5fb60496d1a512', + 'folder.png' => 'ebc79586731bca95fc8325db909d3868', + 'folder_check.png' => 'eeb4f5128a415b4a967e419c88a31084', + 'folder_core.png' => '9b651167d978554d0e9fe8ac8d6014fd', + 'folder_fail.png' => '5c22933b877ca80494776f773122d179', + 'folder_missing.png' => '2795a36251fdb85980152557f235a44f', + 'folder_old.png' => '9a6a2a03b1bb4b93c0f24e3d9359e56c', + 'folder_old_dir.png' => '1bb0a25fa42a634a3d44c28e0af51723', + 'folder_root.png' => 'd6c388fcb5d70f133a1fe2275a40ea20', + 'folder_unknown.png' => '7332f53c115b6bc71972ae311cf030ef', + 'folder_up.png' => '7039e15ef64fd80a86a485a0ed59ee51', + 'folder_warning.png' => '06979aa4ae89a09acd2ef5c926566a97', + 'forward.png' => 'fdd333af9d6f6c75a15353d95b4870d2', + 'info.png' => '14a80e7098141b76d3a025a31cba972f', + 'integrity_fail.png' => '1b6843bcc78dd0f3919535f2c4f3131c', + 'integrity_pass.png' => '324a8f77bfbd3a84b1410cd35c9341ee', + 'warning.png' => 'df4fc8eca478c717b04b6414c94ae76e', + ), + 'filemanager' => + array ( + 'css.png' => '32ac2a0c288cf0aa36e38f4b5e6dc5b6', + 'def.png' => 'fb1d041d6a8676ca6b0e06774555fd01', + 'default.png' => '5930437a90ea872cf3bc52ddb8d960ef', + 'del.png' => '7ad01b059b7a69f526a0b382e5bf4387', + 'exe.png' => '5112337d61d7bda70bbecaa268ed1a73', + 'folder.png' => '106b81b7f1a2a088ac79ddd77fb2f151', + 'gif.png' => 'b863d1f9574232a6ea988fb7b8557854', + 'home.png' => 'cf548efa0e9e1ae3e22dd274a0d2d772', + 'htm.png' => 'de8b6e1e5f6730bb203d972b8ad85932', + 'jpg.png' => 'ca0dcf0c83d88c7c110070bf1019d1cf', + 'js.png' => 'd5ab294b6715368d746595b3f315819c', + 'link.png' => '23a41af7f24cca6ed09919efde7eb13e', + 'mp3.png' => 'f1686b1c368acb226332ed1f38feb256', + 'pdf.png' => '03d111bedff573dd436a0cb75de1e19f', + 'php.png' => 'f2d2759af9ddecc7b90ed8647db7a114', + 'png.png' => '2b8e0d0f947520dcb37568a3317a0d64', + 'txt.png' => '64e05312c122b017f6f2595e6df320c5', + 'updir.png' => '562f1cb1fe4038dc999db57786ad2f3c', + 'xml.png' => 'd8b2f286726d631b1a819cfd2c62e89e', + 'zip.png' => 'd4119fcc2b0b0080a1e98645c109e314', + ), + 'generic' => + array ( + 'bbcode' => + array ( + 'blockquote.png' => 'a06a9e6709453140681b7a97a7692870', + 'bold.png' => '3e23e2d8c5a4a2e7c1b750a5df9b03b8', + 'center.png' => '742d4eafd59c556ca747f6ae69aa04f8', + 'code.png' => '30583ffe0299705ee851a87dd7b8abe5', + 'emotes.png' => '64e692b505df9624ed2318c406eb5346', + 'flash.png' => '7a671f203fe9b582477ec0b1ebabdbc9', + 'fontcol.png' => 'd2175741c2e7e09aaaa134146636df67', + 'fontsize.png' => '89110496b363b669e3e8dffb630b9279', + 'image.png' => '1db77a12868512a36f836b986e6bb648', + 'italic.png' => 'a3e561a3c5d01819a3137562fd982958', + 'left.png' => 'bc27363615e096a000103c21984cd79f', + 'link.png' => '3adc8c31d1470a6cce76416fe0b6f3d7', + 'list.png' => '6bb4e650cad9857c47bb1433fd771052', + 'newpage.png' => 'ca132dbbb5c50e1486c02c3f0f9afe11', + 'prefile.png' => 'ab42c617455c9f05d5ea8534d607e4f9', + 'preimage.png' => '101b73c1584a2d14c4c313a15a66242e', + 'right.png' => '885e764546e87d2fd526b977aed84d1e', + 'shortcode.png' => '2c296e414c6e833bdcab2e3dda798061', + 'template.png' => '54281aba1f70c00dc1c947fd053fddfe', + 'underline.png' => '09d08b8f890c4ebba77ecb9f25f20705', + ), + 'dark' => + array ( + 'answer.png' => '211393b753f0c8aed1e9a24856195ce9', + 'arrow.png' => '998eb269289b90ad8d004bbcf39378c2', + 'download.png' => '7319b1158fefde24a4d87aab735e6333', + 'edit.png' => '418103beb48a1d430ef7e0804ba6607b', + 'email.png' => '7d37fab1f0904165a5f64408f7c455e9', + 'file.png' => '60fd70ce4acb78b454488c4ef9d99f4a', + 'image.png' => 'ed4e650087e42f815f5e086f021b9a9f', + 'new.png' => '96d33a15dfe1558805084225734cea60', + 'new_comments.png' => 'a4861dd50722e8d8b9b7f4cffa59ad3d', + 'newsedit.png' => 'fef524ec2422d5a35c422c57afda4f87', + 'nonew_comments.png' => '5e5332c02e5fd1863ea1e7b907124f89', + 'password.png' => '2703c1268bee5c1582919a6155ca634c', + 'printer.png' => '8c123d297261d687712d952ee30d6c4c', + 'question.png' => '790b246cd96a583ce2bb0b7e814172a6', + 'search_advanced.png' => '8cfb8fa25c792cbca4f4ff115f81ee08', + 'search_basic.png' => '9b3da3928a4e3ed317ad0dad431c93ad', + 'search_enhanced.png' => '6cff954f99c462eb9eb722554b7463d1', + 'sticky.png' => '25295751d78f9990a6635e6e2715fa43', + 'user_select.png' => '2431cdbcffa1b1d898b7e0ed8fd967e4', + ), + 'lite' => + array ( + 'answer.png' => 'eb63ab9d559dd785415ab5a783e93901', + 'arrow.png' => 'c56779c444bd61c1eeddb94fd8af3d61', + 'download.png' => 'f7cc87125001ff1ed99bf19887f7e6f3', + 'edit.png' => '726bada8e08555d38a6fa1a2b6655f8e', + 'email.png' => '14841d450ea66f22b82813f0468dae51', + 'file.png' => '734c8c413045129b92aac717daeab761', + 'image.png' => '10146c68a6f1acc36eae2cad602451d2', + 'new.png' => '28c7e4fb6b93a103c315c6930952cb13', + 'new_comments.png' => 'a4861dd50722e8d8b9b7f4cffa59ad3d', + 'newsedit.png' => '987e90984c9450e1dc1af89788d5ec0b', + 'nonew_comments.png' => '5e5332c02e5fd1863ea1e7b907124f89', + 'password.png' => '0c9ea13d60acd72b66ac44e2d12d432f', + 'printer.png' => '743fbcc77ab2017e6d02d6759585e0ca', + 'question.png' => 'c1ed6f4aa816112b7454eb6b2c2c15ba', + 'search_advanced.png' => '9d443b535924d4d840533f56def13e1b', + 'search_basic.png' => '4994d26dfb8a01d9dfdf0e594513db5f', + 'search_enhanced.png' => '9ad50bb193c4c53ceabfc74131901419', + 'sticky.png' => '23d10c4451b4f17d249f6eeb7b721cf6', + 'user_select.png' => '4ee12681a97e352b072dfa9d5dac808f', + ), + 'bar.png' => '278ca1b407bc68f138fa64f226700631', + 'blank.gif' => '0e94b3486afb85d450b20ea1a6658cd7', + 'code_bg.gif' => '2b9dbcbb11a7b4fd46c3b4b25f419435', + 'code_bg.jpg' => 'd1693c7b554681efbd2e82ce04907eae', + 'code_bg.png' => '09bd8d9951b5d993bb4371836a9dae51', + 'cred.png' => '0e39907fdaf0dca630919b54ab01c9c1', + 'php-small-trans-light.gif' => 'f3cffe6d2a1a2fdd32c4d694e9cc989c', + 'poweredbymysql-88.png' => '850c2974bb9ff8fc41fb9cfdf244ce52', + 'valid-xhtml11.png' => '875ce84f7794284f50cafc7aab8b5a77', + 'valid-xhtml11_small.png' => '142b92a420fc7162912da3f96fdaa654', + 'vcss.png' => '780ad30f6a83c9dde3464ba9a4aeb664', + 'vcss_small.png' => 'ac93bad1a0a152c69bc0317b41b2ec63', + ), + 'icons' => + array ( + 'download_32.png' => '28d16188580b522e2e296ab985aa371d', + 'folder.png' => '20aa54f4fe9e4c3323d50089f0872a90', + 'folder_32.png' => '7d501e7392007bcf7458c8291eb0d4fe', + 'folderx.png' => 'e801994723571d22e198487431ec7573', + 'folderx_32.png' => '8ac80a5d0cd4a4a08bdabb7d050e272c', + 'html.png' => 'caa46c5b4aa1bf948a96dcb4c3c6611b', + 'icon1.png' => 'bdb55c0c08483b5a5f13bb602ffdfaf4', + 'icon10.png' => 'bef1f2d8866047851fd707f207c56908', + 'icon11.png' => '9dcfb98cf72b89dbbc7501d944ac1849', + 'icon12.png' => '1438dfa7e1f6082fe54f27969007b8cc', + 'icon13.png' => 'd5e20c025e0d4ac1a53adb995733fe9f', + 'icon14.png' => '8db20481620879f5ab538cca21323834', + 'icon15.png' => '63083b9dcc1cdeab206c36fa0f1982a1', + 'icon16.png' => '8195650382046743734b7fcfafcc27d5', + 'icon17.png' => '7256aa31268c39b5d47744199d7fb18b', + 'icon18.png' => 'e582b78688372dd7fff9851d1630b948', + 'icon19.png' => 'c9bc67c97ec8728f1b224599cb440c0b', + 'icon2.png' => '78fcc298d3b1153a29b95566d42a993f', + 'icon20.png' => 'f915bdcd951e94a263d4040fb760aed9', + 'icon21.png' => '0a26bcd73d38dc3acbf36399c66b3c94', + 'icon22.png' => '69b7fda0348fc416f98b8ef0c5eabe8c', + 'icon23.png' => 'f33c700ea73802ef02e6a4fc3262c074', + 'icon24.png' => '3c8bb8e3ed55fb42e81375d62ef4a88e', + 'icon25.png' => 'ffb34f77aa4a07a00618139204a860b7', + 'icon26.png' => 'bbc0eb1411a21d970b3f3c9855e516af', + 'icon3.png' => '8bd10c2043823acfc344a20ab3efee24', + 'icon4.png' => '66383ba925e4f488df0fe4704d362627', + 'icon5.png' => '83c34cfb4244dcca5fc42489aab98998', + 'icon6.png' => '03e04b50657db966ff6ae0fc8930d904', + 'icon7.png' => 'cdc8a8584b62f53498f4d90ecbffe7d1', + 'icon8.png' => '716b3b9833d4cb03a5594cd0111784f9', + 'icon9.png' => 'd0505cfb21a6d1c8cd6589c0a31e82cd', + ), + 'newspost_images' => + array ( + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'welcome.png' => 'dcd1a6d6463e28fc84994d56bb383060', + ), + 'rate' => + array ( + 'box' => + array ( + 'box1.png' => '89b6a1c3cf0178d55bb0c13a1f4bc70d', + 'box10.png' => 'eac820c7f66f66b1aad4bac8b0d42338', + 'box2.png' => '034686d522c6d907831f8272c9d2c35a', + 'box3.png' => '98481a017e09f720d6e725dd9a60f189', + 'box4.png' => 'f001913a928f9b5877e44b6d616d70a9', + 'box5.png' => '2a007464b58c49afd3f4b00aa9f6d6a0', + 'box6.png' => '7166324ef491fbc3ce7b20bc207c1699', + 'box7.png' => '35b7e46ffadd8e7b01beadba18fe1577', + 'box8.png' => '53be60725cc237466b537c9e47774473', + 'box9.png' => 'f9e1f9e5a88fec0569830d1bdbc1b5f3', + ), + 'dark' => + array ( + '1.png' => '069d68706d00652e2279a2370e1e1204', + '2.png' => '5d9e897ad6269159cae542557b1b088f', + '3.png' => 'b8225487772f15980bd8266a01c22cae', + '4.png' => '06197264693d06769207d56b83040cfd', + '5.png' => '9cb0b783db4ffccc38364a9aa6528381', + '6.png' => 'dc6b3fbb86581ca69175ba77cf1bd0a9', + '7.png' => 'ac5ea785f9d34fb2588cf24f5a3a3e60', + '8.png' => 'ed599a5204eaedc2c915f9bcdc609948', + '9.png' => '1035b9d5ff65916393620614057d1d79', + 'lev1.png' => '71860ab527620603bb1bd33083cd0c3f', + 'lev10.png' => '28fe7e15be0ad8e05cd4945e4c130967', + 'lev2.png' => '0c3cb7d2b6cd217d71a0bb2f5e255ed4', + 'lev3.png' => '5c1d9aba19a174ff40912534a52c6c8e', + 'lev4.png' => '7a7b0127d381e6128f1506c6d0ca7470', + 'lev5.png' => 'c52ea0fdaa597d4f5a2ab93981055b4d', + 'lev6.png' => '54fc1f5cdb88d2e6760cd44f58ae9a6f', + 'lev7.png' => '20e4472caa04d0db921de375c6a08b5c', + 'lev8.png' => '556266576a5d7bec39ccdc083e7b58ed', + 'lev9.png' => '99197d2afaa22ed2900cd9e231f7a37e', + 'star.png' => 'ca86f6b6a0dce04e3dbe14e2c9877e3b', + ), + 'lite' => + array ( + '1.png' => '6f7d1164a961cce68f45285a97e29a76', + '2.png' => '0bb0e1552ed71dacd2b824ebb195b8d6', + '3.png' => 'a39a7efccfef2e081383ce04cadb0b2a', + '4.png' => 'ec2547815e60e48d19fc278820155ffb', + '5.png' => 'c30ddc4ef328fc632e3a1d657e5383ac', + '6.png' => '1c33896015f47a12c8a64c29c133870b', + '7.png' => 'ab0d30021e8cc388eeac86356a92dece', + '8.png' => '882dabfb4a1accdb6a43f4f46762fee3', + '9.png' => '4e9592963cbcf80bd10cc980c99c71d4', + 'lev1.png' => '2b93a27bfa68a64c4f943fedc7a2db9b', + 'lev10.png' => '74736097ad258eda613888017ae1f886', + 'lev2.png' => '5289520ced54a12c5dde1919e9a5cd71', + 'lev3.png' => '71d9a412fac35ba7a396fb343d30c792', + 'lev4.png' => 'd7eef7456c608c89e65f2093e6fa4eae', + 'lev5.png' => '0ca73f9360c15138214d1660df733e0a', + 'lev6.png' => '3aec7910ecc2b6a518b67beada1e017c', + 'lev7.png' => '58c3f5c41b6214171b741bcb0fbf1823', + 'lev8.png' => 'e9b674e663de20e34520794598be3064', + 'lev9.png' => '4cb78772cfc2cbf653a3df8576552dec', + 'star.png' => 'b9f1804f1a08c3084ada5c034184a132', + ), + 'box.png' => '37e0a80e5782adee28a52e456d11ba07', + 'boxend.png' => 'e075b96122cb84dd7bb9d0ce8c789e84', + 'star.png' => '59876e874a49bec49ee4c867a5e52251', + ), + 'user_icons' => + array ( + 'realname_dark.png' => '495b61c3f719bc8bec44e1b25cc0b196', + 'realname_lite.png' => '9ca664d347f80793f016f61986ea3a38', + 'user_aim.png' => 'd54ddd04c02bcbb1dd6593ff5e8e2fa3', + 'user_birthday_dark.png' => '4acaaa85b357e0572759282ffe1922cf', + 'user_birthday_lite.png' => '14bbc908d5d6efefc6739d7806aa6bd4', + 'user_dark.png' => '85bc493bf67af508e5320a924b54cce2', + 'user_homepage.png' => 'bf0ee3d43c8ec5aa81d8425e51ef0f37', + 'user_icq.png' => 'eaa044e6d235a88c79ee2fd42d6e8a17', + 'user_lite.png' => '12b7c805c022708d57cf0d2ecd8b4a02', + 'user_location.png' => 'e2571843e8ce3df251f0a3fd5db53729', + 'user_msn.png' => '6aede4988c88b3e3829f1387cbf3914f', + 'user_realname_dark.png' => '495b61c3f719bc8bec44e1b25cc0b196', + 'user_realname_lite.png' => '9ca664d347f80793f016f61986ea3a38', + 'user_star_dark.png' => '899b215d9dccb0ff4ff38d7d1decf031', + 'user_star_lite.png' => '3c579e4f29bb42a413567f241cb3a2c2', + ), + 'adminlogo.png' => 'aac088a88a8c729f950c158fa875f1ce', + 'advanced.png' => '8e1db463c3cace7822b51ee311d208e4', + 'button.png' => '4388e88589f99a52a2cffe5f7e837548', + 'e107_icon_16.png' => 'd49ad6870dd304ce1b30b56be446ea07', + 'e107_icon_32.png' => '9fcedf8edb4728a97001fd5cc9616ef8', + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'logo.png' => '22bd0af2fc2849c900ebec1ea80bc8e3', + 'logo_template.png' => '78e43c6f2492f1c5bcb5b4d223ebfc75', + 'logo_template_large.png' => 'cce83a8f84255d2bab00522b73a4e6d4', + 'pcmag.png' => 'abe521ccc3a89a43ff641ab3daf1f37d', + 'splash.jpg' => '7f749391cb6d31dcf9c9145f3d30df4d', + 'thumb.php' => 'd606e6c43e39f27bcf9f7622e32365eb', + ), + $coredir['languages'] => + array ( + 'English' => + array ( + 'admin' => + array ( + 'help' => + array ( + 'administrator.php' => 'bfc3305d4af30024ef36e2c3cac685d5', + 'article.php' => '3c7df3956134df9dfc86a4a67b73d78b', + 'banlist.php' => '589e0268a08606ff935ee928292602c7', + 'cache.php' => 'f889aa4a1889a3112699c899eb655744', + 'chatbox.php' => 'd5aede1254e7e48e3e8733f18f6ec0ce', + 'content.php' => 'dcf60ff22635488c42b4a99243bdf9f2', + 'cpage.php' => '66e658a3daca00f9fe6d9bb1e5016eef', + 'custommenu.php' => 'bc2d5fff1395d8495a45b80da77b7665', + 'db.php' => '56210313eb216b42cedde3f548461f70', + 'download.php' => 'dcfce12aec25465d48762456414ca9db', + 'emoticon.php' => '44293ed224e20f90dc81554c1064842a', + 'fileinspector.php' => 'b2ad72e245b79f582ee54c9ed1b7319b', + 'filemanager.php' => '62e147fa032aa065b11a139d3d53a241', + 'forum.php' => '161249fcb72351dee1b5b56fda1a15be', + 'frontpage.php' => '44e0a1156408e6ccffed96f35a516d04', + 'image.php' => '11a6e5190f22d4c3586b440a15203fdb', + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'language.php' => '514346599719d0abc2f0a947945c77c8', + 'link_category.php' => '5352ce360022a7fc0882fb77603405cb', + 'links.php' => 'c9c06673b3d7089ac9a729e1601b82c4', + 'list_menu_conf.php' => '88bd581ba21987493206e430885cd3f0', + 'mailout.php' => '5050871042ba40b90e0dac92c29dab0b', + 'menus.php' => '9b2d9d2e0610b55965d9b49ecd7a91c1', + 'menus2.php' => '2249f7d8b325af8945ed1a5a3e9721e2', + 'meta.php' => '6c85ff99c2707a2d6e73ac990971ba83', + 'news_category.php' => '0c0bfcbb20aea2de7508c5cc3c4826f9', + 'newsfeed.php' => '93f7ef1481d3fc59ecde4d40ad6b6c84', + 'newspost.php' => '13fda1563ee88b65ebd855113ec7caef', + 'notify.php' => '96e76c0244bf06754516ced2bbb6a760', + 'phpinfo.php' => '201f61e8c6ba0619083a30143af56625', + 'poll.php' => '3adef894abf1c1920a311899071ff8ee', + 'prefs.php' => '4cc47a077677b93cdede1ca55e3b354f', + 'review.php' => '6997e7c8d919246f698837c0ba3693b3', + 'search.php' => 'e9b596e5e8855fe87e8905cf0dc9a6bd', + 'theme.php' => '7ac282adfbb1f04fc10a6aa07c11e7bf', + 'ugflag.php' => '3c686a412439317be96965a4f31bb720', + 'updateadmin.php' => '60b51ca80381001703f4af931236cbc2', + 'upload.php' => '38d7510182a2e393cd1a09b924c95df1', + 'userclass2.php' => 'b1e5e797e72b5015dd9a7b39ad7dff22', + 'users.php' => '135781d3419791aa07e7fb8988a733fb', + 'users_extended.php' => 'b73f20ff4c7d9f9b9eae883b300b2426', + 'wmessage.php' => '5aa5f420a6b29adad555ef7e55bd932f', + ), + 'lan_admin.php' => 'ae4bbdef3610765b59d67e2858707177', + 'lan_admin_log.php' => '0f9dacdf93cb2d6a4145487de304cb87', + 'lan_administrator.php' => '83b1eaead32e6c500d42a74c40b059a5', + 'lan_banlist.php' => '4b00aa5ed58a9f78ad1cbefb74dedb33', + 'lan_banner.php' => '11d2439138f74b116de4697e066f7ca5', + 'lan_cache.php' => '0926abdc99274d71157280c9d58749e0', + 'lan_cpage.php' => 'c95be0bafa672c32d75394f94bb3af02', + 'lan_credits.php' => 'aae0c491eb54b8c529013691755044a1', + 'lan_db.php' => 'c68b85a8b0c9817d3b996a5eac953b7f', + 'lan_db_verify.php' => '6c6067d3b23c7c0d9f36cb17867dc80a', + 'lan_docs.php' => '9df02b4a6fafef4e9be2962bfeaed509', + 'lan_download.php' => '5b3e7f94055a824fbdecd45bdd67afe6', + 'lan_e107_update.php' => '46f96e33e39b17c2ba54ef3011082041', + 'lan_emoticon.php' => '58e2c1f2752eff0f4ec7e1e0c126e3b8', + 'lan_fileinspector.php' => '70c6b39a6d29f3c77df604e2293d43b5', + 'lan_filemanager.php' => '8955a0b3b7730d3f008957108525ccb8', + 'lan_fla.php' => 'a987a7502238c9f1dae9555d944ebd38', + 'lan_footer.php' => '74880a9ba3fbe4524bc2f0987e936ab6', + 'lan_frontpage.php' => '37ec01b89e67032f33498cb43e44bdc9', + 'lan_header.php' => '2a339d027e92c0d53501986fcfd71a0f', + 'lan_image.php' => '573f928e8753db0df958df0cbdedc07c', + 'lan_lancheck.php' => '7615ba9c34ea6b3b5867d27e834acb54', + 'lan_language.php' => 'fdc99671777e203514aae7f52939d561', + 'lan_links.php' => '07972ca8826ee35f36ef825ff793a991', + 'lan_mailout.php' => 'bf59b50787dae47c9db0603ba86e169d', + 'lan_menus.php' => 'aff6368b11b30bea0515de7cbad89dde', + 'lan_message.php' => 'bcfd03068e0ee9d76eb1a3df969bb544', + 'lan_meta.php' => '31801b3e9c137a3b22d58e5d80d291c8', + 'lan_modcomment.php' => '7f8738c7c0b3ab882f4b9c330136b6b3', + 'lan_newspost.php' => '0868c7b3d37352144cf2d424d97e8670', + 'lan_notify.php' => '65a1a5a108c74ba8b2db5592c06a1ecd', + 'lan_plugin.php' => '29ced1cfb16745f64bbbce037b8d74ba', + 'lan_prefs.php' => '08bc01aee9d766842262e2a158c31010', + 'lan_search.php' => '039a04acb5ab8b3ef5b617e1c1fcf7bc', + 'lan_theme.php' => '20dab981133d2106e89afe3f14169166', + 'lan_ugflag.php' => '29f0ad8c752be1bf98cc067534994711', + 'lan_updateadmin.php' => 'ae3d2be7d92db3c4dd11f1e73fafeb7b', + 'lan_upload.php' => '5a01a0c1676c4b21551ce427866edfe7', + 'lan_userclass.php' => '3eedcbd961e57434d6c64f9321fddb59', + 'lan_userclass2.php' => 'e475c31e99b4867d9517705b584f5a44', + 'lan_userinfo.php' => '241d3c717696a30d97152aec8f5fcdf2', + 'lan_users.php' => 'cc6c5b0856d4fb77f6c9cd1f31005e8c', + 'lan_users_extended.php' => '9ae08fd0f346cf0319dc935c992f1036', + 'lan_wmessage.php' => '27b96105500cdfa56bc27e391a0c2f3b', + ), + 'English.php' => '92d7499a17a92e1c3259e5ed3dc61444', + 'lan_banner.php' => '92308af6029553992ebc4a46e97d4e1d', + 'lan_comment.php' => '19332dfe1a3261c78e7e67dfdf984017', + 'lan_contact.php' => 'f6ec02eb9a5effc567f8483071105e66', + 'lan_date.php' => 'af33dd14b696babe19fd09e386c200c5', + 'lan_download.php' => 'a66ac115b0016fda2c45091353e59890', + 'lan_email.php' => '797f6f5e516475e8202fc171997ebdf1', + 'lan_equery_secure.php' => '90ce9b58fa3ee0bc424dc9eab0a9b92e', + 'lan_error.php' => 'e63c154a52b72318443b0044d48ef9dd', + 'lan_fpw.php' => '85470fb3dad6d9f765fe366f49e045eb', + 'lan_installer.php' => '81560fd3264c885295b060968a6d0570', + 'lan_links.php' => 'c309a9bc93d06a914bdc735efc9190cb', + 'lan_login.php' => '3bf7ecb7c00be86b54c83370fab6f8c6', + 'lan_mail_handler.php' => '001b336311279c058df01c2ae04aa87d', + 'lan_membersonly.php' => '102bba47b482668bb433a5a607767bae', + 'lan_news.php' => 'c3d990cb42ba5d40c6eaf915f6122448', + 'lan_newspost.php' => '03cca3bd4c3553accde4fe1b2bb9856a', + 'lan_notify.php' => 'f930fc0c3afd1516e3b63f63f6f51e16', + 'lan_np.php' => '3d6c87e7ffeaa79de1ba06da0175f367', + 'lan_online.php' => 'cf15db263203fc5cca674ac1e03923bd', + 'lan_page.php' => '3c9c8e02259f7833670d198d02ab0a94', + 'lan_parser_functions.php' => '54fe2858faa02517a93c293ce176571e', + 'lan_prefs.php' => '0520bc45182553a3f44b88c51b5377f7', + 'lan_print.php' => '8a3e985622e8dfcc82487b0165c2bf3a', + 'lan_rate.php' => '02191b8a77011476d4e3e554387c01d5', + 'lan_ren_help.php' => '1ca40febf5f376f3dd7190f46cd26f02', + 'lan_search.php' => '01bed4f43957214885351de0d18e0e5c', + 'lan_signup.php' => 'bba7802c9f6fa2a5d6c3a179e7b88fec', + 'lan_sitedown.php' => '65c55fc812ceff72c4aba3f56dbaf4cc', + 'lan_sitelinks.php' => 'ca292ed1c514df28d693b3e8cdc6baec', + 'lan_submitnews.php' => 'ca6c4a8e2828f6317e56a8e4bff34d2a', + 'lan_top.php' => 'eaf2c17d7c6e40e4e660e9a6dea851a1', + 'lan_upload.php' => '52254da910f370cf89a14c080516e7fb', + 'lan_upload_handler.php' => 'f61e83d33b48733bbf58c4189103b0bc', + 'lan_user.php' => '992526de41f3848bcbcfb1134449522d', + 'lan_user_extended.php' => '890b9ce3e1cebdc59d098a3465f7d151', + 'lan_user_select.php' => '5632220cb249c60e812c3592f086039c', + 'lan_userclass.php' => 'be226be048b076da4873e6d23b9b6b77', + 'lan_userposts.php' => '976fa5108d96acf116bbd177d9b0f38a', + 'lan_usersettings.php' => '76e37338a24462d18e3d405d70351913', + ), + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + $coredir['plugins'] => + array ( + 'admin_menu' => + array ( + 'admin_menu.php' => '12f13f429b068399d2aad7270c07a5c9', + ), + 'alt_auth' => + array ( + 'images' => + array ( + 'icon_ldap.png' => 'a04116417bb033cbb747627677ba44e3', + ), + 'languages' => + array ( + 'English' => + array ( + 'lan_alt_auth_conf.php' => '012604e8400b5dfce4a4d95086152ac2', + 'lan_ldap_auth.php' => '1fec91ecfe7419204ef65af051a249bd', + 'lan_otherdb_auth.php' => '11309b4fe52763d7d28f94df64001016', + ), + ), + 'alt_auth_adminmenu.php' => '3dddfee80a662a804a06d833ad9d2670', + 'alt_auth_conf.php' => '1aedac47a6220c61425f89a96fc766b0', + 'alt_auth_login_class.php' => '0d10f8eab79b15e28effa341aa6b6cea', + 'alt_auth_readme.txt' => '75b056df0169fa9a03bb31633d7fcbdb', + 'alt_login_class.php' => '343de18d3ab651476e092c72d484ae41', + 'ldap_auth.php' => '4d740c0d4ba51a7a8437df5fd6de3b85', + 'ldap_conf.php' => '32f0718c8d2a6aa7f8d7b378ac0f371a', + 'otherdb_auth.php' => '868524702a10c3046d7822b463f82477', + 'otherdb_conf.php' => '7871556c81544d7373f2adb7e49414f5', + 'plugin.php' => '918fb0e07512efb82b6cecb01c566ba3', + ), + 'alt_news' => + array ( + 'alt_news.php' => '67c4b14229bbb94f1ded6214e89216f1', + ), + 'banner_menu' => + array ( + 'languages' => + array ( + 'English.php' => '34df03d8f502238bd6f3c8102f1fc399', + ), + 'banner_menu.php' => 'ba985aea9cf61edb441b9f2e73ad45cf', + 'config.php' => '91398fb8db5e565e0659790796de8860', + ), + 'blogcalendar_menu' => + array ( + 'languages' => + array ( + 'English.php' => 'bc4d844c9b0b8bb553913eb462542620', + ), + 'archive.php' => '8fbd24eafa2349e682fffcbcdfbddbc1', + 'blogcalendar_menu.php' => '512b4589bee3e51d54dffa57dd2347a0', + 'calendar.php' => '4c05e65f098d38d7ed84783a479d999e', + 'config.php' => '8bf4ecf1ebf7b0a2628081ebdee358bb', + 'functions.php' => 'f2cf77b89db87b5ac5d2a3935fd4ac59', + 'styles.php' => '44147a6b0a19c0228b6639ece5d79733', + ), + 'calendar_menu' => + array ( + 'images' => + array ( + 'b1.png' => 'de9174823c3ec762027752d1c8ca2787', + 'b10.png' => 'e92aab589b5a33207640e533b6e5a68c', + 'b11.png' => '45a15a73b00f46799b4a456ceb1d7cb7', + 'b12.png' => '16ceea91edba926971991f86ff99204d', + 'b13.png' => 'a737e352f69c566e88326015627f77f6', + 'b14.png' => '5c74299db8f6e92e004b4aacfac7b910', + 'b15.png' => '492bed712e09f7d95ea0d8593d4b373a', + 'b16.png' => '5010d685380c5ecaf6d2941ac66e3648', + 'b2.png' => '88d88374398613838909f9bea531c0d7', + 'b3.png' => '68c92cd6c067ad930a05ab0262ee4a89', + 'b4.png' => 'eabb1d49b67487e9b6502d3f22ee54eb', + 'b5.png' => 'e297c23ad9a7d7a3f3fe34b5f08d2eeb', + 'b6.png' => '894d38230672afa9765fff0afed8c2f9', + 'b7.png' => '6aaafba2e9218606e573766a1b79e065', + 'b8.png' => '2e7439fea8b0d6de515710fd0e894fb8', + 'b9.png' => '56b3452cfe1d6a898ff17bd446cce73e', + 'cal1.png' => 'c9a93d59ed67e69075f686563ddde806', + 'cal2.png' => '80178ae70f6089d2933cf2323f7fed2e', + 'cal3.png' => '3370f9cf32cc5683e07c2bc919d151e4', + 'calendar_16.png' => 'ace8396ac74a5909b38a62835e76d9f9', + 'calendar_32.png' => 'ee297b07e04c5d54afcfd124987c7d9f', + 'icon_ec.png' => 'de31be991ae1102420a3bc76e3317045', + 'star1.png' => '22cebabc9731207092fe2242c8922ef5', + 'star2.png' => 'b50d4638fe170e7766ad473aa4039701', + 'star3.png' => '8c04fb886a6d4f6d4ab505660186d160', + 'star4.png' => '3645c9f38bab928554feff707d6a130a', + 'star5.png' => 'c6289a1dd7d998ee799228b34af10e70', + 'star6.png' => 'a65f3fa346ad5888f15d2d2d5c5977d8', + 'star7.png' => 'be1cedf7be3f740c5a3cd92b3220badf', + 'star8.png' => '575da0a997de16c305cdfd9e0433b09e', + ), + 'languages' => + array ( + 'English.php' => '158355ab3a26f8c709126af50bbd4000', + 'English_search.php' => 'fc1f68851e4c41b94e1bf1fcf9c25e10', + ), + 'log' => + array ( + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 'search' => + array ( + 'search_parser.php' => '05b18b0087a2816766543bce7da0b5b1', + ), + 'admin_config.php' => '1c338819605771130c4becf79f05cf06', + 'calendar.php' => 'cd96dede903591eb4e609ae9b1aea129', + 'calendar_menu.php' => '1cef409ba6b91f87b2c7361b9f3f5d7e', + 'calendar_shortcodes.php' => '902d42e033e1d4ea3d1424be96f249d7', + 'calendar_sql.php' => '39899457df794d8b56c58d3b1c8db88e', + 'calendar_template.php' => 'd852ceef7f6c8c10c5b10db571e16ccb', + 'e_list.php' => 'bc86836aabe7f01b4285d512a3079e9e', + 'e_notify.php' => '4c206cee17bed1c6b02f66fe202252f5', + 'e_rss.php' => '077b415bf70aaae7b8de3d55a5912632', + 'e_search.php' => 'a1681c6fed9972dd140b72b3ebfbd3c8', + 'ecal_class.php' => '8aca3973a9722d4e29aabcf54b488c99', + 'event.php' => '5edb018949600600fe3769e6507f4704', + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'next_event_menu.php' => '6d1819f703dc045efa0fd1a4041e6545', + 'plugin.php' => '7e5ed3e5d637ff6239c0e7ed8ec84e35', + 'readme.pdf' => 'bde9420355a7306b71df8c5143575347', + 'subs_menu.php' => '816619639ab421ff3229f6536bb33416', + 'subscribe.php' => 'a7e9baffa5250f183edcc3449a0b0bfa', + ), + 'chatbox_menu' => + array ( + 'images' => + array ( + 'blocked.png' => 'd2b20874ccf7079dbb71b6c94e117d21', + 'chatbox_16.png' => '6524280b8f44bde11dd5ca5581432c14', + 'chatbox_32.png' => '2e6ae5a5be12ec8d09b5083e959347b9', + ), + 'languages' => + array ( + 'English' => + array ( + 'English.php' => 'f7161fde06c16b7a4c08311f6d6c1f98', + 'English_config.php' => '9adc5ef167b75da9ea343a3f0b1e07a7', + 'lan_chatbox_search.php' => 'cfe3e4e7191917199b79c85ae8b9f018', + ), + ), + 'search' => + array ( + 'search_advanced.php' => 'b7a8eab8e5969256ab578277c92d3c47', + 'search_parser.php' => 'c576ea7d07ce91c106c3bae38912237c', + ), + 'admin_chatbox.php' => '75780140254afd39349fe286a5c72669', + 'chat.php' => '860bf5dbfc5f861df1f74f0c944e6957', + 'chat_template.php' => 'cf97b7663cd4177f9c7ac299318ef8e5', + 'chatbox_menu.php' => '350f84c6d36f7ba4b8ac6e7edf3d3280', + 'chatbox_sql.php' => 'aeb0d501ff23212e304f7f9a83d6926d', + 'e_list.php' => '11fde3fe8b58bec52bc6220053498509', + 'e_notify.php' => '379fbef832829bc4e9188b9fed62f31f', + 'e_rss.php' => 'e48224955d484055c9c662f430d529ae', + 'e_search.php' => '172e48694433f84b0f8d43ffb880e881', + 'e_status.php' => 'd5fbab54f8fcb5ec5eaa42c1b328cf6a', + 'plugin.php' => 'e5cdb4f2a42dc00b08d06b33dea455ed', + ), + 'clock_menu' => + array ( + 'languages' => + array ( + 'admin' => + array ( + 'English.php' => 'bb111f81956918d1a7e7875a032e521f', + ), + 'English.php' => 'a6414a6871116b964cc12d77d72b2748', + ), + 'clock.js' => '576433d4e5242c567e6c6d0d97b7ca73', + 'clock_menu.php' => 'e0d33629ca46324479cf344eb2bdbdd8', + 'config.php' => 'b5c6e83c7f9141ade22165ed62ed1884', + ), + 'comment_menu' => + array ( + 'languages' => + array ( + 'English.php' => '10c5f9fd588de9eaa9bf96b42b11b535', + ), + 'comment_menu.php' => 'd3991926641aecf015f1acd6a3baeda6', + 'comment_menu_shortcodes.php' => '4c212b7efffa496ec8b5280528d46259', + 'comment_menu_template.php' => '17f0cb0b44f43d0cf62770f2b7cb4526', + 'config.php' => 'd8e5bd9258392c98d02009d552401aa4', + ), + 'compliance_menu' => + array ( + 'images' => + array ( + 'valid-xhtml11.png' => 'dc71b96214e7b1d1df0db38575f42313', + 'vcss.png' => 'adcc065d9d9ce649cba7c03f58f3eed8', + ), + 'languages' => + array ( + 'English.php' => 'fa122fc7d21d653f3bea9f1a790cb173', + ), + 'compliance_menu.php' => '4d0b73ff1df3ee7003286d61ad443478', + ), + 'content' => + array ( + 'handlers' => + array ( + 'content_class.php' => '596da39e8137e9a92c93425abc2623c4', + 'content_convert_class.php' => '2e05d94418f8960eaac431741ce402a1', + 'content_db_class.php' => '1029aa4c0652a3d846592b4494c8e7a4', + 'content_defines.php' => '784711a6c68dc17c7752fb084400229c', + 'content_form_class.php' => '64e3e202792d28b837e2a86fc953fde6', + 'content_preset.php' => 'd3bccd4ed8b20426222fadbeb6063cba', + ), + 'images' => + array ( + 'cat' => + array ( + 16 => + array ( + 'help.png' => '2e809fd98f717d0cf39cf1106783984f', + 'ledblue.png' => 'ef03ae552afbfb83a6fa7904e32858ec', + 'ledgreen.png' => '9fbd1469e20d4d18c42a67b8ba161b1f', + 'ledlightblue.png' => 'fb788d9f8fcf0db66b7af5d88d0e9dd1', + 'ledlightgreen.png' => '2469623cdc8957e372a3bcc0c495a438', + 'ledorange.png' => '35a155381c22a4b41deccab43d72e3e3', + 'ledpurple.png' => '870e78863fec7bcdf54f298df354708e', + 'ledred.png' => 'a78b6edef88f45df366721425604da25', + 'ledyellow.png' => '88b84ff109f92be3ab7771483902be26', + 'messagebox_info.png' => 'b2fe3cfcbe243aebcb7c933a6937596d', + ), + 48 => + array ( + 'help.png' => 'b5ca621ba2f7f8456b347bc52f42c37e', + 'ledblue.png' => 'fd023701c69e6d1eaa4ed552f213190c', + 'ledgreen.png' => 'ec1034e5bc3164b221346b3c74b0059e', + 'ledlightblue.png' => '4d1c8ed166533c3acbec721421be3400', + 'ledlightgreen.png' => 'b634d062505badfbef4c2975ca343461', + 'ledorange.png' => '6d8f2e413a621feca1f30ff286023b91', + 'ledpurple.png' => '411a1f3315c4875a391d2b405e7a987f', + 'ledred.png' => 'da8b898d4d4294b4a11a038aee027a7f', + 'ledyellow.png' => '6d0bfa866c30e0afaa599807cbd802a3', + 'messagebox_info.png' => '4b8fdb10f2fd9d65d7f09bfe16c432a8', + ), + ), + 'file' => + array ( + 'tmp' => + array ( + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 'icon' => + array ( + 'tmp' => + array ( + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 'blank.gif' => 'e3b9998dfa86c3849180ac8349da3f76', + ), + 'image' => + array ( + 'tmp' => + array ( + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 'content_16.png' => '2d99036d870389c45c140370ec296050', + 'content_32.png' => 'dbcdcd9f704906b9f3e1b48394abd545', + 'error_16.png' => 'e7eff95804de0967e46c89361bd97604', + 'file_16.png' => '73d6e8b60327c61034be10adb2325771', + 'manager_16.png' => '358cedfcdc6ef1f44657050dd5892fac', + 'manager_48.png' => '3fd9a284f7d0d446ab430ccd4ef550dd', + 'ok_16.png' => '2a65610ea93831bfb0ad07e77fd2e488', + 'personal.png' => 'd1e39d963741e12edb0ed6261d72ace4', + 'score.png' => 'c368fe32f78a4ce09298b0c94f5fa89e', + 'score_empty.png' => '9cd759fdab39278d2fa4242c15d88871', + 'score_end.png' => 'e075b96122cb84dd7bb9d0ce8c789e84', + 'submit_16.png' => '90ec380e9ae114719e11f1332a89eefb', + 'submit_32.png' => 'df3dd61d416b00c26d3cbcdf02e862b4', + 'view_remove.png' => '084a9efcb11ca37426fbdae4fbeb0875', + 'warning_16.png' => '10b4bdba8f5f7d7598822219123e7792', + 'window_new.png' => '2bbce24fe15c0144cd225856ee0a990f', + ), + 'languages' => + array ( + 'English' => + array ( + 'lan_content.php' => '45d9ccc1d7a7d16b0332d5a0049bb836', + 'lan_content_admin.php' => '856dfef2e8887b83040ccbb5b33f088a', + 'lan_content_frontpage.php' => '1593838cd7ec925d50576a815bd3c9ee', + 'lan_content_help.php' => 'd7cea6d1b8db2650fce4962ddfcd295d', + 'lan_content_search.php' => '2b479bcefdb3b45f19c93ea5ae6bd221', + ), + ), + 'menus' => + array ( + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 'search' => + array ( + 'search_advanced.php' => 'c6c6ae35cd1020d27a861ac693347560', + 'search_comments.php' => '34b14edbe1d2e8fbac541dc03262b21d', + 'search_parser.php' => '279e6a587720b6686f7f71d847f54f35', + ), + 'templates' => + array ( + 'default' => + array ( + 'content_archive_template.php' => '62bb9c57b8d97b412d589cac9bf201e1', + 'content_author_template.php' => '2f6f195b33d930334ae20cc60b8ebbcd', + 'content_cat_template.php' => '5470141c7a45562e154813450ce2c5c6', + 'content_content_template.php' => 'bc29f18104b597287e028b812651461c', + 'content_content_template_bigtext.php' => '66fa5e0429ce2b3c1e1a74a1a01fdc25', + 'content_content_template_blackonwhite.php' => 'd0d7f73a3c1e269f10980879156dcdd2', + 'content_content_template_whiteonblack.php' => '7200173ea254fde9a8e9dc33f030c791', + 'content_np_template.php' => '2ad6c3c80a4fd2e14de8d2c8ba75fb9f', + 'content_recent_template.php' => 'ed27692b0ab66df27fead9bc5015dde7', + 'content_score_template.php' => '4272ddd2bfeb3698a88876411eab716c', + 'content_search_template.php' => '30e7bf5ba4a25ab6f1eca9b522e75597', + 'content_searchresult_template.php' => 'ea466f98d73a18d1e727fb3b4708a678', + 'content_top_template.php' => '662e5228f88cb2486ca305da0828e617', + ), + 'content_manager_template.php' => '6ab7ef97e7f4312f64766097aa9f0fc1', + 'content_submit_type_template.php' => '7b02354f168c4584ddd25ae8cca95977', + 'content_type_template.php' => '09a3aaa479ecd0a50055998fc18b7110', + ), + 'admin_content_config.php' => 'eadd444a88a1942065596ec5d710abde', + 'content.js' => 'd41d8cd98f00b204e9800998ecf8427e', + 'content.php' => 'f714bcd07b21c334ecbc143c6361d17e', + 'content_manager.php' => '2ca76d9420ea8c40d91fa410f099e19b', + 'content_shortcodes.php' => '6eec7325d2ccaabafa89f0f76ac91a78', + 'content_sql.php' => '2632a603dd04ed62bbb3f011d3c5de41', + 'content_submit.php' => '00b3c60d1ef87219af86ab253dc732d4', + 'content_update.php' => '3820d50a8de13fe523bc58e949229e67', + 'content_update_check.php' => '83b6aa48eb79b70555f5d2d578baa07d', + 'e_comment.php' => 'e5a8abcc72deaf2fe9c0a8b5eb4887ea', + 'e_emailprint.php' => '48572a480656347a64798b024168a7f1', + 'e_frontpage.php' => '4fee2ac77b9c66c1d5b760b95e6ea255', + 'e_latest.php' => 'a2ddba2f8b0e67309960926086a0c985', + 'e_list.php' => '07f0e1369439b9927ac11d48b6deeb06', + 'e_meta.php' => 'cbb645eebdedb216511c413fe64991a8', + 'e_notify.php' => '71dceb8ed800b8aa97dbc7a79628a8a5', + 'e_rss.php' => '76954b881d598f26ecaebb4422f87696', + 'e_search.php' => 'd86c2f562c466bd7200974bd16f07c45', + 'e_status.php' => 'e327fef8f0ea1ad19fe9579b4f2ebe91', + 'help.php' => '950985bb6c445147d901bb4fb00b0f1d', + 'plugin.php' => 'cfb9004ff38e24cb87370ceb9017867f', + ), + 'counter_menu' => + array ( + 'languages' => + array ( + 'English.php' => '33ae994d0cd2b96deadf8d398d5d25d0', + ), + 'counter_menu.php' => '6d5e959504ca9a579f776610c8b258c5', + ), + 'featurebox' => + array ( + 'images' => + array ( + 'featurebox_16.png' => '74eae49d9d53afb825bc21ac95be07b3', + 'featurebox_32.png' => '9a498cd16e91c5cec29dfac61dc07199', + ), + 'languages' => + array ( + 'English.php' => '9fa4e9a659ccde7db2cc65e81ad6694d', + ), + 'templates' => + array ( + 'centered.php' => '39693534a9eb1b5e00d263fb22b4ded3', + 'default.php' => '4ae642d4bfc6b53350d75197182330f7', + ), + 'admin_config.php' => '61506bca5d21856190eb627f4b603975', + 'e_rss.php' => 'e3b277cca6f5262dcee948434aacfc5e', + 'featurebox.php' => '196e5d4286ac7b19cfa34e66ec382979', + 'plugin.php' => '39f2a1375fe640e6cda8347ff7ab8de3', + ), + 'forum' => + array ( + 'images' => + array ( + 'dark' => + array ( + 'English_admin.png' => '5fed0ae458f2100bfed0ffc655d1c1ce', + 'English_main_admin.png' => '1b3ec206bc4a6daabc970c231e148f16', + 'English_moderator.png' => '99b9bbef0e3440071ff394422819ea69', + 'English_newthread.png' => '64283f117398e1709a6aca23eba96c5c', + 'English_reply.png' => '6a07036cf75d4acf1e4126371998baf8', + 'admin.png' => '5fed0ae458f2100bfed0ffc655d1c1ce', + 'admin_block.png' => '53b924444c2bb9e082d47429244a375a', + 'admin_delete.png' => '21c3e43917c10a029527d768ba059951', + 'admin_edit.png' => 'ffe67f5626fbc4fe90d4d7e70e3df9ca', + 'admin_lock.png' => 'fe74ea0725e050cc1522f8c80d509dbd', + 'admin_move.png' => '7d3010809006f8bd0b52b89d507ee781', + 'admin_stick.png' => '7dea7baacf217c6f307a9a0a08fa27f4', + 'admin_unlock.png' => '535939916663b4d3e59fd744ded21481', + 'admin_unstick.png' => '87f050e6fe15dab0445cfefc47be2ddb', + 'aim.png' => 'ef7a16b7871c7b353a06186d3e0dce6b', + 'announce.png' => '86b85187f8e268e08f09b17ef17f1c8e', + 'announce_small.png' => '4306e6cbc173ecc3864b284e4731ca4f', + 'bar.jpg' => '5afc27f5a70a68e53b1a51d74a40fbcc', + 'closed.png' => 'baeb3dcbb714f52d5f8007548ba487e9', + 'closed_small.png' => '6c541b1147791a28e78674a483f681d8', + 'delete.png' => '895db8d980f9378df51649443a5bdfc6', + 'e.png' => '5bb5064aaa81d5554ed6f653bf51cef7', + 'edit.png' => '0788c55ce19665d809c4a87a9d32d141', + 'email.png' => 'b17fa6548c6a8ef38ac9fc1691f73eff', + 'icq.png' => '6bc6f030b47ff1ee2de0913e71552681', + 'main_admin.png' => '1b3ec206bc4a6daabc970c231e148f16', + 'moderator.png' => '99b9bbef0e3440071ff394422819ea69', + 'msn.png' => 'cbf3f20c6baa59d7aae61bbc12bd9414', + 'new.png' => '14ec3ad326cf9efc5db59d08f6168ece', + 'new_popular.png' => 'e08fb87d0916010b1ea87e22193c26d8', + 'new_popular_small.png' => '0bb045dd66fa71755f87914d3daa3aa8', + 'new_small.png' => '893f53029a2c01d0ba9d5bad65c2c7dd', + 'newthread.png' => '64283f117398e1709a6aca23eba96c5c', + 'nonew.png' => '4e4745634cd57876764e3de04f2a6f98', + 'nonew_popular.png' => '4c14f635ff684394ba7f13a46ee2ed04', + 'nonew_popular_small.png' => 'b52411630e19de222230c516ec3b9ad6', + 'nonew_small.png' => '7d2084d22597ca40aa944367626eb0b0', + 'pm.png' => '11bcda04351efb950b1352b9a82a674d', + 'post.png' => '22de7b984a3044b53c19a4ccd3cb49db', + 'post2.png' => '0072597171f5e4380bc3715ddccb7e86', + 'profile.png' => 'f196e49eb8682872379a0ceea4b8ce24', + 'quote.png' => '44e56d509440c027fadff8fa3c71bb09', + 'reply.png' => '6a07036cf75d4acf1e4126371998baf8', + 'report.png' => 'e36a0b879ea8ac19169302705cd806b3', + 'sticky.png' => 'ba50de659d59a2997ee77ae177a605f9', + 'sticky_closed.png' => 'ea5b16c543e3056e866ca5579ecd163c', + 'sticky_closed_small.png' => '8413fe336a2ec79bdcb0b3bfbcd50896', + 'sticky_small.png' => 'ebf41f357e88f4e6f29e6d7d8b3464e8', + 'website.png' => 'ecd92710246e39b964a1857e8370db56', + ), + 'lite' => + array ( + 'English_admin.png' => '5fed0ae458f2100bfed0ffc655d1c1ce', + 'English_main_admin.png' => '1b3ec206bc4a6daabc970c231e148f16', + 'English_moderator.png' => '99b9bbef0e3440071ff394422819ea69', + 'English_newthread.png' => 'eb68d1b9677fca9c32c556e050e4f20c', + 'English_reply.png' => '58e4791eb2d8b5712b859639a0eb5320', + 'admin.png' => '5fed0ae458f2100bfed0ffc655d1c1ce', + 'admin_block.png' => 'e861b2014ffa66b391e3e4152278ec78', + 'admin_delete.png' => 'a8aca6d9512cdf1f18f98a324fc63fb1', + 'admin_edit.png' => 'c8d6b7bcc759884b6ed0a6bc4b53ad57', + 'admin_lock.png' => 'e709f1ded3bdea3174f30ef49f83aee3', + 'admin_move.png' => '704a6023c7f2900a6371a63f0dd56462', + 'admin_stick.png' => '7dea7baacf217c6f307a9a0a08fa27f4', + 'admin_unlock.png' => '19849fb8ace12d49b649724cdb1948de', + 'admin_unstick.png' => '4a6856f5ef4b32d56bd232c495baa817', + 'aim.png' => 'ef7a16b7871c7b353a06186d3e0dce6b', + 'announce.png' => '9874a0390f8b93d75af92a10a6311201', + 'announce_small.png' => '1b9b7a6b72ff112bc82b20537220e827', + 'bar.jpg' => '5afc27f5a70a68e53b1a51d74a40fbcc', + 'closed.png' => 'baaf6f3e3dcca0f678f1a3c79a51a3b1', + 'closed_small.png' => '7207302f70051cff9c0167f20a89646d', + 'delete.png' => '895db8d980f9378df51649443a5bdfc6', + 'e.png' => 'b5e5c9ab677b46ae99ac512039d012d8', + 'edit.png' => 'dc9067455b48da0bbc50993a4217eedd', + 'email.png' => 'c51f9e3ef6f5b02087decb2ec7686278', + 'icq.png' => '6bc6f030b47ff1ee2de0913e71552681', + 'main_admin.png' => '1b3ec206bc4a6daabc970c231e148f16', + 'moderator.png' => '99b9bbef0e3440071ff394422819ea69', + 'msn.png' => 'cbf3f20c6baa59d7aae61bbc12bd9414', + 'new.png' => '8cf7c2a190bbbce7f18ce99818dbd481', + 'new_popular.png' => '37d60559b22ff18cbf7bdec33f4a72c1', + 'new_popular_small.png' => '7becbe1b6207fef993f1601463f57345', + 'new_small.png' => 'cff284b11533ac4bf740a146d019a942', + 'newthread.png' => 'eb68d1b9677fca9c32c556e050e4f20c', + 'nonew.png' => '2808e78e081d8c8d2d7802b9a290ce12', + 'nonew_popular.png' => '8df0ba08e69b552e7e24e9a2751e5d40', + 'nonew_popular_small.png' => '33355429da0af82e1f1c91bab2ba7f91', + 'nonew_small.png' => 'edc0414101f2e406d7c0a070f324220b', + 'pm.png' => '11bcda04351efb950b1352b9a82a674d', + 'post.png' => '22de7b984a3044b53c19a4ccd3cb49db', + 'post2.png' => '0f6cfe51518affb7a6baac798abd907b', + 'profile.png' => '32300a5d0546cf11e2cee898ec2e23c2', + 'quote.png' => '579d14bfb1faabf191272938fae3ab65', + 'reply.png' => '58e4791eb2d8b5712b859639a0eb5320', + 'report.png' => '3194bb43c91125fce2709500bbe33a9a', + 'sticky.png' => '45f3c7bfd16c3806a79c3a9540a9e847', + 'sticky_closed.png' => '9fa98262861f0a900236f795dc72096e', + 'sticky_closed_small.png' => '5c7f041ff02f267c87e4c46d608e7014', + 'sticky_small.png' => '4e820e6a2bba0f75e38c2d2bdcfe2111', + 'website.png' => '568b5e9dcc6fcc5067209e9390297162', + ), + 'fcap.png' => 'db19cb1423e2898da7b2d3802c89404f', + 'fcap2.png' => '5f6f45697bc185d51f2c06d904642aad', + 'finfobar.png' => '71585c0c2d3340ece8cf769a135286b9', + 'forums_16.png' => '5773aa73ab08e4e575ceb2d60001f8f5', + 'forums_32.png' => '543708df3b2731ea4607ea5741a21f12', + 'sub_forums_16.png' => '16a40908a7b37e8353c978ce3ecd1910', + ), + 'languages' => + array ( + 'English' => + array ( + 'lan_forum.php' => '8496b78042381e1eb0e55919386b1261', + 'lan_forum_admin.php' => '796328f81eb77d6c218ad978e83911b9', + 'lan_forum_conf.php' => '44f0d7ca6da7d71004e1acd9c1f04f70', + 'lan_forum_frontpage.php' => '5ac941c384cf10a76b6ab040f7ee7986', + 'lan_forum_post.php' => 'd92f497d14b273b09d3f6e1c3dffea21', + 'lan_forum_search.php' => 'dd1263ff01cf0b71991de16756677f68', + 'lan_forum_stats.php' => 'ecccb2b57c568336e5b1accfa29ad08b', + 'lan_forum_uploads.php' => '840b741edd3f2d8fcc340b29804689b5', + 'lan_forum_viewforum.php' => '7b44a441080e2b1a40b8c37944d9a719', + 'lan_forum_viewtopic.php' => '867fb663d2d3cff381f01f08db23de98', + 'lan_newforumposts_menu.php' => 'affcfab7c6a7dfa7ba9fd1c134075919', + ), + ), + 'search' => + array ( + 'search_advanced.php' => '32a26ccc8c2be60abca8ba2930ba329e', + 'search_parser.php' => '3419fe985c2b08959c127b6484a487fe', + ), + 'templates' => + array ( + 'forum_icons_template.php' => 'ac7e8c8f02f32719f64cd5bde7ec5f20', + 'forum_post_template.php' => 'f1017fb9b9ae6c73691d27b4da2d8cd3', + 'forum_posted_template.php' => 'eea66e0ed7f2d2a51c5e01a07cb871aa', + 'forum_preview_template.php' => '11b636f1bcccded162fcf42880df5b5d', + 'forum_template.php' => '725a50b55d6e76a9844821992601aa67', + 'forum_viewforum_template.php' => '004aacb79877ac05b538d320c8294b85', + 'forum_viewtopic_template.php' => '57b91f8b3ad09f48010d4d4958623f26', + ), + 'e_emailprint.php' => '8a41fe10faf7c2293a65bd66e598dd82', + 'e_frontpage.php' => 'c939394e051b055ccbc963d17b1a1d46', + 'e_latest.php' => 'ba485c38b9ab90c0f572a2397b49c9f5', + 'e_linkgen.php' => 'e0cdc0183ce0cf9adbbec54271c55766', + 'e_list.php' => '523f01012192923c6901b7c088101ec0', + 'e_rss.php' => '2d0f0839621d9d4539895e2047a76476', + 'e_search.php' => '663a93cb1f0d05351ecbb85a3bf721d4', + 'e_status.php' => 'e707e64a960612d443e16906faaf0e22', + 'forum.php' => '35a1744e058ca88ee47e966088ac1923', + 'forum_admin.php' => '741d27d12226bc98e4576697f4b97efc', + 'forum_class.php' => 'cec775f3d1561a4262c76c438c02de69', + 'forum_conf.php' => 'a4a4e140bda4b3d7cd73abd03170dc5b', + 'forum_mod.php' => 'bc6667cba8050bd3a2c015dea9bcd730', + 'forum_post.php' => 'd651a56661feb695867f8b914e2ed5d0', + 'forum_post_shortcodes.php' => '1b976852110cac3652082c43777e3dc3', + 'forum_shortcodes.php' => '06545816dec1484394144caeffb71a39', + 'forum_sql.php' => '3355b8219c200d8d669ce08e59053465', + 'forum_stats.php' => '9906e300c4764aa55e54d745ff3bc471', + 'forum_test.php' => 'ed668e3268952cb268b3f4aca0d2e37a', + 'forum_update.php' => '8e1fed1bae66e84eb3ad0235a60f0c69', + 'forum_update_check.php' => '95b6355554098357b5648807c4e95705', + 'forum_uploads.php' => '3ae344a843771d9ee6e578a1ddd84f8c', + 'forum_viewforum.php' => '53b717a8e1515fde643c25b89ae92e25', + 'forum_viewtopic.php' => 'ab460e959ba4523374375e92abebb874', + 'index.php' => '1d225ecdb6dfb425fcdd39501ed196c7', + 'newforumposts_menu.php' => '294da398e0ec6c0114c8d41e203cd411', + 'newforumposts_menu_config.php' => '8c7c855777e097fe6b8d92f9ef4e527b', + 'plugin.php' => '871a97116e50c74039db5f2e3c96d040', + ), + 'gsitemap' => + array ( + 'images' => + array ( + 'icon.png' => '29534d4c0ba369a5ad90e6150c86a5da', + 'icon_16.png' => '6d67b9c447227bd3432ad2cc2b197f79', + ), + 'languages' => + array ( + 'gsitemap_English.php' => '350d69eb976b596ee599530d5e6bff1c', + ), + 'admin_config.php' => '4a582593a83c6353f6b2c49371623301', + 'gsitemap_sql.php' => '81a34608c8cdd19c51fece5a25109159', + 'plugin.php' => 'c88f725348400384ef5721432e9ad169', + ), + 'integrity_check' => + array ( + 'images' => + array ( + 'integ.gif' => '80475f4211b9a876938a439470cde13a', + 'integrity_16.png' => 'e6ff53bf268d48088c085fb3d3e1f010', + 'integrity_32.png' => '82a32c32fad17965fcb6ab955b8f15b9', + ), + 'languages' => + array ( + 'English.php' => 'd78c5a1f0cd1dafde8fe3bf33083db1e', + ), + 'admin_integrity_check.php' => '0336e89bd0664a6e4ad9ff2c1ba9c236', + 'plugin.php' => 'b32f26e2fc819c93a60a0c53692888fa', + ), + 'lastseen' => + array ( + 'languages' => + array ( + 'English.php' => '847602620978795e90813a8ca2c2b2ec', + ), + 'lastseen_menu.php' => '2f1a208abccccfe316824d1defe2c857', + ), + 'links_page' => + array ( + 'cat_images' => + array ( + 'linkspage_16.png' => 'e0f7bd92f88b61dd38d82f952b3b1e98', + ), + 'images' => + array ( + 'blank.gif' => '0e94b3486afb85d450b20ea1a6658cd7', + 'generic.png' => 'bb86189cad80d49fbfe203dbac657a65', + 'linkspage_16.png' => 'e0f7bd92f88b61dd38d82f952b3b1e98', + 'linkspage_32.png' => '720b47a8d0dfb2e4cb2646c6be8e34e2', + ), + 'languages' => + array ( + 'English.php' => '2ccba0ca70987d6c5bfece279e25957f', + ), + 'link_images' => + array ( + 'button.png' => '11a491739c3c8dba29d7e25e0b2ef50c', + ), + 'search' => + array ( + 'search_advanced.php' => '985406e38223116b67ffe4afa714f176', + 'search_comments.php' => '6d3c5c4d9d15e0c0adf77b859a4c054b', + 'search_parser.php' => 'ff43c05ffddd9ce508c98e913f90e167', + ), + 'admin_linkspage_config.php' => '5576e1a0eee8984ad5909d901e481b30', + 'e_comment.php' => '13b0aa38e21d08a535276a7526cedde2', + 'e_frontpage.php' => '0a352c2a0b559b9d930943f1928f9d45', + 'e_latest.php' => '6ab452dd2d2d46749d5149c5fd1905fc', + 'e_list.php' => '9a49a4d6a015fb3fff2cda7a4ef788c1', + 'e_notify.php' => 'eab13b015f9b5fa679fef28f63d72dde', + 'e_rss.php' => 'd213cc9cc0d5eeed3442b861e565961e', + 'e_search.php' => '7a7416dde4bc42481cf92431f4832b65', + 'e_status.php' => 'e1b28e610e6f89277440430a2f8747d8', + 'help.php' => 'a8495b50a8243ebbb3e37c8bcb169184', + 'link_class.php' => '54cdcb1762817c504b6d81ed7924ad96', + 'link_defines.php' => '1c9c8a4d29cac5f35e2164805bb3eca6', + 'link_menu.php' => '20fd34d3e851223a174d56533dbb83a6', + 'link_shortcodes.php' => '614948aa511415a9d151b16a0518c4ba', + 'links.php' => '10d1f4b2e4ac07ad1a17c60ad5cee6a0', + 'links_page_sql.php' => 'ebe16a35037a69b93eaa929782ca66ba', + 'links_template.php' => 'b578512e4b94cd623ee3cfcf5d0be178', + 'plugin.php' => 'b05df4d36293f4c2e2b949b3006cc712', + ), + 'linkwords' => + array ( + 'images' => + array ( + 'linkwords_16.png' => '938cd3261a4a86543de6949f66d2d53b', + 'linkwords_32.png' => '83211d6305d2d1a4f0ae8ec7fc3e9ad5', + ), + 'languages' => + array ( + 'English.php' => 'ad0d4babe14fbc9317ba40e34833bd58', + ), + 'admin_config.php' => '84e9d47d8301b15c0ea3e88c2d7b68dd', + 'linkwords.php' => '6dbac4b16a1acaef98748f838f2fbf2e', + 'linkwords_sql.php' => '33f4d40e8da9aa758c512d4847f6d5d7', + 'plugin.php' => 'cda5616cc5cdb77a82392fe4d34d3ab4', + ), + 'list_new' => + array ( + 'icon' => + array ( + 'list_16.png' => 'a66abd8893e6183633d538bb7e77ee72', + 'list_32.png' => 'f20fb66244bea4fd4f094a5d79afbbc1', + ), + 'images' => + array ( + 'icon1.gif' => '647fbd5e1ef767240f657eb6c9bf7eb0', + 'icon10.gif' => 'f476f9f3348d5eaf6c8655d23107aec8', + 'icon11.gif' => 'acfb3909d01491bbb4e6e70a5d253db7', + 'icon2.gif' => '0f8cde50c8cf5dcf15ba92db83d823b2', + 'icon3.gif' => '5c93b3bd203880e147a9cf424dbdfc00', + 'icon4.gif' => 'd9322f3a64817417a3c31fd5127d0df7', + 'icon5.gif' => 'dbd33636a4598cb6ae3745c3c12bb036', + 'icon6.gif' => '7fa95c9ecb71ddd56d90d5a6c57c072a', + 'icon7.gif' => '0a77dbb9a9297684d76896932c28a7b1', + 'icon8.gif' => '6447987ad6456afdbb7058326c2b5278', + 'icon9.gif' => '6681ae39445665dcf8781333888923de', + ), + 'languages' => + array ( + 'English.php' => '3f559f59bef22144d80b09ea599732ba', + ), + 'section' => + array ( + 'list_comment.php' => '5efa984e2682a3fd37cffc87d8e8f94c', + 'list_download.php' => 'd0c7e07e3fe2372c7a8eda1562793b67', + 'list_members.php' => 'e49b1b7cfad6246287a43e59f803cef3', + 'list_news.php' => '7faa1d6728ff1e692aa834ac4027c4e0', + ), + 'admin_list_config.php' => '6a0ec89c7fc52da5ba7cfe7ba647d530', + 'list.php' => '40e2923674835fe1c404219d164e7a92', + 'list_class.php' => 'd114b0dc8172a77aea197a0d42084fa8', + 'list_new_menu.php' => 'b130b1aeb94b0c494dc77f6c58c7a19c', + 'list_recent_menu.php' => '83c2f61863857d3ce02539a668e98083', + 'list_shortcodes.php' => '1c4972d09e83f1945c6652126bba6248', + 'list_template.php' => 'ca73750411b19f1b8df71c5111fe1789', + 'plugin.php' => 'c39cfd9c145036b3cfbfca56aef150dc', + ), + 'log' => + array ( + 'images' => + array ( + 'abrowse.png' => 'da9925bf3cee78bb965c668857bb7225', + 'amaya.png' => '974a9fb5ae38e4d592aec302594ba58f', + 'ant.png' => 'f667945ec89b7883922828deec0e2fd2', + 'aol.png' => '5681ae48b5ab3fca312ade1b42658ee2', + 'aol2.png' => '5681ae48b5ab3fca312ade1b42658ee2', + 'avantbrowser.png' => '8dfcaaa62c0f5c07f4982f41bba18f50', + 'avantgo.png' => '006c1eeda85c0dd975ca56ed75a86d56', + 'aweb.png' => '1f4fd6be7682b4461b43768160f80746', + 'bar.png' => '5e921e04974e7fd41cfc34167d31edba', + 'beonex.png' => '2d5062958c73ad028233553d88c684b8', + 'beos.png' => 'e81a347cde7806d403369acf5125c4fe', + 'blazer.png' => '681d0c56db0d9eeec59e3b804dc809a8', + 'camino.png' => 'bcf331c02452984bada0f73534e15578', + 'chimera.png' => '6a6ad07a8495264fc00798ee298f3c04', + 'columbus.png' => 'd24df5eebe796dddf95eb6630f1ce1d3', + 'crazybrowser.png' => '96283b3c49fe550c35b96c595167670a', + 'curl.png' => 'c17099e14ae52777d46079cb126349ea', + 'deepnet.png' => 'a102b4c9f46ed88473190f8390d5ecde', + 'dillo.png' => 'a95459dde056b7de5965f5c1b984847b', + 'doris.png' => '0cde70660e8558aee3fd73ee9084f3cc', + 'epiphany.png' => 'edafb77862629ee99b06478d34689a61', + 'explorer.png' => '12663e51f35919fb31645ec6248230e4', + 'firebird.png' => 'e8481a441fb3bcd623b6ca7143443659', + 'firefox.png' => '7622da97e8ea3a9821a90e1f73aaf851', + 'freebsd.png' => '836fab28d495b801df8639da8cc13da7', + 'galeon.png' => '072543cf994aa44a868d24867df80de6', + 'html.png' => 'caa46c5b4aa1bf948a96dcb4c3c6611b', + 'ibrowse.png' => '8a94505f697ef87b353c5c6a56f54995', + 'icab.png' => 'd2d3147c69fca0071ff631900194d8e5', + 'ice.png' => 'c0a72eb1937576484240f94826a76e67', + 'isilox.png' => '677a40b0372f3a0b18f62a4793e8d820', + 'k-meleon.png' => '9ecbc0649045f8dc5115dfea2530adab', + 'konqueror.png' => '46b06a0ffb9ecbe6606bca51d98a9211', + 'links.png' => 'c47c6dd145554280f3e29323cbe34341', + 'linux.png' => '336a3e40452886a7bfac345e8a261138', + 'logo.png' => '8802e7deba7c6f03110b1541d775feeb', + 'lotus.png' => 'b9c3348d5ce4d2c4a6065a2229af74c8', + 'lunascape.png' => 'cecc58426c0c62aa6b7e09cde7c7bbe0', + 'lynx.png' => '00fcf432cff7e70cc8ef9fc32182fca6', + 'mac.png' => '3b5ceead951265dc1648d172fbdd6461', + 'maxthon.png' => '30ee9e712f34cc7cd6f092313ac37fc5', + 'mbrowser.png' => '491be57a6bcd67ee5a09f8b212fec39c', + 'mosaic.png' => 'c276bc202f408caaeef5e763e4e2cb18', + 'mozilla.png' => '0cb5578c00652e82053f81f94736ce58', + 'mozilla2.png' => '0cb5578c00652e82053f81f94736ce58', + 'multibrowser.png' => '3e41f9cabd8ca350a61e4adb6aeb52c4', + 'nautilus.png' => 'daa1ff10ec0a1d85b77db4a4a05a91c6', + 'netbsd.png' => '0cc1da48e638ee3549a53c459a0beaf1', + 'netcaptor.png' => '139a1211baca0b00447e64c657bb5161', + 'netfront.png' => '3ea80a15dabb2e26888d6fb66a16500f', + 'netpositive.png' => 'f3bf2146aa97c9821ce096f5d38d9ee5', + 'netscape.png' => '4dda4c2e4c32cc5f1e7cdb5b56156f5c', + 'netscape2.png' => '4dda4c2e4c32cc5f1e7cdb5b56156f5c', + 'omniweb.png' => '6b1d71fb7d85a3a5739bf33fa7646031', + 'openbsd.png' => '36a1043bb8aacd3ea0a85c5f4de3130a', + 'opera.png' => '8892071cd4ecb31298ec08373d1491dc', + 'oregano.png' => '50798ac094e34694cd75a1ebe7813689', + 'phaseout.png' => '5b6c84b85f576c2145dd4944f8b6188a', + 'phoenix.png' => 'a9544236943de787c6a7e03d47a23424', + 'proxomitron.png' => 'ad3be5d996043b5ebe5ab619dd2545d3', + 'remove.png' => '313b424965c1b13451212a2e2817b658', + 'robot.png' => '467598649618f8a635235011cee3650f', + 'safari.png' => 'ee7ab5a70f4d927a753756b1d3ec2863', + 'screen.png' => '64bb3f0780b2fd8ac7ed1ccc07329c38', + 'shiira.png' => '98568764150bfe30b8b14d9cfdca374f', + 'sleipnir.png' => '93aba37fc79e5f2459821b3fdffb2f8b', + 'slimbrowser.png' => 'dd18ad6de3ed12aaca4a495a8663343d', + 'spiders.png' => '40fe2edf5a3654abbaf364559ffaa62c', + 'staroffice.png' => '9df8b5abfefb57238799b1a15b6e32d9', + 'stats_16.png' => '4483cdd34566efe12872d9622f10499e', + 'stats_32.png' => 'feb2eeda7244d0d78bc635daa7ac4c4f', + 'sunos.png' => '5cce74b569193c10dfa03b2c8b292268', + 'sunrise.png' => 'e0ef33096f7b1bef35972c9da07124fe', + 'unix.png' => '3adfb8b111bb64bb8c01a1b8e7d1fee0', + 'unknown.png' => '731a1804b991a36c584521a4508e62cc', + 'unspecified.png' => '731a1804b991a36c584521a4508e62cc', + 'voyager.png' => '0f977fc50e485153fe5908635de33d0b', + 'w3m.png' => 'd1644f785735c7b82df2361ec9917eea', + 'web%20indexing%20robot.png' => '467598649618f8a635235011cee3650f', + 'webtv.png' => '37217cc2adf3e72c93fce1de22681c1d', + 'windows.png' => '28190c1e6828a3bb5892e14c5d324a66', + 'xiino.png' => '1067d1b475466744b562d1be8c7a462a', + ), + 'languages' => + array ( + 'admin' => + array ( + 'English.php' => 'a60ef592a7abd135da04b6cc482c992b', + ), + 'English.php' => '583eaac1a83c65da8e8d697ea4dd8058', + ), + 'logs' => + array ( + 'null.txt' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 'admin_config.php' => '67f5b9dd7f192b2dc8ca820a348f9ba7', + 'consolidate.php' => '1a17455630a62ef78d2c14778845df31', + 'e_meta.php' => '70eae996ff1b54a3ddc1cea0a737320b', + 'log.php' => '5ae5383b4abb6273e4d2b45850559d52', + 'log_sql.php' => '6593acd37950a8e486b0fc1490cf1750', + 'log_update.php' => '619bea78d9c76a1ec0cd4c44eeda36c5', + 'log_update_check.php' => 'f4e7f5fb3767e4c19adae8cb5e41e62c', + 'loginfo.php' => '68c8cc11daadec40bfbae1f4b9ece53a', + 'plugin.php' => 'b078f64e2aab381fb9f99a109dd96262', + 'stats.php' => 'd4d9200b6df966437eb88aefc8a8e3c3', + ), + 'login_menu' => + array ( + 'languages' => + array ( + 'English.php' => '3be9768e81217f108c055cff9f15c8d5', + ), + 'config.php' => '5f0c8229c96c4d4cf5a806bfc8d1a1c4', + 'login_menu.php' => '5617c07086b77c79d5c1e6548928536f', + 'login_menu_shortcodes.php' => '4232d61c5e9f401c023de6888cbe4d99', + 'login_menu_template.php' => '88e210369bd4f7ba640e0008b274d782', + ), + 'newforumposts_main' => + array ( + 'images' => + array ( + 'logo.png' => '06cb23ecc9cd39141194e1016a771f80', + 'new_forum_16.png' => '6f37a1029e4ffa1a22a65a07269c4a16', + 'new_forum_32.png' => '8e92602725475253ed57ea7625b19bf2', + ), + 'languages' => + array ( + 'English.php' => 'cbabc36202b6ab51003f0b859fb14598', + ), + 'admin_config.php' => '965609648b5052dad40742d8c76b8bf9', + 'newforumposts.sc' => '92de176e2d3503f91b9389d053d34348', + 'newforumposts_main.php' => '53e0ce09459853547bd35154e74f25e8', + 'plugin.php' => '81caf517e35d6fdb13bf56fb6ab5395e', + ), + 'newsfeed' => + array ( + 'images' => + array ( + 'newsfeed_16.png' => '854bc5f8ddf61c6dfbe6c32e7bb7c0d1', + 'newsfeed_32.png' => '6ff097b991a0c24947a29c16433abfdd', + ), + 'languages' => + array ( + 'English.php' => 'a166d6243430b0933b783255023239f8', + 'English_frontpage.php' => '6bdb1ac20906e1242f6aacc5981325ff', + ), + 'templates' => + array ( + 'newsfeed_menu_template.php' => 'a26b82efdcad76104273e02e268bcbe2', + 'newsfeed_template.php' => '5a1b8f38599596ff798b4df30873720f', + ), + 'admin_config.php' => '67d91a9c29acd1f52b4f12d36b3099e1', + 'e_frontpage.php' => '2a8967b05bef4a2eb6b771ca44e6bf01', + 'help.php' => '7942458e34eb69cdad92cc7d9454f626', + 'newsfeed.php' => 'b822c0fa9ace6409cef05d73eeae3ff5', + 'newsfeed_functions.php' => 'a06e7301f737550e69d18c85dc1a3153', + 'newsfeed_menu.php' => '4ab274b2b3dde37f3807457aaeead9d9', + 'plugin.php' => '9518316c3bbd37326a4c1383ae1d550d', + ), + 'newsletter' => + array ( + 'images' => + array ( + 'nl_16.png' => '59f315b213118bf6051dc29acea8bb8e', + 'nl_32.png' => 'f39c84dea17075e27e1c15411fc2b282', + ), + 'languages' => + array ( + 'English.php' => '5fe08735f2bf070770827d051fcd69cd', + ), + 'admin_config.php' => 'c6e4733cffed8bac3cbc27115476404e', + 'newsletter_menu.php' => 'f8b8ab30443dea6a8dbb2e27c17799d6', + 'plugin.php' => '5c491459a08ab61854fb5a8f56230f66', + ), + 'online_extended_menu' => + array ( + 'images' => + array ( + 'user.png' => 'ae648cc200000ccbb96c9e6c9049c5e2', + ), + 'languages' => + array ( + 'English.php' => '80ef79863e369f62df51b9659551a432', + ), + 'online_extended_menu.php' => '16d72e57d0cae0206e0a079638f23d83', + ), + 'online_menu' => + array ( + 'languages' => + array ( + 'English.php' => 'e7753b75880a1b606b6f525d736893cb', + ), + 'online_menu.php' => 'ba0b67252034c72c5a002aef708082bc', + ), + 'other_news_menu' => + array ( + 'languages' => + array ( + 'English.php' => 'b04593965071e6f5bd46286fadcec456', + ), + 'other_news2_menu.php' => '23ffe78f7e74092c6505bec603c04ec0', + 'other_news_menu.php' => '43943c839fbd809ae19b75ca7b296451', + ), + 'pdf' => + array ( + 'font' => + array ( + 'makefont' => + array ( + 'cp1250.map' => 'e100a417c3569cc2b7b8c1e976db4f14', + 'cp1251.map' => '03af6a71a67c0a5a99e16af4bdf0889f', + 'cp1252.map' => '2c892997d01d2138d800f5318bd76ad0', + 'cp1253.map' => '169376db7929541ef8950dd888f53c9f', + 'cp1254.map' => '6016c6d3a68c1d25696e64879b6527fc', + 'cp1255.map' => '0359cc7d06098a20400118788c7e1468', + 'cp1257.map' => '91b18d3c622bffa43003f38a60d15138', + 'cp1258.map' => '2d92adf84aed86b29765234a77b312bb', + 'cp874.map' => '3a3d272502dc21d4d12f3922633ca47f', + 'iso-8859-1.map' => 'a0f13acbaa06faf3fe240e1c49b7616a', + 'iso-8859-11.map' => '96aee891ad9f8c33f83b19c9b5fdadb2', + 'iso-8859-15.map' => '3bd2a4bd4eb8130add17624e128e190c', + 'iso-8859-16.map' => 'd1b40c31c1047d85881db30baee1f96b', + 'iso-8859-2.map' => '098cf77f5a3c281af86dba50f5389f58', + 'iso-8859-4.map' => '16c5ed9d616ffc407a560b3a92453f57', + 'iso-8859-5.map' => 'b9d6ad1f178c189aadf370ac9fe308af', + 'iso-8859-7.map' => 'bc6f9bdef50e1f802e5b17bd70b36d0d', + 'iso-8859-9.map' => '4d8ddb1b69f39e44b88addd04269e684', + 'koi8-r.map' => 'ed1be11b650e23bcf0804524d0299e73', + 'koi8-u.map' => 'd445ee6c5ec5f2edd31fdc48724dd168', + 'makefont.php' => '412c5335ef10e2fed8038a8ac5798971', + ), + 'courier.php' => '16234bee90ef280e42cb167d1ba2c60e', + 'helvetica.php' => '3dbdc93d4d688b45bfc6f4e49c45116e', + 'helveticab.php' => '0e327a1ae8e5aaec1b28c5c366e14237', + 'helveticabi.php' => 'f3d59db2e9426ac9e7f110705b07b7d7', + 'helveticai.php' => '29a074a2a45c43a87630f46e22436b2c', + 'symbol.php' => 'fd6c383c3cf14278d64b5cb1e8286890', + 'times.php' => '1f954b34c3d40187b7a67b8dc4535c38', + 'timesb.php' => 'd6197cb638addc463e2bc020fbf730a9', + 'timesbi.php' => '1e77620e40e3e4bba0d29da4b10f55a8', + 'timesi.php' => '9c92d3693094e7c46cfb6c6416369971', + 'zapfdingbats.php' => 'f4f9f7de4fc64851280d29dfafc868d1', + ), + 'images' => + array ( + 'pdf_16.png' => 'f79c40d961e1125010f572634fa61f8b', + 'pdf_32.png' => '7815b3da903470812856fe16cd53bc97', + ), + 'languages' => + array ( + 'English.php' => 'cdc4aab2e1c8caf5ddf209e32946c623', + ), + 'admin_pdf_config.php' => 'ab75370cbef1f9e7d32448717071eb82', + 'e107pdf.php' => '2911ada133d8c7b104f553e8232361e1', + 'fpdf.css' => '35c07d5049ac6e55b8ab473c6dc38bf0', + 'fpdf.php' => '47653b1a92f6a51cec644abc9b267bdc', + 'pdf.php' => '9c05a56fbb296b60cddcfc68ec1ae2c3', + 'pdf.sc' => 'cd179b47d126ac55eb48cdbdbd4c1a19', + 'plugin.php' => 'd5aba62f42496d21e3ec8d48ded5b3ba', + 'ufpdf.php' => 'fe9444d6d9c0553bd06fc1904b0df484', + ), + 'pm' => + array ( + 'attachments' => + array ( + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 'images' => + array ( + 'attach.png' => '7b07df07c819ccf0c007e2753b026e6f', + 'mail_block.png' => '4c23d4b896e42753bfaeeb934e1a7e21', + 'mail_delete.png' => '6999f9a797e624857e12f875981fee8c', + 'mail_get.png' => 'f5405868a5064a382ebda5dde8eaa633', + 'mail_send.png' => 'ac54828ad23a1e10bc84330f0b754a12', + 'mail_unblock.png' => 'b949c53a1ce63cc57f47d3335ea0468f', + 'newpm.gif' => '4d16f5fbaa8e76067053c8c901972bc4', + 'pm.png' => '1adf028fe9c30aa21008b1c7dbc94243', + 'pvt_message_16.png' => 'd327402ad98c005569023d691458c83d', + 'pvt_message_32.png' => 'c466117afa172593078f2aae10394306', + 'read.png' => 'c7bacd62b460d2d05c210030c8733420', + 'unread.png' => 'ad2e1da81983bb1bf0c1aeb310cd9c17', + ), + 'languages' => + array ( + 'admin' => + array ( + 'English.php' => '8c6ed48f14ef1bf19bc22f97b48494db', + ), + 'English.php' => 'ac6ca2e308d6d15e11b4d322298bf3c9', + ), + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'plugin.php' => 'c89f4e634476ef16447a5375f39ce495', + 'pm.php' => 'a5aa043661c8230e93b8cb4effcc8007', + 'pm_class.php' => 'df040f82c02af492432c132c0887a9f5', + 'pm_conf.php' => '4219da868fbcd4ea43ecb050eec83fac', + 'pm_default.php' => '0213fb9bcfe60d37041f44136727649b', + 'pm_func.php' => '4b9c0a299c8995c1e6f6aab4071d2e17', + 'pm_notes.txt' => 'df26332907da1f35c4731d8893aea23e', + 'pm_shortcodes.php' => '944e2f2957ae880e49684f724cad8ab1', + 'pm_sql.php' => '4608486c1027c6485dc32674fd536dc5', + 'pm_template.php' => 'cc1bdd12537404e75f9bd6dca8022292', + 'pm_update.php' => 'e66fc6610e273471a212471e07598710', + 'pm_update_check.php' => 'a5b341b5373844cdfc1f961fb3d3151f', + 'private_msg_menu.php' => 'ae1b1a633de92742b1d8460a6fa5d9fb', + 'sendpm.sc' => '8e2ef687982946d62df06bf6e9bdbc24', + ), + 'poll' => + array ( + 'images' => + array ( + 'bar.png' => '37d6b48106f4cdde2f549720dfd0cf79', + 'barl.png' => '11f7a33d11a71e4dc52254ac6dd831ed', + 'barr.png' => '117b5de6bc7c859de48974d01887d738', + 'polls_16.png' => 'dfa11ad7ecf088f5bc50152e3c8318de', + 'polls_32.png' => '7c98815961fc0215e8bd38aef5e1c295', + ), + 'languages' => + array ( + 'English.php' => '36b348fdefe092023ee513a4b1e6aaae', + ), + 'search' => + array ( + 'search_comments.php' => 'cc9ad502cfe9c867ad4b3ff07e6cd019', + ), + 'templates' => + array ( + 'poll_template.php' => '0c83f7e4984e9a0b8bbc196262cc650f', + ), + 'admin_config.php' => 'ba8fbd550cb0e34cdf445d117f5c93cc', + 'oldpolls.php' => 'ae016f0aa026a6a9de8af8d24de53ff9', + 'plugin.php' => '6dff875dd04ce5d602f4b64b7732610e', + 'poll.php' => 'b51353ac9b1d4f9664b954d528644547', + 'poll_class.php' => 'd5e58aa6c9ab5b63d51ab7b36fdf52f0', + 'poll_menu.php' => 'b2e1d5b8d5e8cacf51e2724446b663c1', + 'poll_sql.php' => 'ffe53748dbd1504f7c4204027814064a', + ), + 'powered_by_menu' => + array ( + 'languages' => + array ( + 'English.php' => '4e4018bc11471818ca7256c722e28c13', + ), + 'powered_by_menu.php' => '030115b6ab06ef38b31510aec2b11ee3', + ), + 'rss_menu' => + array ( + 'images' => + array ( + 'rss1.png' => 'c25701747091968c0f31dfc76f2cefbd', + 'rss2.png' => '9382a50cb221e9e6b829df2a7f52d461', + 'rss3.png' => '0a9bb4cb46a75b34db034ce6f2b763e6', + 'rss4.png' => '9f9b20c3cdd5cee6072eda153278bef7', + 'rss_16.png' => '276d6e7671548aea71f2c64b026d731f', + 'rss_32.png' => '22602a166d61764a13184506dd75ea6c', + ), + 'languages' => + array ( + 'English.php' => '90ba4c3b30c128eac2a16d0007416c89', + ), + 'admin_prefs.php' => '511047205732e1f3a5098052e3a2eb4e', + 'e_meta.php' => 'cec75314cf27f19abc2ee1cbaa15c99a', + 'plugin.php' => '46b1e37c9d18e6872083425afb3115fa', + 'rss.php' => 'd2da7783fcbfe777929b54f93bf16a73', + 'rss_menu.php' => '1be0ce84109cbbbcdadf68cc93fb5c20', + 'rss_shortcodes.php' => '5f78ac16412442bb16f729c6e71c582a', + 'rss_sql.php' => 'efee18037cab9fbf35cdf81f97efc2a3', + 'rss_template.php' => '023614657d162b0f155fbe50e6e3dce2', + ), + 'search_menu' => + array ( + 'images' => + array ( + 'search.png' => 'f1f617ae57346558eefce7d0b79b71c2', + 'search_32.png' => 'e0035406d30341e044c130ec0543a6c0', + ), + 'languages' => + array ( + 'English.php' => '091e3795b604b11354ad70dfc36ada65', + ), + 'search_menu.php' => '7f656b728eb7b34a48043bda3b35d29f', + ), + 'sitebutton_menu' => + array ( + 'languages' => + array ( + 'English.php' => 'fdae05c8659df7d21edf91d0bd8aaa9d', + ), + 'sitebutton_menu.php' => 'a798130948fa4626a4a576f34c71ebf3', + ), + 'trackback' => + array ( + 'images' => + array ( + 'trackback_16.png' => '9092b95903c88570dab202d2a5892ca2', + 'trackback_32.png' => '323e78071fe7dc88aa05034102403456', + ), + 'languages' => + array ( + 'English.php' => 'e482c4c1b04b71a713e8aa21cb4b047c', + ), + 'admin_config.php' => 'd1222ea1494b8b8c06247e72fb5d2f9f', + 'e_meta.php' => 'dee500df70205a00f524a0b0720205c9', + 'modtrackback.php' => '97d65e889ac0682d106186d4c989e6ca', + 'plugin.php' => 'faaf0e70297414b7f61db1a8f030a02c', + 'trackback.php' => '68d35830a04bc5283cf0ab718b3ee2f2', + 'trackbackClass.php' => '40cf1ea472926781f7ce51d0a9653f6e', + ), + 'tree_menu' => + array ( + 'languages' => + array ( + 'English.php' => 'be4478e772ee1e1189a57284891582d8', + ), + 'config.php' => 'a78276d858ff5dcaf1980939ea0d9578', + 'tree_menu.php' => '81ddba9d61a54caa9c8b74d80ae1f439', + ), + 'userlanguage_menu' => + array ( + 'languages' => + array ( + 'English.php' => '11eb945ea792024fc2ecd881d77781d7', + ), + 'userlanguage_menu.php' => '86492340899ebf9da2fd44250544814a', + ), + 'usertheme_menu' => + array ( + 'languages' => + array ( + 'English.php' => 'a4163beed74433ec6657b9cbbba50846', + ), + 'usertheme_menu.php' => 'ee312586d8f026d46e72704b913ccf85', + ), + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + $coredir['themes'] => + array ( + 'crahan' => + array ( + 'images' => + array ( + 'bullet2.gif' => '0f846116f7143e8f997f9175ea93168f', + 'logo1.png' => 'c21ccdf73de64f318dbcb45ed048d585', + 'logo2.png' => '422b66f0e312417fc5a9647d18b5cd6a', + 'logo3.png' => '2e8eff0aa8a1c924bf0134e9ba6047ec', + 'logo4.png' => '8f189548b4f02543a138e9bf0314d9f1', + ), + 'languages' => + array ( + 'English.php' => '5634193f9c40908e7753db6c3b557c37', + ), + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'preview.jpg' => 'b841409838526ba769866861bf236100', + 'style.css' => 'ea3af6647ce3d7ed62c5a973b8a2a7bb', + 'theme.php' => '9f63c8aa0ff3f0e6ab07c89a8bb7bd08', + ), + 'e107v4a' => + array ( + 'images' => + array ( + 'bar.jpg' => '5afc27f5a70a68e53b1a51d74a40fbcc', + 'bar.png' => 'e63a0d8adeca917fd487bee6634b0d54', + 'barl.png' => '4559714c78a2ea8591505123897d528c', + 'barr.png' => '283538272ee7de8888ddaccec7d0cf93', + 'blank.gif' => '0e94b3486afb85d450b20ea1a6658cd7', + 'bottom.png' => '6500994715b4d988e604fdb8cc592562', + 'bottomleft.png' => '40d167ca546bec754489f2ed4825fe2c', + 'bottomright.png' => '15c1d7e34d52549c285586ae5e03892c', + 'bullet2.gif' => '5fea13d481fc903ce05bfed57341e1c1', + 'bullet3.png' => 'ffd6c250377d22660e9045d5d97705de', + 'button.png' => '69918234a9caea763d1c66781e50fe34', + 'button2.png' => 'a0aea9a2dd8889f65f48a0621eb91d2c', + 'button3.png' => 'd2fcad5cfabc21b2f204b1a5d7229e55', + 'cap1.png' => '01271e8d5f2f5770bccc7dca903339f1', + 'capdark.png' => '968732d5e5ddfa288f59af2c47f5d4d7', + 'capleft.png' => '3beb236cb19fce601ebb3ac45f9e389f', + 'caplight.png' => '8e6f1d6155da88c011f33ca4784b6989', + 'capright.png' => 'a83ca3941c8a447f19b51ad89ecfc72a', + 'captransition.png' => '27e1c09ff88834b2ea140fa4a3f974f2', + 'fcap.png' => 'fbb6a2f0fb0b7f474812f622dc5423cb', + 'fcap2.png' => 'df4f0cd94d3949340f9926da33a3b253', + 'header.png' => 'f486dfa869b0cdf39445ea02d120a68e', + 'left.png' => '38d094baede7ab50c1f6696a21f222ae', + 'logo.png' => '8dd271371d50ac36b2a501297e0e8c73', + 'nforumcaption.png' => '382fc538b165c4228dc1ac962bcccc1c', + 'nforumcaption2.png' => 'd5095a41f9669de31650e2b397119e29', + 'right.png' => '22025f8d78f4419f9ee92d9f88a34cef', + 'search.png' => '088a3d0166f6683ea9586cdce438f8ef', + 'temp.png' => '443805d6f488cd2669027b443f860483', + 'top.png' => 'cd6994bb0a6a40ab5bb19edc86668d6e', + 'topleft.png' => '37a08fb25f85cb85bbb9dca682fb9870', + 'topright.png' => 'be43c8d3237cc599524fd5100a719057', + ), + 'languages' => + array ( + 'English.php' => '267a4652945d08b0a14d421c47d7cdf8', + ), + 'forum_template.php' => '5236c9308b808d1c0c96aa4b8647ccec', + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'newsfeed_template.php' => 'bf35ae0a44194fb397c9816bd81c7522', + 'preview.jpg' => '1f1e5815a674ceb1eaa562caa0e23607', + 'style.css' => '31dbd50ef3ff04150146f4b618c18385', + 'theme.php' => '533543688af3450cd14bdc170466c960', + ), + 'human_condition' => + array ( + 'images' => + array ( + 'bg.png' => 'e6015f86e49dee0db753301c1e7b3966', + 'bullet.png' => 'd96af312cdc074075a4e5fb559dac73b', + 'bullet2.gif' => '9d376a8d449bec3df0d1086127799a6f', + 'bullet2.png' => 'fad8045a7696954f7435c33bfd435811', + 'comment.png' => 'f227913f7b341d5a696606d5a5f7baf9', + 'footer.png' => '5fbba976e98c785c98b10aa2b2fe8e99', + 'header.png' => '3da9f377741904abbcd94ff63a011e78', + 'titlebar.png' => '9d7e299f83e2814fccd253d2f7b8ea04', + ), + 'languages' => + array ( + 'English.php' => 'e9de51bdb55910fdc36ebcf96dd86396', + ), + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'newforumpost.php' => '6a9cd60b76c00cd41384f21ce1265860', + 'preview.jpg' => '37766edab6519ba0d82d89d0fad9b9df', + 'style.css' => '98b43a380766349d489c4bdc3ea69eff', + 'theme.php' => 'e7f8584099975bafbd28c2f8683de37b', + ), + 'interfectus' => + array ( + 'images' => + array ( + 'background.jpg' => '9d2f41c5d82966332cb6438109160d2c', + 'bar.png' => 'b67fed22a0eb45e8f98f34513b5ccf46', + 'barl.png' => 'f89ad6313d8b53becafe22598ae74472', + 'barr.png' => '0a5849424599a8533be5089ef74d286f', + 'blank.gif' => '0e94b3486afb85d450b20ea1a6658cd7', + 'bottomcol.png' => '78c5741f54dfec40c82f641045a92ad9', + 'bottomleftcol.png' => '03a6d3ec5e14fdf7e478356ba92c955f', + 'bottomrightcol.png' => 'c2bd7c6b693370833043eef967647829', + 'bullet1.gif' => '029a9d7164bb4ed6a8be279af02bcb20', + 'bullet2.gif' => '23c11ebc20e7c45ef75920ae2cfea93e', + 'button.png' => 'e3f712ad4329ff235174499c2bb64a9d', + 'cap1.png' => 'ab7deb73123e7f49b1304b0a6b787a8e', + 'caption.png' => '16f3fb712fc7f9fd498233b6d1d2c56d', + 'fcap.png' => 'c4a6f800c5ad92d7690d6ef6d33257e9', + 'fcap2.png' => 'e6261197a46d0ba830b74bac1dbc14c6', + 'footer.png' => 'c652160dd5fdfc9f4d50508c2ca6ad82', + 'header.png' => '9bbef79c069270f41c14c7abaa300f68', + 'leftcol.png' => '028354997e0d91ec6b808f51b4e2d056', + 'link1.png' => '01c1e8458cd7bab11c832763fcbbbb23', + 'link2.png' => '73d622e9782c81667528e6244603f832', + 'menubottom.png' => '56cf53e0f327058a113e8e23610badee', + 'menubottom2.png' => '6d9773d2afe504030b13627d7fd4d7de', + 'menutop.png' => '6010f91e233a5898d758db3eafb23a68', + 'menutop2.png' => '86c8a40fe7738475c143da269138c22f', + 'pagefooter.png' => 'cef4949afdbdab08dbbdf5a7e6db0643', + 'pageheader.png' => '916bb72001e7de90e00fb7a812e9438a', + 'rightcol.png' => '6684d175a110688fca18a06d82c5bc25', + 'search.png' => '0f9fa3188d15796337583ee1e1119769', + 'topleftcol.png' => '8b11e9f5354e5d8c84e5aa70eed896b3', + 'toprightcol.png' => 'aa0e7a7ed969629447669c6fd7ca827a', + ), + 'languages' => + array ( + 'English.php' => 'bcd2c57395cc693ee791c8cdc5a7e420', + ), + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'preview.jpg' => 'a4b48f473468c22cb5f03054eda08794', + 'style.css' => 'bb2e6303ad7fed8a1119fd08b7bd11e8', + 'theme.php' => '1f15d7afdfee8ca33bd2667085cee2bc', + ), + 'jayya' => + array ( + 'forum' => + array ( + 'admin.png' => '64ebd91cca24b185ac81a05ddbd790eb', + 'admin_delete.png' => '68567d088171dc9800c75e3717d01551', + 'admin_edit.png' => 'a89466d56dbaae7d8bde1330e3714807', + 'admin_lock.png' => '228e1b606811f415c253e851f779fea1', + 'admin_move.png' => '7ec6991055150d10f3d61b0c4fc18527', + 'admin_stick.png' => 'c3e003b6f1873284eae24ac8e8997983', + 'admin_unlock.png' => '184c7a4c28517e01f3fda3c77f4c5d01', + 'admin_unstick.png' => '87309a3d62a49f3432888c79ece6fb5e', + 'announce.png' => 'eff175ae24b46fb0ee49a34cc6ca9e1e', + 'closed_small.png' => '228e1b606811f415c253e851f779fea1', + 'delete.png' => '7c20906029cbc1fc0c7c64d26d2868e2', + 'e.png' => '6c335c5d89cc241296a45eddb888ee95', + 'edit.png' => 'c762eaed37cf8d4a4ff68cdfcb5099a8', + 'email.png' => 'e6c3d37c6a4c39b9330ca3bd7e9bcffa', + 'fcap.png' => '20137d499eb7e57064231cc4bc910dd4', + 'fcap2.png' => '0a733fe6e51713f13276eec753da2d9c', + 'fcap2orig.png' => '5f6f45697bc185d51f2c06d904642aad', + 'finfobar.png' => '71585c0c2d3340ece8cf769a135286b9', + 'forum_icons_template.php' => '7b54f527b4da7200128d6e1e33918080', + 'main_admin.png' => '4033115a6d4c622f16e23c7d82bc1bd9', + 'moderator.png' => 'd3100a24d0bf141c8d3e5445d24b712a', + 'new.png' => 'f80e5840a07b08c9502af386b9c6c928', + 'new_popular.gif' => '9b92a52b897b1730793c4a975dd0edbf', + 'new_small.png' => '5197b92d879fd774e87cf9ee26694498', + 'newthread.png' => 'abfdbdcaa23bd33fdbd11f2f59c8e4c2', + 'nonew.png' => '4113a87c52860c4e131e919b0f8f0193', + 'nonew_popular.gif' => '9aa9a7418692e5cd1dd05026f577f984', + 'nonew_small.png' => '36e801e40256dae69c5f864a60555a22', + 'post.png' => 'c16dff0c96b789a40f1eb46c96291960', + 'profile.png' => 'df45fd4fc914d95c3e17b5929e4cd44d', + 'quote.png' => '33afa118321e687fb74b13c82d8ff04c', + 'reply.png' => '2b3fe53b428e0449dcf7ac886e309a62', + 'report.png' => '48eb0e1fd95db4c11441f058a9f45254', + 'sticky.png' => '4ddcd806ceeccb602772e668a42fc500', + 'stickyclosed.png' => '79cb1b7e7a1ae3f9d42cf3ec4bf57fc3', + 'website.png' => '7fba90ad852e9ddcf968eedc7f49a39f', + ), + 'images' => + array ( + 'arrow.png' => '38b69b179e7cdf232aa367a0dc3c4cbd', + 'bar.jpg' => '5afc27f5a70a68e53b1a51d74a40fbcc', + 'blank.gif' => '0e94b3486afb85d450b20ea1a6658cd7', + 'bullet2.gif' => 'f46acab251856c2c2e03dbba9ed2e469', + 'button.png' => '6ea310ffec2a7d4cdc2e76e0fcae2445', + 'buttonover.png' => 'c76d73539fef2b9d72506583908cfb36', + 'comments_16.png' => 'ada4e49b53f9732e0020f8f917125e16', + 'computer.jpg' => '424fa719231f821ffeb6b26f6d8553ff', + 'computer_pepper.jpg' => 'cdc1fe5c604b577faa4999a53a909f9d', + 'email_16.png' => '90866c1f54ed36c131038d2fc0851ac8', + 'on.png' => '34679051e7603ef4f91674e310fbd628', + 'polls.png' => '2b352ea3b2c392dcc1c6551d1c1b3920', + 'postedby_16.png' => 'bbc0eb1411a21d970b3f3c9855e516af', + 'print_16.png' => '574a45049daf40bb348ba6252a1e435c', + 's_body.png' => '7ba1f7cae60c29f12b290a1306df3281', + 's_body_.png' => '7ba1f7cae60c29f12b290a1306df3281', + 's_left_bevel.png' => '8568f929ef599f3116c49491f8893e90', + 's_left_bevel_.png' => '8d43f9f9c6b647e654e181ad510721f1', + 's_left_cap.png' => 'b6b3e6544925566237f0f357c7345bfb', + 's_left_cap_.png' => '1bc0b1738662ed120e97cf2afb0d3d8c', + 's_main_cap.png' => 'dfda87c00cfc0b6c3540c3666c8f4b51', + 's_main_cap_.png' => '4061f78621a6fe3b65aeb6fc64faf84a', + 's_nav.png' => '0ef5452590a980bb30cd463c0c6f4a8f', + 's_nav_.png' => '0ef5452590a980bb30cd463c0c6f4a8f', + 'screen.png' => 'd44a65d37f39fd788992214e3a4cbe84', + 'top_mid_back.jpg' => '1afb134a1f0da2309319bc6f662d155f', + 'top_mid_back_pepper.jpg' => 'cdc1fe5c604b577faa4999a53a909f9d', + 'top_right_back.jpg' => '44d2f4803a1d902a0cebf289c9598857', + 'top_right_back_pepper.png' => 'd44a65d37f39fd788992214e3a4cbe84', + ), + 'languages' => + array ( + 'English.php' => '6d5c404d3f5949d55660c3ba47ad338c', + ), + 'admin_template.php' => 'a894a1c9e20bb7b895e1151854a1083e', + 'canvas.css' => 'acdfee6441e3dc292657ca469b669df4', + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'nav_menu.css' => 'ac9d2df99166eb5ce87c16bb146bc413', + 'pepper.css' => 'bcd1ac74e7cacb3ace1396355f238cc8', + 'preview.jpg' => '1d775846dbe1b7ea66065fc0eac72eaa', + 'style.css' => 'c406d47937f253e08d655b1d1008a6c2', + 'theme.php' => '82d43fe4ce914385611be80b3bc37bc9', + ), + 'khatru' => + array ( + 'images' => + array ( + 'background.png' => 'ce934d43f3fd71ee27d26b135457f6f6', + 'blank.gif' => '0e94b3486afb85d450b20ea1a6658cd7', + 'bottom.png' => '6b249ab3e679d5bd3dd39768683f9d60', + 'bottomleft.png' => 'e413385707e6a7d1e16229cfa49fe231', + 'bottomright.png' => '8bf0be6aaa09fce54811e2879e137873', + 'bullet.png' => '08eed4002e3d9fbf8f71d47c62a0fcfd', + 'bullet2.gif' => '1ec22e77515023bd344efeef8d827747', + 'button.png' => '62c64b41d5ad1a53fe6e23a2cf486b85', + 'icon.png' => '53e431306fb2e33a5ed3df6750933285', + 'left.png' => 'df5d30abe11aa5bf81d00fe5f16a9d31', + 'logo1.png' => '2d754a5f6ed77a9c5b58d5ca6d381fa4', + 'logo2.png' => 'de1b45f1e69c5d1874ee2fcde18e6073', + 'logo3.png' => '91c059d925a2825e0010a4cc2d5189bd', + 'menubg.png' => '1255daf004f8842b41e4f5e01e167c75', + 'menubg2.png' => '68f34e41e6334f70b6f14ed397c3df67', + 'nforumcaption.png' => '02cc27a5df2d68a063c5b2c8f4c42454', + 'nforumcaption2.png' => '1d62d20a5c0acbfd2211f2e8519c7fea', + 'right.png' => 'f29d08d4bf94b7e8946c09443004c77c', + 'top.png' => '5922796553902b607cca12e9a04b5f8b', + 'top2.png' => '9c11cc9f67cf21144e2c386fdc0b38d2', + 'topleft.png' => '4b41f3bed350f3b72de850a0c6f1d7ce', + 'topleft2.png' => '0dd4664012701da19679b020a916cf27', + 'topright.png' => 'f2b03fb32176cc7c067b411992d02d02', + 'topright2.png' => '7b6d4344421aad96d620a25a250d6f50', + ), + 'languages' => + array ( + 'English.php' => '66e19fa68eda6e34636ff907c328bb9e', + ), + 'download_template.php' => 'a9742a3e65ac83e279cabee1e1e50fb6', + 'forum_post_template.php' => 'fef4832dd26316448ef939cb2eb35931', + 'forum_posted_template.php' => '66bb8c27404c12d7e784745685f1f398', + 'forum_preview_template.php' => '4455c6b5e0991211db66dad466274bc0', + 'forum_template.php' => '93227cac477be310f0e5a1f6b4a310e5', + 'forum_viewforum_template.php' => '23b68de8f4d06ce6e22f281668d612d3', + 'forum_viewtopic_template.php' => 'e26e8e97cbe85e2b248a221af5148537', + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'newforumpost.php' => 'bd44d5240db6fb7af02138dd2499a8ef', + 'news_template.php' => '0f5b689c4ad3d212934707f44b959b11', + 'poll_template.php' => 'c01388206c3cf373ff04e01c38485d99', + 'preview.png' => 'b164565b63d086a6a5a28fd76097487c', + 'style.css' => 'be699284eb74ccbd6543eac6f60754ea', + 'theme.php' => '91a9e9dd2439516210c1f0b29437a9ed', + ), + 'kubrick' => + array ( + 'images' => + array ( + '01_linkbg1.gif' => 'f63772c2cc656495a6d7f65d2a754f5f', + '01_linkbg2.gif' => '3bd01b3f95a387963bfb0b1ab01b8d91', + 'bar.jpg' => '5afc27f5a70a68e53b1a51d74a40fbcc', + 'bullet2.gif' => 'd1b6cacb4849b507dad138766ed3057f', + 'kubrickbg.jpg' => 'ebc477e9f99d802b450616239317cfb9', + 'kubrickbgcolor.jpg' => 'a5fc1c9484453bdcc6a0c8eaa1d99ed3', + 'kubrickbgwide.jpg' => '1214890da2d47e7fcd149817021bdf04', + 'kubrickfooter.jpg' => '84b95d2c16d25dfef12d3c31ba33cbe4', + 'kubrickheader.jpg' => '29de9d7614370f301799cb340c1db703', + 'tileage.jpg' => '3435eafbab94790d5f74cb801b645c0a', + ), + 'languages' => + array ( + 'English.php' => '05890778f266bd0669aac13c92103ba8', + ), + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'preview.jpg' => 'cb94c52db72d1ba8bd4d1e08ee41cbfb', + 'style.css' => '0f93072e98199ac87d3d2957cda402b9', + 'theme.js' => '092a48b0a95fcb44c48236c40948eb13', + 'theme.php' => '449b35c64b081ab7061a97daec5ae1c0', + 'ul.sc' => '94dc33c24a82bbe2c357d4ac165d8c09', + ), + 'lamb' => + array ( + 'images' => + array ( + 'bar.jpg' => '48958de1c195f2b5694643a2fe1f2db2', + 'bg.png' => '6de8f72fdabaf5bf9fbd7cbed462ca68', + 'bluearrow.png' => 'a2df5d6a0f485040f843786e7c606e27', + 'bluearrow_greybg.png' => '0e9896ea0eb8c9eb4f01efdccd2f8a03', + 'boxbottom.png' => '01847b0507171e644013b4bab4febc78', + 'boxtop.png' => '607a50aed74c069befab870576de5868', + 'bullet2.gif' => '0f846116f7143e8f997f9175ea93168f', + 'button.png' => 'a8c0d55b31b31f36c1b1505651e0c5d0', + 'comment.png' => '4515b0331b8a6cb20f92efeacf214a59', + 'download.png' => '80f205604db6d451bf57a71166b6a804', + 'email.png' => '04c8a3218d13cb28be418ee835cac34f', + 'greyarrow.png' => 'dc96c19cd1ca4751040b1e88cae51c12', + 'lboxbottom.png' => '9144b3e9b6c290ef7c4348ace98128d8', + 'lboxtop.png' => '1676f64eaad673a63ae221d370bfcb1d', + 'left.png' => 'b7eb6f1082d63fa13db0da677ccbfad5', + 'link.png' => 'ddc7ad68de90d91f2d85d1c8bea8d358', + 'logo.png' => '5a5fcab0cdd03024f4163b385afa32cb', + 'logo_template.png' => '7cbeaf46b35c917ceaa378476a8938ed', + 'logobg.png' => '13be74d210b6e82c561fcf299087b5fa', + 'nforumcaption.png' => '02cc27a5df2d68a063c5b2c8f4c42454', + 'nforumcaption2.png' => '2b4a342e0fe48adfddb8e058d67cb8ca', + 'right.png' => '62054b67c23bbbd0f258fbe8ce23ab2d', + ), + 'languages' => + array ( + 'English.php' => '22dbd47c4a9f41af9d1bf3cbce5e19c9', + ), + 'alt_style.css' => 'e9ee5679b9218c1c7d89c98c2f95b701', + 'alt_theme.php' => '09fc4de57c31e85eac390e643d401ed7', + 'chat_template.php' => '8a57696d7ecb512823073c64768c8ed7', + 'download_template.php' => 'b6e968dc3f6d17d161b0105b67ae2903', + 'forum_post_template.php' => 'f1a897cbd307b7f0324a501f6664540d', + 'forum_posted_template.php' => '56a97c40620ae669bca178f30ffdd044', + 'forum_preview_template.php' => '2391640ab5380b18ac17e54a99feb29f', + 'forum_template.php' => '8c5f8a4dedc4829aca2c4f418ac49ceb', + 'forum_viewforum_template.php' => '4cdfeb489d50e1e90be0ac8a4af60cf0', + 'forum_viewtopic_template.php' => 'e0d6f0a2678206fa4542ee3ec6459333', + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'newforumpost.php' => '7ec9f0bb87045e10862dc2b7dcc9757d', + 'news_template.php' => '0f5b689c4ad3d212934707f44b959b11', + 'preview.jpg' => '184658c1d2222cd0137cc445fcc785ea', + 'style.css' => '475d1badb0a770d6da07c350ffd6dcb7', + 'theme.php' => '6ca169bb182d7ef950c2b27ed88d28d2', + ), + 'leaf' => + array ( + 'fontstyles' => + array ( + 'large.css' => '6428f461d0af5de2a5af1547e98b4590', + 'medium.css' => '26ba7c74395c9c77f21a2345c2ed92b6', + ), + 'images' => + array ( + '01_bg.gif' => '50f03651c070e4138c97a4a7ee9e5339', + '01_bodybg.jpg' => 'ca5f9a092c397986fa10d5990023ab25', + '01_font1.gif' => 'df5d2f07cf7e70371169f54c085435fa', + '01_font2.gif' => 'e9b455dd3cb7ecde36b321aebe977c47', + '01_font3.gif' => '8e9bb2d8d0b48f1cc64e519bb090ef6d', + '01_footer.jpg' => 'cf2f00b3e5a2aff05e70e728eb225cb4', + '01_hdot.gif' => '945bc76d6f25d2a32fafb0abe1933e1d', + '01_header01.jpg' => 'd41622f4fd90237ed438026896dadbc7', + '01_header02.jpg' => '3b01a113505d77d9103b8ad7ae490b0a', + '01_header03.jpg' => '2c25376dbaa1e2a038f8d46fedd5881f', + '01_header04.jpg' => 'dcff85a614aa8fbc68452d2795f5a2f4', + '01_item1.gif' => 'fd6e6c5768ada8f441cd1e80d3e61b8a', + '01_item2.gif' => 'a46a4994806a4c181310caa3e92e80c1', + '01_item3.gif' => '8dce3a9b0c43a0f8b6c9fa4b7500ec19', + '01_linkbg1.gif' => 'f63772c2cc656495a6d7f65d2a754f5f', + '01_linkbg2.gif' => '3bd01b3f95a387963bfb0b1ab01b8d91', + '01_logo.gif' => '06df534ab4f86845ce92257b6737b57a', + '01_m_comment.gif' => '27ac7a5eba1cbc30e793a013ac7c0c5d', + '01_m_default.gif' => '43b70b8bb69fed0f1ec499eb415dc234', + '01_m_news.gif' => '4521605dfa4313520323c28ea26f466d', + '01_mountaintop2.gif' => '034d9e56c10dd3579a7e371735b3075b', + '01_quote.gif' => '93174f052a4a478a633d57dd5d45e32c', + '01_s_about.gif' => '8d0f8698265a152a788fffa7184e681a', + '01_s_categories.gif' => 'a5dedac27cf2c1403b60e52fe4897016', + '01_s_chatbox.gif' => '493f3eb5cd5cb6655997a7e511e350c5', + '01_s_default.gif' => '68c19e8bb6615de2836ec827ab5a6675', + '01_s_latestcomment.gif' => '0b310e282c178c70e190f930ce199117', + '01_s_links.gif' => 'dc4858a967f948815f08acc3dceb33f4', + '01_s_login.gif' => '7f4e38303d5c571bb34660ffb60513e7', + '01_s_online.gif' => '1dcaf5db2305af2c315777f91c6fc828', + '01_s_search.gif' => '1bc719781f1d326651ad4733906d67a9', + 'bullet2.gif' => '5d8d5d48a81b4a045de961a77413de18', + ), + 'languages' => + array ( + 'English.php' => 'b89b3b5688c29ffe9ad8ec70ce414db8', + ), + 'bluehigh.ttf' => 'd3003ad3a5de2a785fbb898c89cf40ff', + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'links.sc' => 'a3f5d8fa1e9e14c1b6cc27b06c7754fc', + 'preview.png' => '804c22db1f71223d10e6f7b8b85f69a9', + 'style.css' => 'e7392ac143d7daa82882e906b5413c31', + 'theme.js' => '16285b5ba2631979457e5e2ec1cf10af', + 'theme.php' => '9c7ebc86ae47a457591fdd86337cb11e', + 'ul.sc' => '7614f31e4b096439bea1cd7c9f9ee0e9', + ), + 'newsroom' => + array ( + 'images' => + array ( + 'bar.jpg' => '13b2cb049602ff94d0d80a0e0896d8e9', + 'bullet2.gif' => '2ef6767f3a54a1e7c749421ef0ffad20', + 'logo_bg.png' => '2a38a1ac257ff1d975e15a5169221fd8', + 'logo_text.png' => 'a578be578c320aa365e9bf4ae07abe23', + ), + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'preview.jpg' => 'de22b398f66e271fdd908ac31f25e7e4', + 'style.css' => 'bd8715343b586a898a6e4e7875e2f6b6', + 'theme.php' => '5ee241f2ee0f5f852512101261bcad84', + ), + 'reline' => + array ( + 'images' => + array ( + 'arrow.png' => '38b69b179e7cdf232aa367a0dc3c4cbd', + 'bar.jpg' => '5afc27f5a70a68e53b1a51d74a40fbcc', + 'blank.gif' => '0e94b3486afb85d450b20ea1a6658cd7', + 'bullet2.gif' => 'b3baab02dac12534c559cb219422c2b3', + 'button.png' => '6ea310ffec2a7d4cdc2e76e0fcae2445', + 'buttonover.png' => 'c76d73539fef2b9d72506583908cfb36', + 'comments_16.png' => 'ada4e49b53f9732e0020f8f917125e16', + 'cube.png' => 'd3f6dd7ab8353b169403826534affb42', + 'e_adminlogo.png' => 'ea8741ecbb591306740e29f420e324b9', + 'e_logo.png' => 'c326c9fcad890ee3cf652b86b219d044', + 'email_16.png' => '90866c1f54ed36c131038d2fc0851ac8', + 'header.jpg' => '56fc3b2e5b74c3f3a111dbc462625c82', + 'header.png' => '094cd7068dc557ce83b5205499ace920', + 'loggedin.png' => '92edf005c8272484836b9f81e509b75a', + 'logo.png' => 'c326c9fcad890ee3cf652b86b219d044', + 'paperclip.png' => '7239a7df3faa4b0a77709b5f99dbbbf3', + 'polls.png' => '2b352ea3b2c392dcc1c6551d1c1b3920', + 'post_it_bottom.png' => '58bd6133cd5439ca03dabcf55a8d94f7', + 'post_it_middle.png' => '2fabff36c04748927032e2d28bc3ccae', + 'post_it_top.png' => 'c7caa215f5c456ab26cbf65d768d5568', + 'postedby_16.png' => 'bbc0eb1411a21d970b3f3c9855e516af', + 'print_16.png' => '574a45049daf40bb348ba6252a1e435c', + 's_nav.png' => '0ef5452590a980bb30cd463c0c6f4a8f', + 'search.png' => '5913e61a181f454a632998805524097d', + ), + 'languages' => + array ( + 'English.php' => '3288884b05004a91af4802cb7e2098a2', + ), + 'admin_style.css' => '7850d3c2db60fb1e649a6eb6201cfc11', + 'admin_template.php' => '92c8ff5fde3790dbcfc895c52c7dc3d0', + 'cube.sc' => 'f85e6d1f10ab3372ec7ebdb0548651ad', + 'full_width.css' => 'f806f549c1200131c4c043db72408da7', + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'preview.jpg' => '30da9e1ef04e5f1fef38ae3d23e0f3c4', + 'style.css' => 'aa2df8aa8519c802f10e3eddfd95aed3', + 'theme.php' => '67949514e7139dcbf5dbb9b29d221940', + ), + 'sebes' => + array ( + 'images' => + array ( + 'arrow.png' => '26ea2f602e8ea98d2bedda29cb91c821', + 'button.png' => 'b2ad00a38be298ac4fde8652fb26c8a8', + 'fcaption.png' => '1cf687c703277456b26ea2aff99b3dce', + 'forumheader.png' => 'ad4c1d57c875addbcb9b91c249c1400d', + 'header.png' => '1dadfebcfa12467437c4fd9e02ccf34a', + 'logo1.png' => '36dd9e17390cdca7ec3e8211df5e744c', + 'logo1_template.png' => '5dc8493db503307b22ef2866b8bab58f', + 'logo2.png' => '6c393b306658173bf9f65954aa059260', + 'logo2_template.png' => '613631693ada2776add607af07ebb5d4', + 'marrow.png' => 'c5e56a7c552347ba6a4c5f965c013828', + 'oarrow.png' => '5e15f2f7b6a5e9ccea9583dc841dce8e', + 'search.png' => '5d1c0bcd24277a60b6e5f13059d3ec4f', + 'selarrow.png' => 'b8bd05491ab8b6796c01e9b8c54a7467', + ), + 'languages' => + array ( + 'English.php' => '886394355713facf26c16e029a2b9d7b', + ), + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'preview.jpg' => 'a9e7139c84a52e4b164c460a6428b317', + 'style.css' => '2520113be12170cc926299ac4ece598d', + 'theme.php' => '9e888e822f698fbb187bd602ec3ca7c4', + ), + 'templates' => + array ( + 'admin_template.php' => '57aec9f3ef5be669eb7fd47b3635a1b1', + 'banner_template.php' => '5c52f8c726bf4d8e2f843703c2bb24d4', + 'bbcode_template.php' => 'fe842867e0501311a9edd6363560fdaf', + 'comment_template.php' => 'be07b00f84a5fbbeeef3ad557294700d', + 'contact_template.php' => '7ac53206a020fa101c8ea0be32db6e75', + 'download_template.php' => 'da2e5aa05a326a17a976bf9d789dd509', + 'email_template.php' => '8fdbeb00322c889ebf52e43b5b58fb42', + 'footer_default.php' => '7178149c3035e2b16bb843eb0e9f529b', + 'fpw_template.php' => '8db941158070fc816be8111953b786fd', + 'header_default.php' => '958e7c6df8090617caa2d97277a4acff', + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'login_template.php' => '8952e4916524b95a3b3f75979e85a58c', + 'membersonly_template.php' => '14635660ab8f2daed92f4260ed0f3fa1', + 'online_template.php' => '0b98cb57967fb6a4d0015a8feb2ecd1c', + 'search_template.php' => '100782de2e0ac37b7286bc2a1f65a2c2', + 'signup_template.php' => '2ba1f894bbba7b332cace51b8dc6e31a', + 'sitedown_template.php' => '85de9cb71af3df0f6e3ef44386d67d6e', + 'trackback_template.php' => 'fd54d8c26c75f9d380e8ec90860b0107', + 'user_template.php' => '40a17b45d7aad1c613fadec6453d75a4', + 'userposts_template.php' => '6f9724081a0be3c5f974d16c92860c9d', + 'usersettings_template.php' => '20d0f1ac95d0abe28ada5a98e987b70d', + ), + 'vekna_blue' => + array ( + 'images' => + array ( + 'bg.gif' => '00b62b8cd66526297fcb79d3229eaa8d', + 'blank.gif' => '0e94b3486afb85d450b20ea1a6658cd7', + 'bullet2.gif' => '206da1d113ffa22ef1cd732e43885a33', + 'button.png' => 'd7b133daf7c18942c478780df09d177e', + 'cap.gif' => 'c63589fcc69d3ad5b10e13e562ac8aa6', + 'capleft.gif' => 'd4ff03746b118ec243f533208949f7e0', + 'caption.png' => '2e9177b9f59bb6f6c6748475506d0689', + 'fcap.png' => '450b53805e3dfaf9d999c2858c40aa60', + 'line_bg.gif' => 'ab28e1dd152e681ff434f2f7cd9a1a5d', + 'logo4.jpg' => 'db6d375e1ab289c531b5046ec4a54e10', + 'menu.png' => '782886f2b16869bc4377c7d2ca745fe2', + 'menu1.gif' => '9eede26903c3fe185aab6a221bd90659', + 'menubottom.png' => '2f54898aac2a907a1a0c530ce1ae36aa', + ), + 'languages' => + array ( + 'English.php' => 'ec72bdf5070bdc80cc485e6e2b8ec3a3', + ), + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'nav_menu.css' => '74b91306b957f69bc390ed612df76ac9', + 'preview.jpg' => 'fbb8bde5f9eb4f8efc39f85234959823', + 'style.css' => 'b11955766d34da3f5ee12aa7ca734655', + 'theme.php' => '4e523e4af469271fbfbe5527b8ea859a', + ), + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 'article.php' => 'ee3b7df97cb467d35263bedf589abf98', + 'backend.php' => '312552577f67c7965a76bda84b949a64', + 'banner.php' => '6328a170fd3ee6f75ebdd2472f3fb397', + 'class2.php' => '37696f5a30279e2ad8322862c788b067', + 'comment.php' => 'b75934b785dd22089fa9d0b2723916a9', + 'contact.php' => '77d372dad7c0a662b5dd837f8ce32228', + 'content.php' => '10e6c1a9e2180598f8edd8f49022f26b', + 'download.php' => '7be94c51d2d19953966d02c3f5e266de', + 'e107.htaccess' => 'c5e1ad68b41f947be285926c0f81d914', + 'e107_config.php' => 'd41d8cd98f00b204e9800998ecf8427e', + 'email.php' => 'c786469d105283c6735a62172bb63865', + 'error.php' => 'fe3ca6cc7b5947e43aead577a23128fe', + 'favicon.ico' => '5fceb78b9124ddae4027396d7cfcd328', + 'forum.php' => '3c10184d52685d7c9a6906a967b7e3d8', + 'forum_viewforum.php' => '4b9fcc3a820ed2f93b4dc707c3ebe3b4', + 'forum_viewtopic.php' => '5fea10d40850fd6f72cfbec7a328e120', + 'fpw.php' => 'd599b553d2bdd87520615addfb55b573', + 'gsitemap.php' => '4ebcfff3b23717454bb6b3538dd54565', + 'index.php' => '960de1b196ffa6e7887fe99ae65fa682', + 'links.php' => 'bed206fc2abe8f1307ef4db3b7fee63e', + 'login.php' => '6dbfe3d33ddd132cc85f5cb52b692f8c', + 'membersonly.php' => '0903a2ef48312a12ce81b2fa17fe0233', + 'news.php' => '39b13f3be2acd01f8f28fb1cbfcbfaf8', + 'online.php' => '947d1170bdc6cf524541d901f238f1a9', + 'page.php' => '75881aa5f0a3b478bd65feb353863af7', + 'print.php' => 'c115f1f57a0f6c691e5ce0e5b2d5b27a', + 'rate.php' => '19160ac5ab1600124219c2b61c9c4a12', + 'request.php' => '1cf6897842a4c804e33373e03c6b0ada', + 'robots.txt' => '118aadbc5395ee3d4c6fade187097e5a', + 'search.php' => '44bd9ed61fafe34b64a5d109ef2ec9d7', + 'signup.php' => '6cfcc3d5d9fd54add87a960cac1d2032', + 'sitedown.php' => '7a2d95fb0976ce5ab287a403b118acfa', + 'subcontent.php' => '468072ef82e179b6ed5ff20a4eb36225', + 'submitnews.php' => '090f7107c0f8c8636a84516a3cdfcfad', + 'top.php' => '26cae358e9c9a83bfa686832231a2718', + 'upload.php' => 'd7e5209dcd6f7964f0a6655e1f5ef8a5', + 'user.php' => 'bcbc7a76b14c83784949613b6bf61b3d', + 'userposts.php' => 'ffdb5e83f7f061ce19a376e5529c4a9d', + 'usersettings.php' => '44aea0d3fb8906c41c84a31ed5054c6d', +); + +$deprecated_image = array ( + $coredir['admin'] => + array ( + 'help' => + array ( + 'administrator.php' => '8d58e249f4c37c48ef3d0fb600db4c8f', + 'article.php' => '5eaec68b84cbbcbb34f2d970bea1c0b3', + 'banlist.php' => 'b841446435a2cb171968dafa9042444a', + 'cache.php' => '32619118102a53828749f6f5198377bb', + 'chatbox.php' => '64da6bf8536ba4a5f5fbdce91aef02ea', + 'content.php' => '9acd47fab88f17202b907dda61977762', + 'custommenu.php' => '23def1d72ae7dac360df9c3f710fdf55', + 'download.php' => 'd48ddda1acd7a6efe0de0787d6988a20', + 'downloads.php' => 'eb3a2a4d6c89ab2372d88c2999e8cd2a', + 'emoticon.php' => 'a1e9636fd7af1573aa4ba481b9c313b3', + 'filemanager.php' => '60c3a9f7c51c1c9d36c575508711f871', + 'forum.php' => 'bf299e990db850f86cdbcd42b9b3fd9c', + 'frontpage.php' => '3416ed1177991400b4aa82b10f91007d', + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'link_category.php' => '4f3852c20f1ef019d22b5760b5e063ae', + 'links.php' => '566b6088a236cb2c093b425ec9309d66', + 'list_menu_conf.php' => '44e687a1ff5df331a63ad6a4892eeeab', + 'log.php' => 'bdb15ca1b175923e93785220f7e5821c', + 'menus.php' => 'e89bffe7bc21b21201a2d768561c473b', + 'menus2.php' => 'ef44b977037e87afeb228279c78e3bb3', + 'meta.php' => '29760d902f4aa3dfb3881842664940e7', + 'news_category.php' => 'fc0954aaa4fff8f878641c4ad707f08a', + 'newsfeed.php' => 'a13915c726c3b5dec2b8899c7422db81', + 'newspost.php' => 'bb22746bfbbdfdd8d7e780105ef9e854', + 'poll.php' => '041fc9b4489b9d467acbba15cbc5b2df', + 'review.php' => 'cf0bf878836e63bb7f12bbd978c4d7f9', + 'ugflag.php' => '309b077d78f56125ce2cbceb056e537f', + 'updateadmin.php' => '2a51d30073923c6ca0128d63f71dae5a', + 'userclass2.php' => 'a60b4f7f2c72660f46b34307bfdf39c2', + 'users.php' => 'df0e3b9a6b200f37225fae370b5c198d', + 'wmessage.php' => '6eb398815b8165d5ffef65fd42a7922a', + ), + 'htmlarea' => + array ( + 'images' => + array ( + 'ed_about.gif' => '8892c7e4a559a6bb1b50e9009ddb1665', + 'ed_align_center.gif' => 'f3c560b8cd085dd249e4632107ad5e02', + 'ed_align_justify.gif' => 'e4fd3728dc374e0cfc24b07ea6be90fc', + 'ed_align_left.gif' => '3301e69399d07346067114647bb3dc33', + 'ed_align_right.gif' => '00950f054f71e69d9c30378e76bc12a2', + 'ed_blank.gif' => 'ca710933239efd41bbf4d1a3231240f4', + 'ed_charmap.gif' => 'cbdbb8c0c3a4ec3d285d1b45eaafd08b', + 'ed_color_bg.gif' => 'cc74713d087b0d0a1200016a1e197100', + 'ed_color_fg.gif' => '3640d2e5ca79aeebd72414c0b85fa3df', + 'ed_copy.gif' => '684b277b164596eca2e53c750d8b5b04', + 'ed_custom.gif' => '1ccd6155d74e1b19b4651994219a6615', + 'ed_cut.gif' => '220ce8bbe529bf3a092a9643e936bdd7', + 'ed_delete.gif' => '573745a746bf300916c73a19d0819ab2', + 'ed_format_bold.gif' => '520b80446acc7ff6021574295e0b2a81', + 'ed_format_italic.gif' => '944c91acc59d24f9769eca617ff9239d', + 'ed_format_strike.gif' => '1ba752cc9729f54bd87efe636dca247b', + 'ed_format_sub.gif' => 'f63ce7a2b86ffcf07dcbddc0aac9b9d7', + 'ed_format_sup.gif' => '7d1ab42fd5003dc07c1a17d6eac514d5', + 'ed_format_underline.gif' => '468b978544e8811fa3b0deef30741efd', + 'ed_help.gif' => 'f652d29123b5a2f24d70d9da3c9dc653', + 'ed_hr.gif' => 'ae6fa428e1f6cda1008a7f608825f6da', + 'ed_html.gif' => '9b32f161406de6bae7884a3391798042', + 'ed_image.gif' => '9a1f8c6fbcfb03efe900b90f41851792', + 'ed_indent_less.gif' => '46c4a489b08646a7f110c360b61be3bc', + 'ed_indent_more.gif' => '77506085135c4008d62cca50ad3feb20', + 'ed_link.gif' => 'adfb4f124a9cfcbaf1d5f2dde6194641', + 'ed_list_bullet.gif' => '1a49be730188f40a7878ec8b9cd03b06', + 'ed_list_num.gif' => '282b0624844fe048e7f8d180c254c2df', + 'ed_redo.gif' => 'e8f409bcd2a561274505fa79902d175f', + 'ed_undo.gif' => '9c6818077df01f6aa3b0113b0c195a88', + 'fullscreen_maximize.gif' => '361a5915db890026ed4280bc518e502f', + 'fullscreen_minimize.gif' => '08a51cc59af4c9c1e1cc77290f5f26ad', + 'insert_table.gif' => 'cc65036d9589d6183342e2eed294ff57', + ), + 'popups' => + array ( + 'about.html' => 'd66d35b6344ded6911fed96b61bd2cb9', + 'blank.html' => 'c83301425b2ad1d496473a5ff3d9ecca', + 'custom2.html' => '2ccb932916cc2696d5d1952d4d36eb13', + 'editor_help.html' => '7ca29d18f18c0040db5c3af15254d0e8', + 'fullscreen.html' => 'ec725d362b4bb338111e43e064faef37', + 'insert_image.html' => '8a06b1d93a6115f1ecc12ec2caf5749f', + 'insert_table.html' => '1562c8c3b40afcef1800e6b753f6b895', + 'old-fullscreen.html' => '0daa59e83fdb6b487c6502c5e6a2d42d', + 'old_insert_image.html' => '9482a4fbbea5a45558f2faaf83291f09', + 'popup.js' => '1fbb9698cd184cd3b7f61aa9ca0a6d17', + 'select_color.html' => 'd76a6a92c9660aeeee17fc3fa25fa184', + ), + 'dialog.js' => '45236d35186f82dbc2fab623f0406f60', + 'htmlarea-lang-en.js' => 'c512cf5dbbf3f3194ea314bdf4710c55', + 'htmlarea.css' => '6113c65492628800a361ccef432b829b', + 'htmlarea.js' => 'e33f5031dffdd23c855a054bda135502', + 'index.php' => '0ec862dc66ce060cc098cfd977709c9e', + 'license.txt' => '0cb5443ecf825c27b9e488adae9ac8b2', + ), + 'includes' => + array ( + ), + 'sql' => + array ( + 'db_update' => + array ( + 'table_update_603_rev6.php' => '8d86e635ec98ef9b86f3ee8d442f7402', + 'table_update_603_to_604.php' => 'b2e91946ffe089e60f26857c2065f352', + 'table_update_611_to_612.php' => 'ebc6d228d4f32dc709337d173e8e3e92', + ), + ), + 'chatbox.php' => '7e75a4fc9d8a70280cf3ea38a6957039', + 'custommenu.php' => 'a1bcab76003c2d7a26075c6dde92a2ea', + 'downloadOLD.php' => 'da13cde41db327d1a251bd02b4f11974', + 'download_.php' => '17e197e6094df8c6f70c9d6ee5d99cb5', + 'download_category.php' => '6f81e7b0d0fd7b8e1278bab935bcb431', + 'filetypes.php' => 'f951037335e993337792606cc1475cec', + 'forum.php' => '8fcecb7939d0e2f3776602f12f256d41', + 'forum_conf.php' => '59104f7a4e953f4935c82eaedc060931', + 'header_links.php' => '89b428327e178a5ec1cd590a8a5a5eea', + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'link_category.php' => 'a037103b28a327d7f68b179a6430e0cc', + 'linksOLD.php' => '97ea4f0610899f6f3892d4bf54f8fc57', + 'log.php' => '79f63402eb374a1756984f60511d13fd', + 'news_category.php' => 'f797eba058a27b2391eb25bd3cc185d9', + 'newsfeed.php' => '9b0566edc1f49895997f39a07b9037b1', + 'poll.php' => 'a2038a1b5a5f03b243ecd07ee5085181', + 'submenusgen.php' => 'cbb94c39c1a0640983700119686402ac', + 'submitnews.php' => '684139e60a097eb04be9767c49dd9985', + 'theme_prev.php' => '386420f2c1c731f23c7df91926443e72', + ), + $coredir['docs'] => + array ( + 'help' => + array ( + 'English' => + array ( + 'Articles' => '8bdb338ca53cd252f0d3f3a7ad511520', + 'Content' => '770d62fe3fa3c984956884553e85af2e', + ), + 'Administrators' => 'fde3f611512ac789609c80fc8a6f3609', + 'Articles' => 'b59d04443bec2260d4bed4ef013c94b4', + 'BBCode' => '33451916e62615ddeefb30103f570831', + 'Banlist' => '83a4c139037713c03d0999e28335c852', + 'Banners' => 'a1c096485e789b14c720b7c73b4ea7a2', + 'Cache' => '7fc85b1d45b8d7f3cf7b4866d3d37aa8', + 'Chatbox' => '5fa17c49db4bfef93729d2dac1fcc162', + 'Classes' => 'ea8b68f265aef007a9636443b7da3dc5', + 'Content' => '770d62fe3fa3c984956884553e85af2e', + 'Downloads' => '37399eb226ad7d1d729f68f65efc7b00', + 'Emoticons' => '14a0d74aea591e0f8d82577aff8fe979', + 'Errors' => '46381d88a2326ff760562fea385b2fd0', + 'Forums' => 'a2266bd5b818e1cf30168ac9053b7a59', + 'Front_Page' => '7df90a02713ecf9d6ff1c7f7f77cbcb0', + 'Help!' => 'cbbb887146e203d6e2cae27b17db7ff8', + 'Links' => '320eb08defa1360070a4f0c062e5fc84', + 'Maintainance' => 'cc818c06e047bba0e2c2349e954cfaf0', + 'Menus' => '44a53801c18ad52aa9e50c3b4fbfe241', + 'News' => 'e5ec6c8137c00916343f8f4f5084bfe7', + 'Preferences' => 'a089239dbffa47eba773c3c4f878d4b3', + 'Uploads' => '3db7011da6342cf030bb03f011706bb2', + 'Users' => 'd64be592aae221b66ca4d33b69056e7f', + 'Welcome_Message' => 'a3a7b26428d35d5ebb520e16ac6204da', + ), + 'ChangeLog_615.txt' => '0e4d3787cd2a3faf41c45d3b70311295', + ), + $coredir['files'] => + array ( + 'backend' => + array ( + 'news.txt' => 'd41d8cd98f00b204e9800998ecf8427e', + 'news.xml' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 'bbcode' => + array ( + ), + 'cache' => + array ( + ), + 'downloadimages' => + array ( + ), + 'downloads' => + array ( + ), + 'downloadthumbs' => + array ( + ), + 'images' => + array ( + ), + 'import' => + array ( + ), + 'misc' => + array ( + ), + 'public' => + array ( + 'avatars' => + array ( + 'null.txt' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + ), + 'resetcore' => + array ( + ), + 'shortcode' => + array ( + 'batch' => + array ( + ), + ), + 'default.css' => '54d8e232fe73969b593f71df2afd6995', + 'style.css' => 'd62b27257e32cc08296930879a6df478', + ), + $coredir['handlers'] => + array ( + 'calendar' => + array ( + 'language' => + array ( + ), + ), + 'htmlarea' => + array ( + 'examples' => + array ( + '2-areas.cgi' => 'c26028a87777a45e8792cf9939cd5464', + '2-areas.html' => 'df7d45c30d0825f9c450f38c5af60508', + 'character_map.html' => 'b064eb5c9586d743ec86ac54370ac61f', + 'context-menu.html' => 'fc0226d993ec92c2a9c98fb06002bda1', + 'core.html' => 'c0349e4a3810a822cbb01ce26019afcc', + 'css.html' => '90120b460e62b056e46a443d869b104f', + 'custom.css' => 'd841b6b070f3ae8e67e196ff2ee6c5fe', + 'dynamic.css' => '402fa7e28e0b0c2035520676cc4ff581', + 'dynamic_css.html' => '3bcdb4239b896d49ba2d32c329b54e74', + 'empty.html' => '4404eb82dbf03fd2825e0fcce3413769', + 'full-page.html' => '588ce9c643c645eb2b6cbe1dbbfc09fe', + 'fully-loaded.html' => '5d7c6ca8fa4927dbbb40fc604d856922', + 'images.html' => '9553c5838b7c90a33a0401084a7a0c46', + 'index.html' => 'e8fdc4fc45c34917aff59da5c7ff001d', + 'list-type.html' => '25df168ea209a4be5ea42f559683b96e', + 'pieng.png' => 'f8915fe3b221dd044a93782fc0d2f5f0', + 'remove-font-tags.html' => 'a0caff2e51ec7a7aad6e4cf2f6d12dd4', + 'spell-checker.html' => 'e50a13ee08206801e968270c72adac0b', + 'table-operations.html' => '3e14d124b11047df9e7ad3ef92c932cc', + 'test.cgi' => 'b6b0615fc550bfec4c5e5adb1c69cc6a', + ), + 'images' => + array ( + 'ed_about.gif' => 'e0c3a2d4938e92642abe88319c37a019', + 'ed_align_center.gif' => '419a7cac054b4b2dff1b9eab7a45b747', + 'ed_align_justify.gif' => '9c31aa4411277ca29c3419f8df7b8b1d', + 'ed_align_left.gif' => '9c22c00f4c67931140be15e59db6d517', + 'ed_align_right.gif' => '93862fdc7d08142fa419cbd0f6c66213', + 'ed_blank.gif' => '020874e9edcbcd0b514d1b30f14b18bb', + 'ed_charmap.gif' => 'a897a03f66ec432ed8e7cd26c3b5f88e', + 'ed_color_bg.gif' => 'c6e286fdfa3ba31ebed7f18b0ecc75b4', + 'ed_color_fg.gif' => 'c72e9bc079196ed7b089afa9593cd8a9', + 'ed_copy.gif' => 'cf622962955f521c5ae576797d1032f7', + 'ed_custom.gif' => 'e7b27a6808e66a8a301cbaf64eb8825a', + 'ed_cut.gif' => 'f512b15c53dea427a6173023b8945a87', + 'ed_delete.gif' => '79ac46c129cf5dc8b21c5c0d42151831', + 'ed_format_bold.gif' => 'f4f614c2cb06763fc3063c93f07cf415', + 'ed_format_italic.gif' => 'a800ad94ba742d72099073f0faeb2004', + 'ed_format_strike.gif' => '9aa5a079df34a4eedcc5c716c9386a74', + 'ed_format_sub.gif' => 'b16263bc5ca08886c978db99f4feea40', + 'ed_format_sup.gif' => 'cad7d563b915d56d38cb0ee680191a59', + 'ed_format_underline.gif' => '505a23f166dcb38cea34af16ce4dbb5c', + 'ed_help.gif' => 'e7fce3f8566622f3add66b5255948397', + 'ed_hr.gif' => 'ff70dd8f9cefacf143e7396dcf4f58b6', + 'ed_html.gif' => 'fa6e7d1b61493b607b61bd71bf1f36d5', + 'ed_image.gif' => '4ab7d43a45532267df831d0a8fc34d8c', + 'ed_indent_less.gif' => '850310807053467daa42cc8bba2fcbac', + 'ed_indent_more.gif' => '3835d1bdd22a011a5b22e23fcce75e9e', + 'ed_left_to_right.gif' => 'a0f9ecd9a146094c0265df9ab57e1dce', + 'ed_link.gif' => 'f04cb59f80844ac38e9ce9f2698ce7f9', + 'ed_list_bullet.gif' => '236b4559afbfec1d238a939b65ea9d0b', + 'ed_list_num.gif' => '48d3e7c2c5826371be37b608d33af15a', + 'ed_paste.gif' => '81e1666c11b6def84943d3fab3aeedfa', + 'ed_print.gif' => '9bd797173a2fa37bedeeabd5d47e25cc', + 'ed_redo.gif' => 'e9e8c51b9f00093a3f303f0bf2ce7e05', + 'ed_right_to_left.gif' => 'c644f85dfa635e265e6a8da8c7c06227', + 'ed_rmformat.gif' => '287498e569fb9a902e7cfc8dd634e449', + 'ed_save.gif' => '07ad6426b48b0f86cf0985a599c7ee95', + 'ed_save.png' => '0a17a62b278ba3554338d254c4e9af60', + 'ed_show_border.gif' => 'ae228363e7079002dd18dffad8d66c62', + 'ed_splitcel.gif' => '2c04da7e1c53d5c63aff4f80e5023b22', + 'ed_undo.gif' => 'b9ba819ac9e7700ca0a876dba2b81c39', + 'fullscreen_maximize.gif' => '2118040d93941f64f7a2096b2370d7c2', + 'fullscreen_minimize.gif' => '816c96e44ded878836292b80da38ac1b', + 'insert_table.gif' => '3a985dd81474a602d4318b67dc5023e2', + ), + 'lang' => + array ( + 'b5.js' => '447acabed5a028ed6130315d9c943de9', + 'ch.js' => '9ad4148575e696b826345faf9c104ecb', + 'cz.js' => '7e0d467e3c3f95365f07fcd57e9e6036', + 'da.js' => '4450a6f37a4619e067466157477e227b', + 'de.js' => '24be5c7286b694ec285fdd3e39430eb5', + 'ee.js' => 'cef8b2148ce28b55eafdd41a9479d29e', + 'el.js' => '49f2dd6d814083e200450934175e54ce', + 'en.js' => '67a44be798d52f8434b1d5db9afc0344', + 'es.js' => '465284bdda072f89c1aa381bd129d4eb', + 'fi.js' => '1648e59b0fc3e98b673e260c4c4f2b54', + 'fr.js' => '9c8d847c3c1384e36d115c0437036961', + 'gb.js' => 'b6ff9b489e34676feeb33c94d67e3c40', + 'he.js' => '5973c58ae6d3cf1a7e13d53968e2f8b5', + 'hu.js' => 'e4058a7d72a280f4d007b0cba7dba299', + 'it.js' => '48f677e19fcbbf3eb3e2f32e808e6195', + 'ja-euc.js' => '1937933840fe8a3f6c27850f9d1a6b15', + 'ja-jis.js' => '58f5669e271d2a9399ed4319b6a27563', + 'ja-sjis.js' => '1ce17214bec7f48f7c7fbc0cb14ae591', + 'ja-utf8.js' => '08eec318143c80b3f9d77c16e302c327', + 'lt.js' => '8b5d346a3a49d276b0d613dbd05babc7', + 'lv.js' => '1821f4505b4824daab558b8ab8456589', + 'nb.js' => 'fe892254acff2640f3e52d26839b936b', + 'nl.js' => '31994cf5b276689e361684336577611c', + 'no.js' => 'ddb7044ad152be38f496969473a1175c', + 'pl.js' => '9ec4ec413e44d1f372db4dc5d3117153', + 'pt_br.js' => '79ffb2703fc0e55e71e54842a86598bd', + 'ro.js' => 'cdbeac570a639c27ebddde2825352787', + 'ru.js' => 'd980179d51e134536810d69fbd48568b', + 'se.js' => 'eb12fb43788fd80aa4a60b7826ec01cb', + 'si.js' => '886456af4fc31dbcd830e796ef7f3912', + 'vn.js' => '8c6666b64ed1206242f30b0b7c47dd56', + ), + 'plugins' => + array ( + 'CSS' => + array ( + 'lang' => + array ( + 'en.js' => '8e6555db8565a1d7f048b6a18dde3fda', + ), + 'css.js' => '090411fa76b76164871cf2344a83816b', + ), + 'CharacterMap' => + array ( + 'img' => + array ( + 'ed_charmap.gif' => 'cbdbb8c0c3a4ec3d285d1b45eaafd08b', + ), + 'lang' => + array ( + 'de.js' => '4ed8e64697d6e02747eecff014fb37f9', + 'en.js' => 'ead2887475037b02a936253d02b69f3d', + ), + 'popups' => + array ( + 'select_character.html' => 'a04ca5324301728db4e709e1ba6b042a', + ), + 'character-map.js' => '45ca956159d003a48cc3f986d9b9378e', + 'makefile.xml' => 'd931cda0bf52a8924c8f7ae33c7b2c1f', + ), + 'ContextMenu' => + array ( + 'lang' => + array ( + 'de.js' => '4b2fce5f5d94db5a1a9e8d49b14f251f', + 'el.js' => 'f66150fc20a7710a38f06ca26aba56c0', + 'en.js' => '3cd3c38364df0fc5bf545c040b575bb6', + 'he.js' => '42160bd5787ff8ebb2db2eba0b3765ed', + 'nl.js' => 'be00a4d988b49422748508b18aaca0b7', + ), + '1.pl' => 'b6bf5f353d0a8855a1fd306b66cbe9c5', + 'context-menu.js' => '5a7c67297506ef28729e14a3473862b3', + 'makefile.xml' => '014bbd44792974fd68bedd459ad86916', + 'menu.css' => 'e9a7d8e58b8467c4aa2c21d78a3d55f5', + ), + 'EnterParagraphs' => + array ( + 'enter-paragraphs.js' => 'e07557b92190a5afb75a1947b54183f6', + ), + 'FullPage' => + array ( + 'img' => + array ( + 'docprop.gif' => '7d7b378ee76a7261839f1761747c92ca', + ), + 'lang' => + array ( + 'de.js' => 'f2521a052eb077cc4ca8bdac46b52318', + 'en.js' => 'a32a89a7d529980c4578ce41d5060a83', + 'he.js' => '4d7d7ac12427b8e83409f5a722b24a3c', + 'ro.js' => '70c749f56e054ee375d3071835bff971', + ), + 'popups' => + array ( + 'docprop.html' => 'd70ad91008772d4cfddc481047450388', + ), + 'full-page.js' => '64e3137a2797388a5f9c8997bc95254a', + 'test.html' => 'bc2dbd5b474b8ee25201bdf9d6111f2d', + ), + 'HtmlTidy' => + array ( + 'img' => + array ( + 'html-tidy.gif' => 'df7a4baa0a571884619ae7eb0c200bb7', + 'makefile.xml' => '51b266fe6e1c56194e882daff3cced7c', + ), + 'lang' => + array ( + 'en.js' => 'db675a7d0202b2fb278038b16fbf9cd2', + 'makefile.xml' => '093576d9af435ec31fd92da9bce1744a', + ), + 'README' => 'e72c09ecd15ee4288dd403ef47bf0622', + 'html-tidy-config.cfg' => '09ee92887f93971b1858f289427d441c', + 'html-tidy-logic.php' => '8f7236a0097cc58f8f72dadb20ab3604', + 'html-tidy.js' => '7b9e2fcfb2a25fd01ec420a67e32a858', + 'makefile.xml' => '7dd3abc3e30aa07ac4b0d18810dea63e', + ), + 'ImageManager' => + array ( + 'Classes' => + array ( + 'Files.php' => '2692b44b256a5bd27b675abb64250682', + 'GD.php' => 'f0b6c4522817f07ca95bc64f9a162599', + 'IM.php' => 'cba66d49670c9e1e3e12281c1e456999', + 'ImageEditor.php' => 'e88d5eb443de0968694d7c84231a0a02', + 'ImageManager.php' => '0c3d9e63708ad26239a03ac4b1b4319f', + 'NetPBM.php' => 'd13aae16707bca40d61c9603cfb8bb59', + 'Thumbnail.php' => '57b96ef8a203a79eefbc53c7aa32f79b', + 'Transform.php' => '70627a5e07fd7bb51c35d5407333f64b', + ), + 'assets' => + array ( + 'EditorContent.js' => '56ca6920dc7b98dc4e975cebb8790712', + 'ImageEditor.css' => '923a26cbde11cd05a2fe714d75d61edd', + 'dialog.js' => 'e418b7c77ee9f8bf01d100b3de63757f', + 'editor.css' => '0523943b213ec2edfd9f3562397ee24d', + 'editor.js' => '97844fb6bc700e8c832a6bd95b6dd92c', + 'editorFrame.css' => 'd585831ec0b2a9088755c5748d80ffd3', + 'editorFrame.js' => '7da85c65207fcb1a66add2105d3d140c', + 'hover.htc' => 'b8e7a2a9b05a94f4789ec220f4c688ab', + 'imagelist.css' => '73a0b0581fb0020a3f734334dc60cdca', + 'images.js' => 'a46d80c6482269737ea52879f92ba643', + 'manager.css' => '8889b7af3a1d994e472fdd2ebe69500a', + 'manager.js' => '4b1887eb16e3794e47b707feae04b58e', + 'popup.js' => 'ce11aaa2796994d1a931e4376951fe8d', + 'slider.js' => 'd8bf45b210537f1f220d3f7123c51160', + 'wz_jsgraphics.js' => '034e994a173372f31661f66cd84cdb95', + ), + 'img' => + array ( + '2x2.gif' => '889a061243a8d254b8a051f4c2e5888e', + '2x2_w.gif' => 'e602cc47d26909903907a1141736bc4b', + 'btnFolderNew.gif' => 'd36d09544ef41db8a3230d25735960c8', + 'btnFolderUp.gif' => '6ee5eb9556897ac23a6762645b9c98fc', + 'btn_cancel.gif' => 'a4f53f6cfd7fe94f243762224f9f9c19', + 'btn_ok.gif' => '9c9ef0692dc686d2f80f387821364454', + 'crop.gif' => '9423eb4e1b1887ae43479f322bf624c3', + 'default.gif' => 'fd81a1c481584f1b1f1166f29b9ca60a', + 'div.gif' => 'cf5b3b40af68e894b7e8daf38dc590f0', + 'dots.gif' => '1f1d5ee955a043ef4e32a1fb6908a9d6', + 'edit_active.gif' => 'dd9aef4d47d74d2fd0468b306b93c7eb', + 'edit_pencil.gif' => '3c1632099bd6d9f628d75cc945d65472', + 'edit_trash.gif' => '544f51af0afd7c03f89aaed3bd236bce', + 'folder.gif' => '6d3fe7d47b4a1f5788b755b9f41962fe', + 'hand.gif' => '228dec68bb9d3e4db8f892da48b82077', + 'islocked2.gif' => '9d20ae36b2ba9ecbff770e4905779725', + 'locked.gif' => 'b1da4d2161b8a50077caff0affde606a', + 'measure.gif' => 'b965f9dec293df5ff007e57a20da5862', + 'noimages.gif' => '8f1b20dfcbb76ea7eccaaa7dce7bd2e6', + 'rotate.gif' => '2e9f127ae49427d98a389f97e88b8302', + 'save.gif' => '0ef008540649f73357ccb9e11fb0c143', + 'scale.gif' => '7681e29865fd4206871bbf9ff78a0d6e', + 'spacer.gif' => '221d8352905f2c38b3cb2bd191d630b0', + 't_black.gif' => '56953a9124d388a2c36e1f40cc539776', + 't_white.gif' => '9448cc76491fdc49524d19c21fd7c81c', + 'unlocked.gif' => '180782c948e3dcc25efac3fdb4bc1f25', + 'unlocked2.gif' => '717ef4a83a86cfc967c64110efdeadf7', + ), + 'lang' => + array ( + 'en.js' => '878cc575e93b0209fe9f16765c9834bc', + ), + 'README.txt' => '1c6d282806895395a23e514c4f1066b5', + 'config.inc.php' => '03269e9ae6a4b70e123e990a605031e6', + 'editor.php' => '170e45516bfc45c5a826e430827e1119', + 'editorFrame.php' => '802917ce477b1acd1e76d42be9aa5f6a', + 'image-manager.js' => 'dc30741f304b2950d50e7b96e0d47611', + 'images.php' => 'f218b51d5e9fcc072c5d66315423bab8', + 'manager.php' => '71baed2d33b08b013ec8b9aeeb4e6077', + 'newFolder.html' => '767491c7e3685a684e0061a7127b2ee4', + 'thumbs.php' => 'dac30ffea29e6ce86cd4d00ffc5008cb', + ), + 'ListType' => + array ( + 'lang' => + array ( + 'de.js' => '48151b4536ffef96e950b967a5ad27b3', + 'en.js' => '3e2424f60d678219d71dd3c5992520b4', + ), + 'list-type.js' => '9ae3d27711d44a896a4994ead5ce0e28', + ), + 'SpellChecker' => + array ( + 'img' => + array ( + 'he-spell-check.gif' => 'a9691fd828640716a4824fd3687095cc', + 'spell-check.gif' => '45f87ae3a236a82a00590675ab45300e', + ), + 'lang' => + array ( + 'cz.js' => '423ea6b03dd929379d8c3c0e2a1b03a6', + 'da.js' => '497d53b6de504e815f21e0b52c4429be', + 'de.js' => '8e1cf54a88bfa8f1f1bae8901ec724d3', + 'en.js' => '377855eaba880269a2a806e1f410dbd7', + 'he.js' => 'ee5604c67403b7344bd8aab484993b74', + 'hu.js' => '2f79d9530b544abcc01c980066319b5e', + 'it.js' => 'b731ddc9bccc8b8b45862bc8af1fc03c', + 'nl.js' => '347cc6ab35dc6e52f078173aca6038cb', + 'ro.js' => '1cb27ad27005caa43d26fe038aca361e', + ), + 'readme-tech.html' => 'dbeb0b3677a42ec8d6ba93c74d80777d', + 'spell-check-logic.cgi' => '8a73715a7dfca8571e40f2a0c0ce73ca', + 'spell-check-style.css' => '6953de17403da48de1a429187892200f', + 'spell-check-ui.html' => '3af087688cd52a07b4baedee45d4a36a', + 'spell-check-ui.js' => 'a1567a45c985106c96c18e999dc56ffa', + 'spell-checker.js' => 'd922b5b20388fb3d73ab470c79fb2f4e', + ), + 'TableOperations' => + array ( + 'img' => + array ( + 'cell-delete.gif' => '7bfbe4bb08412b6933b9e4cb67279a50', + 'cell-insert-after.gif' => '0cfcc1080fe87476e80ee62a5e7c228e', + 'cell-insert-before.gif' => '90729f21741e8d1e6de6bda134b8e28d', + 'cell-merge.gif' => '643f7ce0bd58e09e9d33afb7bafcfb41', + 'cell-prop.gif' => 'd499211088027cb901d0e2110608b6ec', + 'cell-split.gif' => '5f2d042f04107d2b74e205c4bcd75bed', + 'col-delete.gif' => 'b7e7a41e9176c07af5a10ca2035019e1', + 'col-insert-after.gif' => '999e3fec40db7cff90fafc0ef9b67c90', + 'col-insert-before.gif' => 'bcbdc75b946ef3c67523e26105046731', + 'col-split.gif' => 'c0c535be91376e5f5a763c3bee9bcaab', + 'row-delete.gif' => '550b14813b04e8a1a49f2799bbf2ecae', + 'row-insert-above.gif' => '121b8897f46625b42a0626e98b428ea3', + 'row-insert-under.gif' => 'dad2c7e0d7b38f9982382c2925ca18a2', + 'row-prop.gif' => 'e6df91ff1129ca622afb11dd1d9eb693', + 'row-split.gif' => '42fea49dff83dd1437defdc43795e300', + 'table-prop.gif' => 'a0c6945eba87e40f753952c16f1e788a', + ), + 'lang' => + array ( + 'cz.js' => '891f6cf5b22f7a1c8dcbf039a3bc29cd', + 'da.js' => '6253788b287cd7069c02bce1c25458ab', + 'de.js' => '48a37c922d8b8fc7d93cfb20a50357c4', + 'el.js' => '342afc0caefe7e53ac753d6b8f2ed041', + 'en.js' => '0d42d10515c8be7601482beffd37eff9', + 'fi.js' => '5b8ee761a423e09cc360294f87e85c08', + 'he.js' => 'a1645eb3b8b5306c7046791fd0b4b6a3', + 'hu.js' => '971f436dce04d926c0835e93816b2912', + 'it.js' => 'e9f2d5f3d7ff32468dd44077ea21937e', + 'nl.js' => '7d1ec5afd720877120bb81f73ba0cf70', + 'no.js' => '8613a29c3174424b0bf9abee60352434', + 'ro.js' => 'a01f89c091380da4a56acd9acf06516e', + ), + 'table-operations.js' => '1b988f2a82430274492780b22a2bb7ba', + ), + ), + 'popups' => + array ( + 'ImageEditor' => + array ( + 'jscripts' => + array ( + 'EditorContent.js' => 'a0d5619dd3570cd2ecc8711d23aa36d6', + 'slider.js' => '3d58fd930085aa61cd9fb0e7bc81f01d', + 'wz_jsgraphics.js' => '034e994a173372f31661f66cd84cdb95', + ), + '2x2.gif' => '889a061243a8d254b8a051f4c2e5888e', + '2x2_w.gif' => 'e602cc47d26909903907a1141736bc4b', + 'GD.php' => 'ad14fd96ebf77707b3f177536c0b20f2', + 'IM.php' => 'fcf6c91de9af23e2cb297412df1590e0', + 'ImageEditor.css' => '923a26cbde11cd05a2fe714d75d61edd', + 'ImageEditor.php' => '2f8f8c4fbfb1b0b3cd02efec79652c23', + 'NetPBM.php' => 'aa5eefb655d68a94702d41ccf6ff7d7c', + 'Transform.php' => 'e6448a8d758d5afb6ca1af5e6bfc7910', + 'btn_cancel.gif' => 'a4f53f6cfd7fe94f243762224f9f9c19', + 'btn_ok.gif' => '9c9ef0692dc686d2f80f387821364454', + 'crop.gif' => '1a76734219b53116f4e9905ea2af2e23', + 'div.gif' => 'cf5b3b40af68e894b7e8daf38dc590f0', + 'hand.gif' => '228dec68bb9d3e4db8f892da48b82077', + 'load_image.php' => 'f155a3b259125b861528d09768ed858d', + 'locked.gif' => '9d20ae36b2ba9ecbff770e4905779725', + 'man_image.html' => '8f012c3475587bc082fe6b20d942069a', + 'rotate.gif' => '2e9f127ae49427d98a389f97e88b8302', + 'ruler.gif' => '53000656f017f2c128e86dd9f314e95f', + 'save.gif' => '0ef008540649f73357ccb9e11fb0c143', + 'scale.gif' => '0ea1e46cc5de3f04a2e83f7daf690a95', + 'spacer.gif' => '221d8352905f2c38b3cb2bd191d630b0', + 't_black.gif' => '9897846e47b0b7dc9fcd2b89e918dacb', + 't_white.gif' => '9448cc76491fdc49524d19c21fd7c81c', + 'test.html' => '691e4bb7755b5ae86538a8852b9fe759', + ), + 'ImageManager' => + array ( + 'btnBack.gif' => '551c98aa577cd1fc06c6703ec167d6e8', + 'btnFolderNew.gif' => 'd36d09544ef41db8a3230d25735960c8', + 'btnFolderUp.gif' => '6ee5eb9556897ac23a6762645b9c98fc', + 'config.inc.php' => '31d8cebc72d510e35cc1c53f496d6367', + 'config.inc_orig.php' => '87b4ab3f0e7d8ae6a4562730cfe987c7', + 'dots.gif' => '1f1d5ee955a043ef4e32a1fb6908a9d6', + 'edit_active.gif' => 'dd9aef4d47d74d2fd0468b306b93c7eb', + 'edit_pencil.gif' => '3c1632099bd6d9f628d75cc945d65472', + 'edit_trash.gif' => '80269e15cbb7187371493dfa52b6a53d', + 'folder.gif' => '6d3fe7d47b4a1f5788b755b9f41962fe', + 'images.php' => 'aa1010985b23d278667e33c5d212c14f', + 'loading.gif' => '3e131b006c211839150e2336691918f4', + 'locked.gif' => 'b1da4d2161b8a50077caff0affde606a', + 'newFolder.html' => 'd7a282c567c2d84c6bbd312645538a29', + 'noimages.gif' => '8f1b20dfcbb76ea7eccaaa7dce7bd2e6', + 'thumbs.php' => '2f721186a74b6a0ece248b667bdf915e', + 'unlocked.gif' => '180782c948e3dcc25efac3fdb4bc1f25', + 'uploading.gif' => '62d8e984849c9747f9a05de393e055be', + ), + 'Copy of insert_image.html' => '8a06b1d93a6115f1ecc12ec2caf5749f', + 'about.html' => '9c6c02a3a05707cfeb768b428f60516e', + 'blank.html' => 'c83301425b2ad1d496473a5ff3d9ecca', + 'custom2.html' => '2ccb932916cc2696d5d1952d4d36eb13', + 'editor_help.html' => '7ca29d18f18c0040db5c3af15254d0e8', + 'fullscreen.html' => '4d9d7c276363f212428b2ed15cf9d8a6', + 'images.php' => '3755c66145eba21cc2199d455e855d73', + 'insert_image.html' => 'e9db88c76c75487cdd5415525ff94444', + 'insert_image.php' => 'b024826624d558a4600659d20189738b', + 'insert_image2.php' => '8a06b1d93a6115f1ecc12ec2caf5749f', + 'insert_table.html' => '47057008bd2f8af99f40b64d69fc7101', + 'link.html' => 'c692e60fd034d33bfe452e014d99fdaa', + 'old-fullscreen.html' => '0daa59e83fdb6b487c6502c5e6a2d42d', + 'old_insert_image.html' => '9482a4fbbea5a45558f2faaf83291f09', + 'popup.js' => '8efbf716ae23676c4cd3bec5a6b8df46', + 'select_color.html' => 'c047474ad06f18557cd711c78bf86c4e', + ), + 'ChangeLog' => 'c68e0a92145cad1afd0738dc0875f7a8', + 'dialog.js' => 'd84853c01220bee8568dc68701ff5253', + 'htmlarea.css' => '327b488d20dacdbf5466532bc2f6cd5a', + 'htmlarea.inc.php' => 'ba73019f5bb7502c17fadeb92975cd59', + 'htmlarea.js' => '13e42f7db453422762ce64cee52bb8f0', + 'index.html' => 'dda9c564dbf0a33feb4535edf11f9110', + 'index.php' => 'e515b64e6a348436045ef89d78776c1c', + 'license.txt' => '9153c7000079a9f2f6441e6211a20689', + 'popupdiv.js' => '3363d6531f00951387d0094217fcd3f9', + 'popupwin.js' => 'b24c467ee42722fc061e262fe11a5b4c', + 'reference.html' => '8b3cd84619e5476e118fb2d6285eceb7', + 'release-notes.html' => '64d8c1087c9ae11062682129e1547fca', + 'test.css' => '0edee201158cd4a1ffecd1334afe63dd', + ), + 'javascript' => + array ( + 'sitemap.php' => 'edd37423c3218ff1c3d242198ebfb60e', + ), + 'parse' => + array ( + 'parse_avatar.php' => 'bc7d58d3b0d15e23e030920b9051e16e', + 'parse_emailto.php' => 'df63e9219382e8ea652dfc97b4a30ca4', + 'parse_menu.php' => 'e3fa890a733e4262cfe0ae82910a338a', + 'parse_picture.php' => '6fee5312651fb1f3b525a02ad1a7ac6a', + 'parse_profile.php' => '64f116088d3e55f9a82e62c930828561', + 'parse_username.php' => '986ffd8dd73ebc6685fa5b82b8119307', + ), + 'phpmailer' => + array ( + 'language' => + array ( + ), + ), + 'search' => + array ( + 'search_article.php' => '9bec55cc19fbce64f7985ca93306a0fa', + 'search_chatbox.php' => '0de05ea2574562e19a0686a5bb803e43', + 'search_content.php' => '7bb898d8278a238bb71cb8169b9ed2bc', + 'search_forum.php' => 'dcfeb61a2f830291b4bb8b5e0617554f', + 'search_links.php' => '9667c1e5eca93a0cb1610616c8acc329', + 'search_review.php' => '323c3b48ecc585e6270ad7e35cc9f1e0', + ), + 'sitemap' => + array ( + 'sitemap_articles.php' => 'cadc92c5c59b98157358d7aaafe2750e', + 'sitemap_content.php' => '51139ad22af3be101821fb95d192fb03', + 'sitemap_custom.php' => 'fcb7a1472051f94d26428654f76971b6', + 'sitemap_downloads.php' => '797820b44a3d942e7d01b0671f018238', + 'sitemap_forums.php' => '0ee814778c6e0bfb2dfc887b55de9285', + 'sitemap_links.php' => 'bf0baa44ab7bffa9b6edfb9d5d5d4879', + 'sitemap_members.php' => '9b69a90d417413a0f71526d6e86d45f6', + 'sitemap_news.php' => 'edbaecb0c53a67c70f18115fdf016929', + 'sitemap_plugin.php' => '8efa15ed27447e28c5da1575e4585419', + 'sitemap_reviews.php' => '2ed15c10e8d7cd03e4514483fae57a99', + 'sitemap_stats.php' => 'b6c748044f12a7ecfd7c3d954368cbde', + ), + 'textparse' => + array ( + 'basic.php' => 'c90c4c7f52e629fdbab1485fe1f5b6b6', + ), + 'tiny_mce' => + array ( + 'langs' => + array ( + 'ar.js' => '169d300416af7cdce6b654bd06ac2a06', + 'ca.js' => 'e054365bf2a065901d056b32b0a59e70', + 'cs.js' => '1d3a1ae555dbba9bb95d9ce840baadf3', + 'cy.js' => '870de31fc18bab817e6d2d7b4aa872db', + 'da.js' => 'cc247f4d1e6091c73cc7ecf4b4cb7593', + 'de.js' => 'e537b2b171cd2f23576b629ab19ffa45', + 'el.js' => 'c096fbf3106ea60a2853ae7b20837083', + 'es.js' => '722eafb047cf340d2b4b3634c9e21b7e', + 'fa.js' => '765b91b313f4a0f26d42484c77467435', + 'fi.js' => 'ccc8cb4f10b06859601658a90bbe345e', + 'fr.js' => '830a88badcbf0fc6945629fce64170c2', + 'fr_ca.js' => '6bea7226495c8206f636fa254941f76c', + 'he.js' => '85bae4a55d6394528f8cad5ff5ea8f99', + 'hu.js' => 'aadba22877f75ffe0da5aae7411ee555', + 'is.js' => 'ff7131f18d060c1d1067c34dda46e07f', + 'it.js' => 'e7916809ed09cb8b08183a26631852b8', + 'ja.js' => '218c57cf1200749edef223732cac282c', + 'ko.js' => 'f6c50cb6f13426a16676bde0b40b020a', + 'nb.js' => '14256f6008d426eb669e371c9cf34060', + 'nl.js' => '82569f5c2204acb05bc092dda323305f', + 'nn.js' => '8c5856fcd3202541c30761a0bbe95abb', + 'no.js' => '4d36ba827e1f9abd6cb9feb15ff57b08', + 'pl.js' => '1684ef7d0c56a3a8cb05c4aefb819433', + 'pt.js' => 'bc6ae838e0606cf3fbade874358cfb30', + 'ru.js' => '56c1ff2e73723c6f8fae848272328d4f', + 'sk.js' => '9e0bb7f1f7e24a341032200403cbaa33', + 'sv.js' => '903a021d9a56c081bb7f3c472da74cea', + 'th.js' => '7f64804bf3630e8f5f15de051babad84', + 'zh_cn.js' => '20a2d07cc1c450f17bd32628f05d893e', + ), + 'plugins' => + array ( + 'contextmenu' => + array ( + 'css' => + array ( + ), + 'images' => + array ( + ), + ), + 'emoticons' => + array ( + 'images' => + array ( + ), + 'langs' => + array ( + 'da.js' => '814c678d68b7846bd3cc7185293f4a1c', + 'es.js' => '5c5e44038d0d5083510970ed518093b0', + ), + ), + 'flash' => + array ( + 'css' => + array ( + 'content.css' => '9ae9f08d9748dc78ed6e0b33cd11e458', + 'flash.css' => '5ad8611160baa5f2198abb88baae38c9', + ), + 'images' => + array ( + 'flash.gif' => '709d9df69d8c2030e56321046d76ab8b', + ), + 'jscripts' => + array ( + 'flash.js' => '6b51cb8bf256f6ebc86e3a325475209b', + ), + 'langs' => + array ( + 'cs.js' => '50b2809eb2cd7801895d1e6e98a9c91b', + 'cy.js' => '5dcfd2755cddfcbe6351d4dbe6c6ac85', + 'da.js' => 'f2b72ffa4f64243f1c1d8e531ccd74b1', + 'de.js' => '5d238f5f9a261564e09a002cb5c93ff1', + 'en.js' => '52de748671eb0182b112111dbaa35e88', + 'es.js' => 'ec24f744a0c500a651db47fe579994be', + 'fa.js' => '14a0820203eea7f22856a2c8174f9636', + 'fr.js' => 'e489db910121ca476419966302177706', + 'fr_ca.js' => 'b6768e9d9b8f57a5e19e0bb0e108f84a', + 'he.js' => '39b200474cb83b04a48c2f07319930ca', + 'hu.js' => '846d4333e20d69b57cbee77b243f51ae', + 'is.js' => 'cf9e78d16351bdfe2423a208a82f1ed3', + 'nb.js' => '2f5c5fe3b2de8c401b0a0649f40e9dd6', + 'nl.js' => '3d95f1fbb0c52ed3b6d54968de5f6e01', + 'nn.js' => '25fc03ee93c77b1e98a2294cf6c333b8', + 'pl.js' => '057d4c9a766965d068c47807ffc65332', + 'pt_br.js' => '1792b9f671c47547cfe2dbb4ee22bdd4', + 'ru.js' => '7f292bd82c13f543a2cc9d2ce57920ad', + 'sk.js' => 'f45dc9dd2d9351d9ad37ddf080b40959', + 'sv.js' => '0dd9da08e68b78ce0832b75ddf7b0d7f', + 'zh_cn.js' => 'c5e6a82179266880d79b4626f965b108', + ), + 'editor_plugin.js' => 'd9a86e84d6de9a92c07caa14c32fa436', + 'editor_plugin_src.js' => '9f6d08f5269ffb3d107bbb382d1080ae', + 'flash.css' => '439d26d52ddf50dd5ac7d5fcb29a6e7d', + 'flash.htm' => 'c67139b142800773e99457bd880978e9', + ), + 'ibrowser' => + array ( + 'images' => + array ( + ), + 'langs' => + array ( + 'da.js' => '3394bc3500d94fa47fd39c17f0bbfcf9', + 'es.js' => '7b1df3446f8ccb76e80cfd9a5b13ed17', + 'nl.js' => '7004a5cd5e9e09d193d6742849dfb4ee', + 'pl.js' => '5bc48956a398ac86f36edb041a898a85', + 'sv.js' => 'b95727449ec9e4bd7c3774ae8ceef0ab', + ), + ), + 'iespell' => + array ( + 'images' => + array ( + ), + 'langs' => + array ( + 'cs.js' => 'a0f2834cbbd44d40490c11fe370f7756', + 'cy.js' => '8f7626778be315a6918f66e19a5ff8c4', + 'da.js' => 'cfc6d891c08e588b1461202d2568d7d6', + 'de.js' => '91728a57ef0ba20f25e47ee03b4866da', + 'el.js' => '3d65d19ee490b26fa1787bd8fbd35855', + 'es.js' => 'dd6eac9bdd597674c08d5daa9991d0fe', + 'fr.js' => '724009d0efaff99b88271c7f34ef1dfa', + 'fr_ca.js' => '54bbb38074a99afe3837478c49c0afc2', + 'he.js' => '3609aafd758034d56598706932ca4662', + 'hu.js' => '8b95913effa4e9d396fa734cdc6fe186', + 'is.js' => '777e6acb33acea76fce8b1109d74c693', + 'it.js' => '0de3c5e3e36d73e9f3b6ef6ed03ce5c9', + 'ko.js' => 'a08675987efeac4b71e024e6766d40d9', + 'nb.js' => '5d570071a5be75f3545dfbdc330bad6d', + 'nl.js' => 'd868734d3267d4889352a8411a3eb43f', + 'nn.js' => '8484fc2cdf334f00d461b6c64ef91287', + 'pl.js' => 'be72eef12fd4177e9283cf6083267079', + 'pt_br.js' => 'f18184638fe63e45cce421a0caa70a42', + 'ru.js' => 'cc1b970dd624041f208852864544ce67', + 'sk.js' => '6b8f43fac2a387024e35f8526f407598', + 'sv.js' => '9df8dd73b0ab656e8296b8a60969a2bd', + 'zh_cn.js' => 'fcfa956bf3fa2efc6ce5cb980399f4f8', + ), + ), + 'media' => + array ( + 'css' => + array ( + ), + 'images' => + array ( + ), + 'jscripts' => + array ( + ), + 'langs' => + array ( + ), + ), + 'table' => + array ( + 'css' => + array ( + ), + 'images' => + array ( + ), + 'jscripts' => + array ( + ), + 'langs' => + array ( + 'ar.js' => 'ae43b3e7e800feda0f3b30047e791e36', + 'cs.js' => 'cd74781764e126601991f523238b2997', + 'cy.js' => 'cdab2180c5e65051912c96cc88c86354', + 'da.js' => '6149f162722148ecf3876fb10b3e737e', + 'de.js' => '8cb4b9f7f1c94b051d781acb3da4d0d5', + 'el.js' => 'dcd0296a2b66bea7eb4014c5e499ae53', + 'es.js' => '438ea428f82d61c1ed95eaed346f97dc', + 'fa.js' => 'e64696a278069b4ea22bd952aaadfcaf', + 'fi.js' => 'fcf27030ae50526ae018dcfafa692002', + 'fr.js' => '8454709e737811f71a61c8774017da1f', + 'fr_ca.js' => 'dd198d47e8338b4988847cf2f8f811c5', + 'he.js' => 'ced8892be5250b25aefd41de3a23916d', + 'hu.js' => '7efabf89b76f57212804fa31854fb6dc', + 'is.js' => '0da0419d1bb98cd59afd434715233b54', + 'it.js' => 'a28c251cfd0f5a8dbc65b8b84d1468cb', + 'ja.js' => '383db7d235a1afa20b3ca79802f23919', + 'ko.js' => '69d5c2869ae41c037aff46e60c02aec9', + 'nb.js' => '797eb5494ea48a5365b289c17069543a', + 'nl.js' => '2891eccd7b5c22123246970a022098c8', + 'nn.js' => 'a48ff66d7505c209fa8ee6a27caf20a1', + 'no.js' => '5752ac40187c94adec44113a9876ed9e', + 'pl.js' => '59353b4a299e3b5469ed727be36495bd', + 'pt.js' => '17255ea9f80c38ee898cd6d4b52adf04', + 'ru.js' => 'c314078b00ff63c22709ce42e3b5ad82', + 'sk.js' => 'b4bfbc71af3b861f0e9afbb459ebddca', + 'sv.js' => '3cb350e825625d35ee56a240968978d5', + 'tw.js' => '460af4c883d0599602a396ac6df2291f', + 'zh_cn.js' => '5e66efd3b2631d9d8a4b6d465df4444a', + ), + ), + 'zoom' => + array ( + ), + ), + 'themes' => + array ( + 'advanced' => + array ( + 'css' => + array ( + ), + 'images' => + array ( + 'xp' => + array ( + ), + ), + 'jscripts' => + array ( + ), + 'langs' => + array ( + 'ar.js' => '6602819f1c11e5dfa03aa9351b6c6ed4', + 'ca.js' => 'fc23aa867a542b271be04c0c507cbf7a', + 'cs.js' => 'fa05040a48ef15b534bcfd559fcc5e2a', + 'cy.js' => '41d7e18bf59ea3656971025ce7ee2360', + 'da.js' => '2df17219dbd20b478ddf818e782bf884', + 'de.js' => 'dacdff80bdd36137be8c01e49f321dc0', + 'el.js' => 'fd252d3ec3b889b64e49f156e1cce056', + 'es.js' => '38f3298054a3c0eccef751738c29357e', + 'fa.js' => '7cba6a1fe0a72e6d7fff260e5434d509', + 'fi.js' => '05e023a47b125ad62b7ca756f11fca15', + 'fr.js' => 'dbdb8ed00240c5365184125e39d1db0d', + 'fr_ca.js' => 'db301661bb2a7e36d5a0fb287e6e2ed0', + 'he.js' => 'b16b9eb1c62dc0bdefd65c274da9ec9e', + 'hu.js' => '07f5bcee49de2e283f5cbaee4eaa391a', + 'is.js' => '7ebb7ccf6298e6f223c39c75852b4a2f', + 'it.js' => '5e517d045390ec97bd987d1f7fa55541', + 'ja.js' => '6b3ad91960606adfb97828a7f79b5764', + 'ko.js' => 'c922cb3ae02c588a318f75c3855866c0', + 'nb.js' => 'd53cf8e45eb484f6ea1262d1b43ff98b', + 'nl.js' => '2a72f399dfff3279b8796f5af6a04939', + 'nn.js' => '0209d5f5c5f26acd1aaa495e61ac4a6a', + 'no.js' => 'f246a2593152ca90c0849918d12bd12c', + 'pl.js' => 'a56af438b6dd4609168f023894de62ca', + 'pt.js' => 'e760ace435516ee6093bf9b83c7288db', + 'pt_br.js' => '068b915ccea56b2fd1f5b6284457e5ce', + 'ru.js' => 'f5286bf3ab6e283e096defa8bca3b21a', + 'sk.js' => '8e9eef23292200746c3f231b4ac2c19f', + 'sv.js' => 'e0e158d02e077f0bf8102d7a1657b5b9', + 'tw.js' => '69e5f2fe9dae27269c4a31a8245bb2c7', + 'zh_cn.js' => 'e9a1c3aeb41c08b7ee4bed86c3cc193b', + ), + ), + ), + 'utils' => + array ( + ), + ), + 'errorhandler_class.php' => 'b169b03bc392d49864077e8010abd800', + 'poll_class.php' => '006ed3500ada715d561997ab4bd0eb5e', + 'security_handler.php' => '5e858bf7b977021b74bfcc55c0d8f9f4', + 'shortcuts.php' => '49ef7425046fce13b1fcef4fea3dcd63', + 'submenus_handler.php' => 'b866789e832461178d2ab169b5158b6a', + 'user_extended.php' => '45646ad4a16d5ceafadf6565130d226b', + 'users.php' => 'bffb0d325569bbf3f0d946e226d834fa', + ), + $coredir['images'] => + array ( + 'admin_images' => + array ( + ), + 'avatars' => + array ( + ), + 'banners' => + array ( + 'e107.jpg' => '01982e7527b5dfab3b8634a0ab0bd75c', + ), + 'custom' => + array ( + ), + 'download_icons' => + array ( + 'admin.png' => 'a7376ea540f3ca4f721909bd0e6ae71b', + 'icon1.png' => 'e931689a5df4fc129cb7edf515504411', + 'icon2.png' => '861ef3bb6203bb98533f5e4ad01ead5e', + 'icon3.png' => '7178378df49945353c4cf6cd5e0f8622', + 'icon4.png' => '3f56677de2890d6db093b0091f8e5e35', + 'icon5.png' => '62de66653d9f686f7087ee7807fdcfd8', + 'star2.gif' => '6cb9803a392f283aa7761169df820809', + 'star4.gif' => '20c59fcebfc2ad7f416afa46752ec89f', + ), + 'emotes' => + array ( + 'default' => + array ( + ), + ), + 'emoticons' => + array ( + 'alien.png' => '6974b00de984da10b297e7fa9e628afa', + 'amazed.png' => 'c283684df103a5e20700f96a5f41cb3f', + 'angry.png' => '5ee786d3503d667e3f31682f1d7b37fa', + 'biglaugh.png' => '113ab7a2958863073fd293f201b2b7ab', + 'cheesey.png' => 'ce2406a7c0f680fee7a4980f2f01759b', + 'confused.png' => 'ce8d57a08d36ae2651fe9a3c36e7ccae', + 'cry.png' => 'af9f652ec6b891840fa16419b487b590', + 'dead.png' => '769a5a9cf3fec9ba2025e68a0694ddbc', + 'dodge.png' => '263141e145f83250115d57a384df93de', + 'frown.png' => '36cbe1f5dd7d96e4555716391dc26ecd', + 'gah.png' => 'ed1291107ee075f2878e046116ec8b6b', + 'grin.png' => '2eaf0c22aab303d555b937331d54de3a', + 'heart.png' => 'f481cd586397523f5a049ab0e3bb8b6c', + 'idea.png' => 'efdc92d75376071b4f26bc4d9079504a', + 'ill.png' => 'f31128acc9a7fcee11364906a62f99a4', + 'mad.png' => 'cc8e3a28a0fb31ff8835976cadb56438', + 'mistrust.png' => 'b8d139dac005d271ed1b772293be3004', + 'neutral.png' => '387cd29b21d0eceab935d3fb161dc1f3', + 'question.png' => '21d92683bb918283efdc68636a5249b2', + 'rolleyes.png' => '9f7d79a73089c2080e2bf1023507ab72', + 'sad.png' => '0e66d4ab21cf0010c9a6e2ffc94795ef', + 'shades.png' => '2bc442022d4bb9b99850e4fb7c0919ec', + 'shy.png' => '7d1fa9f1ebacd3bea124648efbcac26c', + 'smile.png' => '98412834fb8063733c819817150a6706', + 'special.png' => 'e802a5e499d0794ffc2e93c4eedb5f4c', + 'suprised.png' => 'a3813e582897e99a5f5980bc6048567a', + 'template.png' => '190417a4630f9e46eaa58eb782607fc5', + 'template1.png' => '3b8aeab390660d69fce24f4628f0e0e7', + 'template2.png' => '42f0eac79e6fc87adf652da6e3c0bf3f', + 'tongue.png' => 'cd2b96e084ef3df7ab15a366e2bb728e', + 'wink.png' => '4b057effb0ec0a0c38cc9267adc8e535', + ), + 'fileinspector' => + array ( + ), + 'filemanager' => + array ( + ), + 'forum' => + array ( + 'admin.png' => 'cdd0a7cbc97c39ceba3bae3bdc01eda2', + 'admin_delete.png' => '707ddc11a86975090610a76e8ad01923', + 'admin_edit.png' => 'a383175b504d64e64a84a21dda5c1619', + 'admin_lock.png' => '744c74fecf65bd64d4ee22681cf6bd11', + 'admin_move.png' => 'c892805676f983c34dbf308eeb2627c7', + 'admin_stick.png' => 'ef0bc1380cdbd26118c6c53272e46af6', + 'admin_unlock.png' => '1818d0d48dfe5f76c8bf3cee9d9e949c', + 'admin_unstick.png' => '8b57798a150aff163c35a9e2a7c1ff62', + 'aim.png' => 'bfd4c59a6cc8e1bb380520147657e58a', + 'announce.png' => '51274830e593a079d57c3213da0b97ab', + 'closed_small.png' => '23df1d00ed2742c32f08664b39ebe5e4', + 'delete.png' => 'b9fc374f973e51f45c80884b56cab7c0', + 'e.png' => '797612f8767a25e9a934580f7d778ef5', + 'edit.png' => 'dc9067455b48da0bbc50993a4217eedd', + 'email.png' => 'd954a0e84dcb099a5ece71ff181650db', + 'fcap.png' => '3d1b365a597132548eb9635b6bca040d', + 'fcap2.png' => '5f6f45697bc185d51f2c06d904642aad', + 'finfobar.png' => '71585c0c2d3340ece8cf769a135286b9', + 'icq.png' => '3ab7fe8b2bfcd5d1bc376caaa7d01969', + 'lev1.png' => '6f459327ecc4db1418087664ec99cd0d', + 'lev10.png' => '00fb85385b347b832cce42195c203000', + 'lev2.png' => '9c348bddca193d020328b9910a5618ef', + 'lev3.png' => 'c5baa56ed9d682b28f1ca823f75b69e6', + 'lev4.png' => '29a7bbedc1bfd1d7a36ccb6b4e679baf', + 'lev5.png' => 'de0edacf89d8013ec4d63619b0363abb', + 'lev6.png' => 'c939b5600c78d4f679fa1892f9b57a63', + 'lev7.png' => '57442dff53452b993d10397a393415e4', + 'lev8.png' => '6ab02457fabe0c8951b51c80a47ebb5e', + 'lev9.png' => '5197a5949253e509e4994cb2cbc0dc0d', + 'main_admin.png' => 'cfdb4442feb26d0031828a0f7424f6fd', + 'moderator.png' => '5c1772259c00d8aca7eda2bac696a826', + 'msn.png' => 'd1613fee04df9ac3bca9d2d0cceb0c7f', + 'new.png' => '2bbd79241cf8036164e9965055b6f8b3', + 'new_popular.gif' => '3c47023ff01dc15fb3a678cb21cf55ad', + 'new_small.png' => 'df5d599ecd2bdcc93d576d552b71a54c', + 'newthread.png' => '26fcf53b08097e354ef4d3516fb64c71', + 'newthread_alt.png' => '286f65b22c67f8edc8caabeb207acbd1', + 'nonew.png' => '5fe81217e3c6f672a4e2f2922ddbe1c6', + 'nonew_popular.gif' => 'bd77c2f2b42336d5690646d4006ea983', + 'nonew_small.png' => '2544ba225c65f82c7788b003edb2d1fe', + 'pm.png' => '75d5f1434923e1afa54f93dce494ba96', + 'post.png' => '5212304c8b38fb4033ddf691fd7b77ba', + 'post2.png' => '0f6cfe51518affb7a6baac798abd907b', + 'profile.png' => 'ed21e84603c3bcf82eb1820235c36075', + 'quote.png' => '579d14bfb1faabf191272938fae3ab65', + 'reply.png' => 'b260ec33dee1736c5a258567d117eb69', + 'reply_alt.png' => 'cfe83ef2927d9b7819a20fa62837a139', + 'report.png' => 'f5e4ecc39864c5a8a66cbc3cac33c3e9', + 'sticky.png' => 'c5bb0a20ef02bf8e52f3a93907804f20', + 'stickyclosed.png' => '810fb2dee4cf3d593f5a50031a52cde8', + 'template1.png' => 'feeb5c3f76438732948137e771def211', + 'template2.png' => '56b7b1d54b872c29042e523c9c043c63', + 'template3.png' => '66096ef11a4734f52cf06a624786678f', + 'template4.png' => 'f81e1772495061820f50ed16e489d7b2', + 'template5.png' => 'f5213d718fe9ad02d6040111c827e8ee', + 'template6.png' => 'f8319c599737e975bd05ad1890f77725', + 'template7.png' => 'a1d4f847a68fb991a1126d5c31bda6e5', + 'website.png' => '568b5e9dcc6fcc5067209e9390297162', + ), + 'generic' => + array ( + 'English' => + array ( + 'but_create.png' => 'fdd815c97c1f2b7cb6fbd579abd72937', + 'but_delete.png' => '7d0a9a0845029855b1ee3a2df49150f2', + ), + 'bbcode' => + array ( + ), + 'dark' => + array ( + ), + 'lite' => + array ( + ), + 'access.png' => 'f32777222ff51a9d7717a5d66c10417d', + 'admin.gif' => 'de326ebb9129598abcd207aeacbca61c', + 'aim.png' => 'c4c641053830a0b470763991e7e1b343', + 'article.png' => '4c1af0ea92374fcd32eb086f1e63d51b', + 'attach1.png' => '3f24d017495d3e59a8a18de11a23f63c', + 'banned.gif' => 'e944e98fc61c72d541437d58309d22d6', + 'bday.png' => 'b91ccd6511a34855d3da5ec55178ef32', + 'blankbutton.png' => '32718a34c4e4c62290e5dea6399aaf0c', + 'blocked.png' => '1227a11750b236543697c6b1f493951c', + 'broken.png' => 'ded230fd8afbd01c8647e287b78232fe', + 'chatlink.png' => 'b9579a8c1af6be726547edfc5cfc6eaf', + 'delete.png' => 'bbffdfd37ba4270e862a73d93b81769b', + 'down.gif' => '841d5d013c86f7cd61e06b978c5c65a2', + 'down.png' => 'd94fedebe97edf504f4e3611a831d2c2', + 'download.png' => 'd121e11e2b01e117e12ca1d9d4bfc8da', + 'download2.png' => '3fb794a0407283c91fa0f138f26722cb', + 'e107.gif' => 'fc919304a3df80991ec801f39baf3ba5', + 'e107.png' => '16751559410e5d868409898522df2cb4', + 'edit.png' => 'f009b77ab253590ace79a70cfeff566c', + 'email.png' => '36e771c8c0f3c5508cfb06d09a73133d', + 'extand2_ico.png' => 'd6cab6c391859427df70a1cf73a3f8b3', + 'extand_ico.png' => 'ef0dad81c4551e1cf4e5b92cc2682a42', + 'friend.gif' => 'b86a05be607fc371d4af747e6fed3991', + 'hme.png' => '18b3c9241db5836b5d5071ba45cb57a6', + 'hme2.png' => 'e7b5ced50260f1ae8d2fc27d11305fa0', + 'icq.png' => 'baba3fba52f76960e0917996509849ad', + 'installed.png' => '13e75fe21dbe487dfe4a70fd8b6a4b8e', + 'left.gif' => 'a33e2c78aec1bb670527e699bf09142d', + 'link.png' => '9e921ccc10fdb20e1272441a14bec6cb', + 'location.png' => 'b47fcee2cfd5e9d8428dbf0bd2279f43', + 'mainadmin.gif' => 'e2ea0c3a07ad3360b6dc3565fadb92c9', + 'move.png' => 'c38620b0e49020a0e509bb396629d98b', + 'msn.png' => 'cb6f3038694b1050815a3c0faea7105c', + 'new.png' => '19c5797308bdc437a7e612e0e0c36afe', + 'new_comments.png' => '02c972790cfb529b39567fb2d813fbe4', + 'newsdelete.png' => 'b108358657ce78bcd8a32bea790c5cef', + 'newsedit.png' => '7905b143e1a8614f58deba888cfa1831', + 'noaccess.png' => '1747d86cee75b592d74aa7657f37785e', + 'noinstall.png' => 'f89fe8f057694f93e4e163e4daf3de2e', + 'nonew_comments.png' => '7611b72fa10b37d8b25b42b82b7014d5', + 'not_verified.gif' => '157e88132e5f7e6df5c56857177b5938', + 'off.gif' => 'b7939422edcdf36818e632fba7fa4c42', + 'off.png' => '211ebf7f9f317c20c24f34267f4ffe2d', + 'placeholder.png' => 'b1b16f1feb58cc1c262f4728e710bce4', + 'plugin.png' => '918cf0e41e6c810a36ddfd88b1571e96', + 'printer.gif' => '8ac26fe4699decd7a018fcb9887ae04a', + 'right.gif' => '59521255e9b42ecddf5b5c196db3acd5', + 'rname.png' => 'd9602be8c82e8b9a439224b659ebbe40', + 'star1.gif' => 'c92689cfe71f7e6dafccb9f54664ab45', + 'star2.gif' => '6cb9803a392f283aa7761169df820809', + 'star3.gif' => 'fde817afe8d962061bfe6e7c1d36d784', + 'star4.gif' => '20c59fcebfc2ad7f416afa46752ec89f', + 'uninstalled.png' => '67b9d067ee7eccc0f6732d0e709413c9', + 'up.gif' => '733fe173358fbd482b5745a3e6b2bf3c', + 'up.png' => '2bfaa32e6b6c45767ff67961d7f6a758', + 'upgrade.png' => '8a2a682aa0a1713cb627275c1e371714', + 'user.png' => '2a791be6fdba60bd8ef16d04faf4e789', + ), + 'icons' => + array ( + ), + 'install' => + array ( + 'install1.png' => 'c5cdc95dcb566d3a06dd9491773cb915', + 'install2.png' => '3a4afe78d9167935869fd62c3e32e5c7', + ), + 'link_icons' => + array ( + 'admin.png' => 'a7376ea540f3ca4f721909bd0e6ae71b', + 'bullet2.gif' => '5fea13d481fc903ce05bfed57341e1c1', + 'icon1.png' => 'e931689a5df4fc129cb7edf515504411', + 'icon2.png' => '861ef3bb6203bb98533f5e4ad01ead5e', + 'icon3.png' => '7178378df49945353c4cf6cd5e0f8622', + 'icon4.png' => '3f56677de2890d6db093b0091f8e5e35', + 'icon5.png' => '62de66653d9f686f7087ee7807fdcfd8', + 'star2.gif' => '6cb9803a392f283aa7761169df820809', + 'star4.gif' => '20c59fcebfc2ad7f416afa46752ec89f', + ), + 'log' => + array ( + 'beos.png' => 'e81a347cde7806d403369acf5125c4fe', + 'explorer.png' => 'ad4b2066d1a13c4c3f01771684de08bc', + 'firebird.png' => 'aa7ab3a68f2321baccdda8c13d2ba051', + 'firefox.png' => '2b1b1ceb660b824b9dbffd7eeacf79bb', + 'freebsd.png' => '0cc1da48e638ee3549a53c459a0beaf1', + 'konqueror.png' => '086c6a2215282b93a0d827b9208709d8', + 'linux.png' => '336a3e40452886a7bfac345e8a261138', + 'lynx.png' => 'bf674cc89d48c3edca70148befacfc0c', + 'mac.png' => '3b5ceead951265dc1648d172fbdd6461', + 'mozilla.png' => '3bac9ec175a9a1210fe69133658e7a79', + 'netbsd.png' => '0cc1da48e638ee3549a53c459a0beaf1', + 'netcaptor.png' => '2e4d9005519f6ce2b393dfd5957b16f8', + 'netscape.png' => 'ef183a5383deb9cf83d90cde42efb24d', + 'openbsd.png' => '36a1043bb8aacd3ea0a85c5f4de3130a', + 'opera.png' => '8892071cd4ecb31298ec08373d1491dc', + 'robot.png' => '4af563ba21dd39f7d875f4e4af4f3d60', + 'spiders.png' => 'd74d7cf44e339255fbf66d5414f14db1', + 'sunos.png' => '455c936a67729dd85ebec12b9c6139eb', + 'unix.png' => 'eeddedaa7da41673f0ef6d3e60876dc0', + 'unknown.png' => 'ff386748bec43130392f50ddf6743d57', + 'unspecified.png' => 'ff386748bec43130392f50ddf6743d57', + 'web%20indexing%20robot.png' => '4af563ba21dd39f7d875f4e4af4f3d60', + 'windows.png' => '693b0f409fb73b8c688582cbf231de41', + ), + 'newsicons' => + array ( + 'admin.png' => 'a7376ea540f3ca4f721909bd0e6ae71b', + 'icon1.png' => 'e931689a5df4fc129cb7edf515504411', + 'icon2.png' => '861ef3bb6203bb98533f5e4ad01ead5e', + 'icon3.png' => '7178378df49945353c4cf6cd5e0f8622', + 'icon4.png' => '3f56677de2890d6db093b0091f8e5e35', + 'icon5.png' => '62de66653d9f686f7087ee7807fdcfd8', + 'null.txt' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 'newspost_images' => + array ( + ), + 'rate' => + array ( + 'box' => + array ( + ), + 'dark' => + array ( + ), + 'lite' => + array ( + ), + '1.png' => '4b0844d8edcb6f21a30ccd614ce1f681', + '2.png' => '78f9dddde6747afdfe4d2ae74809c48b', + '3.png' => '0d94d295b5f76d02a3667f314f2e2e16', + '4.png' => '6bec72f755855b0f4bcad657627f2c8b', + '5.png' => 'f5fcf4a03e0e8a873421453fe9c8faa6', + '6.png' => '5f5e7867a7ab294c254490a97dbdb5e0', + '7.png' => '2c7386cf7b32d110795ede44b0649db1', + '8.png' => 'd831f36e9da9569a3ee9fc76ca744ab8', + '9.png' => '06a1a321bc60f7964ff49201187b6d6e', + 'empty.png' => 'fba656dd42a4642df933475f41555579', + ), + 'user_icons' => + array ( + ), + 'logo3.png' => 'd4969f3e493bbf085b7b04db22fb66c3', + ), + 'e107_install' => + array ( + 'images' => + array ( + '01_bg.gif' => '50f03651c070e4138c97a4a7ee9e5339', + '01_bodybg.jpg' => 'ca5f9a092c397986fa10d5990023ab25', + '01_footer.jpg' => 'cf2f00b3e5a2aff05e70e728eb225cb4', + '01_hdot.gif' => '945bc76d6f25d2a32fafb0abe1933e1d', + '01_header01.jpg' => 'cb8f84e1d43a127604ea9b244ecab97e', + 'bar.jpg' => 'deb2fd16258227f5e99fee0074b764af', + 'bar2.gif' => 'eb85624e746f91fd33511783cccc92a6', + 'bar2edge.gif' => '6d273a53798e532091bd6354f1e39c60', + 'blank.gif' => '0e94b3486afb85d450b20ea1a6658cd7', + 'bottom.png' => '46e798abeb638c4f9540973d239b10e7', + 'bottomleft.png' => '3db4e800cc8add7f4f360c5f055aba49', + 'bottomright.png' => '28a54110d855fd47380cf094d6b7b169', + 'bullet1.gif' => 'f3e084e73fc80fea93ee8e11ffef4739', + 'bullet2.gif' => '5fea13d481fc903ce05bfed57341e1c1', + 'button.png' => '69918234a9caea763d1c66781e50fe34', + 'cap1.png' => 'c58d5a7a23bb01572a51ca806cf244e0', + 'capdark.png' => '968732d5e5ddfa288f59af2c47f5d4d7', + 'capleft.png' => 'a1af1a726e1aee5e6e9822b9ccba1a48', + 'caplight.png' => '159e80e78ab67ceb935eb084d8dc51ff', + 'capright.png' => '57e7b70a495978f5de9575e826cd7878', + 'captransition.png' => 'f762ef589c33ff9695bf4731eaf23738', + 'fcap.png' => 'fabf58910351f1f742dee108b60517b8', + 'fcap2.png' => '777e56bcaf32e29ad505df49f3cb6019', + 'left.png' => 'a7755093080be75e9430072bd3bb32b3', + 'pspbrwse.jbf' => 'e84c6e90a5babd91ff1705cdd904a60c', + 'right.png' => '1dc657e1d9065920653132f3a85d77ed', + 'temp.png' => '35e34c98922cf2df737eef3cec806af2', + 'top.png' => '75b4e22fcbe8059bf217690e08c265ac', + 'topleft.png' => '8b45a5185fa619c3d336e1ceb618bc81', + 'topright.png' => '1c6d6e49a6d9d173ec12f2baed2f45a8', + ), + 'defaults.php' => 'd74f7f56a35eaba3a446d0d7b9ece61e', + 'forms_class.php' => 'cab82e1076617e73b142f89e589e6302', + 'index.html' => 'd41d8cd98f00b204e9800998ecf8427e', + 'install_template_class.php' => '85720230062e45ca3e6c190a865db9a1', + 'installer_handling_class.php' => '43abe84e4f29d084e5aeb58f048585b3', + 'installer_template.html' => '7c5c280e54ef3ffb337143513dbefdcf', + 'style.css' => '78939dd07a01f44a78bb95f58e7999e5', + 'writable_file_list.txt' => '65391cea1b3218eee4fc5e3535c4b6eb', + ), + $coredir['languages'] => + array ( + 'Danish' => + array ( + 'lan_install.php' => '7106553eaeb91ce1f59d0108dac9d579', + ), + 'Dutch' => + array ( + 'lan_install.php' => '1670683dbb0fb0d17f932ae81940a416', + ), + 'English' => + array ( + 'admin' => + array ( + 'help' => + array ( + 'log.php' => '553fd4414b98f4aa5f0f6e1f8f7b0ad6', + ), + 'lan_admin.php.bak' => 'c8bd5eb16d7834de1975b2ac3cd301e3', + 'lan_article.php' => '78d8dba28058eb99e32fc670fed68f34', + 'lan_chatbox.php' => 'dc7462a5fb63958528d842662b0c0d4c', + 'lan_content.php' => '4b4dd166785d89b717ca41602e4908de', + 'lan_custommenu.php' => 'fca295a0aaca7e6dc6ea2b07d3ab8474', + 'lan_download_category.php' => '868e2a17778c821e21579b28c8e8db85', + 'lan_forum.php' => '3ab28d049e7ef2900dd601deb02ab693', + 'lan_forum_conf.php' => '208dd010683d2894d17ab734d712a270', + 'lan_link_category.php' => '4dff35a95718cc5cffee64fc635dc19e', + 'lan_log.php' => '6bf26c44f7553beeb8ce574de27dc29e', + 'lan_news_category.php' => '5337d8c36701776b22c27182a258e690', + 'lan_newsfeed.php' => 'bba9d1991b304ee031ac8f4339aa6a61', + 'lan_poll.php' => '9bedcde5926715eede2f03afcff20a67', + 'lan_review.php' => '36820722f27e35f1fe10edf238a13d93', + 'lan_submenusgen.php' => '40af0cbb4906703d1fc5d29d7f2790e4', + 'lan_submitnews.php' => '595ca7b58df223022b3f7bd44e8238f4', + 'lan_theme_prev.php' => '003c8edea2f4b757347a231cd61868ba', + 'lan_theme_prev.phpOLD' => 'af65c38f8c4bc38654b6fcddc83b2a29', + ), + 'lan_article.php' => '7cb2200110e779d2be72b32b5adae9e4', + 'lan_chat.php' => '1216025ec3eb4295cb7b7920d9c6d5f4', + 'lan_content.php' => '175020e7d6e637c7c560c7b710e7da67', + 'lan_forum.php' => 'ca5e1c87b06b0b4c76aa17222a2049b9', + 'lan_forum_post.php' => 'e354153441043fabd0cdd6ed99be37a7', + 'lan_forum_viewforum.php' => 'ae655efbf1d88f64a6f9436894767a64', + 'lan_forum_viewtopic.php' => 'dc93aa81babfe0ee610d559d70f8681a', + 'lan_install.php' => '6182909e4053d2da395298e4ca73323a', + 'lan_oldpolls.php' => '64379ca9ff42aaf1873b93bc41627fa7', + 'lan_request.php' => '023a40948ec32b3359e9a5bae2b04f71', + 'lan_sitemap.php' => '7d926f3eb3c81ed747a6682d4a9048a5', + 'lan_stats.php' => 'f9058e0cd84a315f694618e2edf94d94', + 'lan_subcontent.php' => '8307d6e57a66ad7df8a57777c1fdcb36', + ), + 'Finnish' => + array ( + 'lan_install.php' => '0f5a7f1603a519ee4456ec9fa1e7f8f9', + ), + 'French' => + array ( + 'lan_install.php' => '74ad3fd72cca13f1968785a89b6a09ad', + ), + 'German' => + array ( + 'lan_install.php' => 'c0e03443e52be1a6492e5b65776df1aa', + ), + 'Hebrew' => + array ( + 'lan_install.php' => '6f5fe3b0b3ba23463026f873453c98ab', + ), + 'Portugese' => + array ( + 'lan_install.php' => 'bfd10a1c0d92d1d5094a63d64aa9a809', + ), + 'Portugese - Brazilian' => + array ( + 'lan_install.php' => '4dcb400544c4cf60bf640d2418e15908', + ), + 'Russian' => + array ( + 'lan_install.php' => 'a99ce749efb53953f0121c71a88c9ae4', + ), + ), + $coredir['plugins'] => + array ( + 'admin_menu' => + array ( + 'languages' => + array ( + 'English.php' => '9cc7dc759d47e98f86d2223097fb6dd8', + ), + '.#admin_menu.php.1.1' => '996aec68e661d293d168721272bdeb79', + ), + 'alt_auth' => + array ( + 'images' => + array ( + ), + 'languages' => + array ( + 'English' => + array ( + ), + 'ldap_auth_English.php' => '8553f2510a8f44e048e75b0caad969f6', + ), + ), + 'alt_news' => + array ( + ), + 'articles_menu' => + array ( + 'languages' => + array ( + 'English.php' => '559ed80821be94dbbae47b244dbd837d', + ), + 'articles_menu.php' => 'fd15a3ca2e31528a95fc99184e440f63', + 'articles_menu.phpOLD' => '879325102370b1fe12e4d7ccdfbb02a2', + 'config.php' => '00b67a915d74fc094e077ea4466f7c2f', + 'config.phpMAIN' => 'e72301f4e60ede3df654b0a32ffd07c1', + ), + 'backend_menu' => + array ( + 'languages' => + array ( + 'English.php' => '2ceeff0b4fd187b6bc41f2c4112bec77', + ), + 'backend_menu.php' => '3518985b836c9d8a0ba41966452d704d', + ), + 'banner_menu' => + array ( + 'languages' => + array ( + ), + ), + 'blogcalendar_menu' => + array ( + 'languages' => + array ( + 'Dutch.php' => 'a5a25231f132dfe4b7f691e4ffeb684f', + ), + ), + 'calendar_menu' => + array ( + 'images' => + array ( + ), + 'languages' => + array ( + ), + 'log' => + array ( + ), + 'search' => + array ( + ), + 'calendar_menu.crc.gz' => '90580c372c43234e82c73fe1687611d4', + 'config.php' => '401d559f53265f4b1778701b8e9dd512', + 'readme.rtf' => '47f6de1137030fe2efde782133ab725f', + ), + 'chatbox_menu' => + array ( + 'images' => + array ( + ), + 'languages' => + array ( + 'English' => + array ( + ), + 'English.php' => '89c8271c28118aae2dbbe8f35adc9f9f', + ), + 'search' => + array ( + ), + ), + 'clock_menu' => + array ( + 'languages' => + array ( + 'admin' => + array ( + ), + ), + ), + 'comment_menu' => + array ( + 'languages' => + array ( + ), + ), + 'compliance_menu' => + array ( + 'images' => + array ( + ), + 'languages' => + array ( + ), + ), + 'content' => + array ( + 'handlers' => + array ( + ), + 'images' => + array ( + 'cat' => + array ( + 16 => + array ( + ), + 48 => + array ( + ), + ), + 'file' => + array ( + 'tmp' => + array ( + ), + ), + 'icon' => + array ( + 'tmp' => + array ( + ), + ), + 'image' => + array ( + 'tmp' => + array ( + ), + ), + 'redo.png' => 'df3dd61d416b00c26d3cbcdf02e862b4', + ), + 'languages' => + array ( + 'English' => + array ( + ), + ), + 'menus' => + array ( + ), + 'search' => + array ( + ), + 'templates' => + array ( + 'default' => + array ( + ), + ), + ), + 'counter_menu' => + array ( + 'languages' => + array ( + ), + ), + 'custom' => + array ( + 'Readme.txt' => '2a5a677029c6a1ff8f31f3cd24452386', + ), + 'custompages' => + array ( + 'Readme.txt' => 'fe1235ad725e996d9f123fdb4e4c13e8', + ), + 'fader_menu' => + array ( + 'images' => + array ( + 'logo.png' => 'bcaf473988c4b267a7dcf56949a452eb', + ), + 'languages' => + array ( + 'English.php' => '33f3cf5b3c8706af602ed4cb3c81db9c', + ), + 'config.php' => '0aabe62b3e1611c441e9a2c2114cd5cf', + 'fader_menu.php' => '66caa671ec5bafd3fe27b4d2b5e4f6d9', + 'plugin.php' => '242e63190113a2aa45358d7cb3b7535c', + ), + 'featurebox' => + array ( + 'images' => + array ( + ), + 'languages' => + array ( + ), + 'templates' => + array ( + ), + ), + 'forum' => + array ( + 'images' => + array ( + 'dark' => + array ( + ), + 'lite' => + array ( + ), + ), + 'languages' => + array ( + 'English' => + array ( + ), + ), + 'search' => + array ( + ), + 'templates' => + array ( + ), + ), + 'gsitemap' => + array ( + 'images' => + array ( + ), + 'languages' => + array ( + ), + ), + 'headlines_menu' => + array ( + 'languages' => + array ( + 'English.php' => '2829e43dff89716317f5e07b2c9be60b', + ), + 'headlines_menu.php' => 'ab3e7718b4bdc0692766939d1cce00bc', + ), + 'integrity_check' => + array ( + 'crc' => + array ( + 'core_v0.603brevision #6.crc.gz' => '951d6ff1eb9b511e9de413fda1025fd0', + 'core_v0.604b0.crc.gz' => '1b1d32dcd6b5748f5f61c1ae3ed75f60', + 'core_v0.605b0.crc.gz' => 'cfcbd7b968e01b4d7085b993c2edc2fd', + 'core_v0.606b0.crc.gz' => 'a507b39e47b6bd4da410800674f18b0e', + 'core_v0.607b0.crc.gz' => 'd462a23b24951c04630d98fbdaaa303e', + 'core_v0.608b0.crc.gz' => '8d28c1a7ed767f3b1f37fc2e5d42a7c4', + 'core_v0.609b0.crc.gz' => '619d9fb859dcebee7335b107df732989', + 'core_v0.610b0.crc.gz' => '40b629b94d1942330c3d6a00d9eb3928', + 'core_v0.611b0.crc.gz' => 'd2fa16d9224fe1582e926dab65fd7974', + 'core_v0.612b0.crc.gz' => '417f80d506105f093852f6ac444401d8', + 'core_v0.613b0.crc.gz' => '10ee72857c69cee04b32c9713d0854ee', + 'core_v0.614b0.crc.gz' => '8dc89467864a96ba78930ed1a8be086f', + 'core_v0.616b0.crc.gz' => 'ff549280c337968ac0ba94797a8713c6', + 'core_v0.617b20040917.crc.gz' => '772181b8a467cb436be8e70b5d792e36', + ), + 'images' => + array ( + ), + 'languages' => + array ( + 'German.php' => 'e89edc419022cf2407fb101d3eab899f', + ), + 'do_core_file.php' => 'fac13bd2f065a031c59841ab4cb7074e', + 'integrity_check.crc.gz' => 'd5cec3024c3e3a0be2cca541bd60d179', + 'integrity_check.php' => '49d5a8fa37a78f8716cb5e86d77337c0', + ), + 'lastseen' => + array ( + 'languages' => + array ( + ), + ), + 'links_page' => + array ( + 'cat_images' => + array ( + ), + 'images' => + array ( + ), + 'languages' => + array ( + ), + 'link_images' => + array ( + ), + 'search' => + array ( + ), + ), + 'linkwords' => + array ( + 'images' => + array ( + ), + 'languages' => + array ( + ), + ), + 'list_new' => + array ( + 'icon' => + array ( + ), + 'images' => + array ( + ), + 'languages' => + array ( + ), + 'section' => + array ( + ), + 'new.php' => '8c374be27e41a4318f68e707021ff984', + ), + 'log' => + array ( + 'images' => + array ( + 'trans.gif' => '39bc952559e5a8f4e84ba035fb2f7390', + ), + 'languages' => + array ( + 'admin' => + array ( + ), + ), + 'logs' => + array ( + ), + ), + 'login_menu' => + array ( + 'languages' => + array ( + ), + ), + 'newforumposts_main' => + array ( + 'images' => + array ( + ), + 'languages' => + array ( + ), + 'config.php' => '276457a4bf2fa83ea6562797782310a6', + ), + 'newforumposts_menu' => + array ( + 'languages' => + array ( + 'English.php' => '693095a9bd834689047de027f5e0cbbd', + ), + 'config.php' => 'f01b9da7574412da71f6182494f33e1a', + 'newforumposts_menu.php' => '2cccc461e0dcea560a8d60cbf6923cb8', + ), + 'newsfeed' => + array ( + 'images' => + array ( + ), + 'languages' => + array ( + ), + 'templates' => + array ( + ), + ), + 'newsletter' => + array ( + 'images' => + array ( + ), + 'languages' => + array ( + ), + ), + 'online_extended_menu' => + array ( + 'images' => + array ( + ), + 'languages' => + array ( + ), + ), + 'online_menu' => + array ( + 'languages' => + array ( + ), + ), + 'other_news_menu' => + array ( + 'languages' => + array ( + ), + ), + 'pdf' => + array ( + 'font' => + array ( + 'makefont' => + array ( + ), + ), + 'images' => + array ( + ), + 'languages' => + array ( + ), + ), + 'pm' => + array ( + 'attachments' => + array ( + ), + 'images' => + array ( + ), + 'languages' => + array ( + 'admin' => + array ( + ), + ), + ), + 'pm_menu' => + array ( + 'images' => + array ( + 'icon_pm.png' => '2912f05d43fd9f1aa7e5561f01f03d49', + 'new.png' => '2bbd79241cf8036164e9965055b6f8b3', + 'newpm.gif' => '4d16f5fbaa8e76067053c8c901972bc4', + 'nonew.png' => '5fe81217e3c6f672a4e2f2922ddbe1c6', + ), + 'languages' => + array ( + 'admin' => + array ( + 'Dutch.php' => 'deaec186998741c967926a2b4a2c8883', + 'English.php' => '48e55f333c6cce298d8d42d23ac1ea86', + 'French.php' => 'afada3c05cd276a42b3ea2c0143cc4eb', + 'Hebrew.php' => '99a11d649976ca09269ba710331692a1', + 'Hungarian.php' => '24c9bee3429ab4cb0310dbf53bdf46a7', + 'Lithuanian.php' => '46ff3c0d24248c463bc1d4565ed8ae60', + 'Swedish.php' => '36db180754f4fc798d801b809afb30c6', + ), + 'Danish.php' => '0fd270f1290f030df0923b51c8e758d5', + 'Dutch.php' => '70c30863dc1e573e57b29e7ea833fe86', + 'English.php' => '3a1f134f8dfab0d6e9bd01affac61360', + 'French.php' => '95edb5e8ee1adbef13968f678013a1c7', + 'German.php' => '9777ec58ad0ba9749bf67a6fc90aad92', + 'Hebrew.php' => 'f924ee08fd163ca1b5d8a0971c37350a', + 'Hungarian.php' => '0bc057bb44fe3472db8782edbba65152', + 'Icelandic.php' => 'fd660d11befa4952c4389e119311552c', + 'Italian.php' => '5b1d9585320a00d8dc302c6b1d152dd2', + 'Lithuanian.php' => '6de02c868fcf76f6eafa4d286139f51e', + 'Swedish.php' => '89c03081c1f1bd395d8ef118034205f3', + 'Turkish.php' => '8c3f69574f0a1b7967942bcccd81ce63', + ), + 'parse' => + array ( + 'parse_sendpm.php' => '684f65074a3c163bff33ceee2f60d77f', + ), + 'help.php' => '05353ac9d91d7a289b949cd221209391', + 'parser.php' => 'a3b9072ded8b976ec8e6a39fb1ec62a1', + 'plugin.php' => 'e00be629dba8699c216a32717499e4c6', + 'pm.php' => '854e2027e899d6fe2f61c34b4ec7c231', + 'pm_class.php' => 'ceb78bfec4fa5d4858f3c6bdd96518f6', + 'pm_conf.php' => '6356e8c2401e0f56bf3c2d765fc22c7e', + 'pm_finduser.php' => 'f0f76ad2058a553e71565a514d5e5792', + 'pm_inc.php' => '884be6eeb255e9896af2df673ed11838', + 'pm_menu.php' => 'c0cb0fdf9a22d73ec4c296181a63bb9b', + 'pm_readme.txt' => 'f8a601545af5083601733d9b2f317185', + 'pm_sql.php' => '3bf115628a81235de959588024d9b06d', + ), + 'poll' => + array ( + 'images' => + array ( + ), + 'languages' => + array ( + ), + 'search' => + array ( + ), + 'templates' => + array ( + ), + ), + 'poll_menu' => + array ( + 'languages' => + array ( + 'English.php' => '75af431da617ae283526e043ba4f3c02', + ), + 'poll_menu.php' => 'c2da89e8e0917e9fdc6d472c8427eade', + ), + 'powered_by_menu' => + array ( + 'languages' => + array ( + ), + ), + 'review_menu' => + array ( + 'languages' => + array ( + 'English.php' => '7593a048368d0addb3e47bddc9026067', + ), + 'config.php' => '3775094f836031f6027990847d9ebef2', + 'review_menu.php' => '70f03130e54f35d210a4eb1c8419ce51', + ), + 'rss_menu' => + array ( + 'images' => + array ( + ), + 'languages' => + array ( + ), + 'rss_meta.php' => '7205d95791b223ce785e95b0fda76c5a', + ), + 'search_menu' => + array ( + 'images' => + array ( + ), + 'languages' => + array ( + ), + ), + 'sitebutton_menu' => + array ( + 'languages' => + array ( + ), + ), + 'theme_layout' => + array ( + 'images' => + array ( + 'icon.png' => 'ff19586caf182a0c7cf7cfbc1a074de4', + ), + 'layouts' => + array ( + 'layout1_chatbox.php' => 'b1db2075c5c7ea9f9b2c4f1597d08435', + 'layout1_comment.php' => 'ff0e3640109d2a025e1faf2e5581ec01', + 'layout1_forum.php' => '74047e347e584a4533319d7d0593bdb5', + 'layout1_main.php' => 'a65dc381f0e34fa3285f09720db06442', + 'layout1_news.php' => '6a36222bfc1e5df83753406ad14f0272', + 'layout1_poll.php' => '7298986d8189dcb866253b8526fed945', + ), + 'chatbox_layout.php' => '6e16ab5944c40af2d49a1e97bf00b0f8', + 'comment_layout.php' => '94eae619f29d869141caad9bd75cac24', + 'forum_layout.php' => '9e701c700316d8f2136f7343b2aa1566', + 'help.php' => 'a9dd8718eb1cff858c8a8ea9cd430fb5', + 'main_layout.php' => 'd348abf32cdf27bb2eb744771eea5ff7', + 'news_layout.php' => '6d609361cfedd501e23cdd4a90cc1e27', + 'poll_layout.php' => '327e6500d7df79f36e06c700aa413c1f', + 'theme.php' => 'd028142e833595ed508966fc37593659', + 'theme_layout.php' => '1ef564f5bfa15e9974c3018da2560688', + ), + 'trackback' => + array ( + 'images' => + array ( + ), + 'languages' => + array ( + ), + ), + 'tree_menu' => + array ( + 'languages' => + array ( + ), + ), + 'userlanguage_menu' => + array ( + 'languages' => + array ( + ), + ), + 'usertheme_menu' => + array ( + 'languages' => + array ( + 'French.php' => 'd21ea52501b9efc12e86d3577cb7186f', + 'usertheme_English.php' => '675a4f2690d5771613818338502eb4c5', + 'usertheme_French.php' => 'd21ea52501b9efc12e86d3577cb7186f', + ), + ), + ), + $coredir['themes'] => + array ( + 'blue_patriot' => + array ( + 'images' => + array ( + 'balloon.jpg' => '64dc97bcb2ba327399ae75905800f4e6', + 'bar.jpg' => 'a6db2ab78d920a41f003a0c31e688199', + 'blue_patriot_01.jpg' => '7831ce0cb8eb13b4ea1a92adbdab9d62', + 'blue_patriot_02.jpg' => 'ac12826a6e0a05b9c070c5521161f120', + 'blue_patriot_03.jpg' => 'c3411aaea64f1ccbd45dd412b7a2467c', + 'blue_patriot_04.jpg' => 'ac3b851650183ac0d47b41472afcdecf', + 'blue_patriot_05.jpg' => '0dfcd5f3553aa7e5d3df05dd13629e61', + 'blue_patriot_06.jpg' => '15b839a9fd716900dd4cf603bff890e8', + 'blue_patriot_07.jpg' => 'f71799048ccf41e6fc6689f3f609e2db', + 'blue_patriot_08.jpg' => '5619bba0856394e207e8e39a6670dc50', + 'blue_patriot_09.jpg' => 'ffec8e1466bbdc30c3c7a15e4cb7727b', + 'blue_patriot_10.jpg' => '9f486fba3969a36958bbfc1ecb4f9851', + 'blue_patriot_11.jpg' => '6c2c5e0ad28eb6f70775f9ee64d5b8d7', + 'blue_patriot_12.jpg' => '5b5775e1043b999729199c4c27f43974', + 'blue_patriot_13.jpg' => '557e9b1c1cf68dfb1b51969f6ada6fd4', + 'blue_patriot_14.jpg' => 'bca587141e6745d02447526574e1b9c2', + 'blue_patriot_15.jpg' => '99a9e333f4cccf0fcd79679864de9346', + 'blue_patriot_16.jpg' => '71f45abb20a470dbb7b1f05571b9d165', + 'blue_patriot_17.jpg' => '2955f18ffa7e16c441b17feaa3b6bcca', + 'blue_patriot_18.jpg' => 'd7c7faf35abfd47fcd387a1745d4e5b3', + 'blue_patriot_19.jpg' => '16f1986bb5658c5ef33916092760702c', + 'blue_patriot_20.jpg' => '775a338453d65e0f8e6982b541ccbb95', + 'blue_patriot_21.jpg' => 'afffe79cf460ce63991c5e85dbf116ba', + 'blue_patriot_22.jpg' => 'd07ee234e9a0f53999ef60105591da82', + 'blue_patriot_23.jpg' => 'd33fd108f4828402b9dbb710f29ac2b2', + 'blue_patriot_24.jpg' => '430faa6d08785afe5254974c08407461', + 'blue_patriot_25.jpg' => 'd005d6c8d1df0ef80cd308cecf6f8cff', + 'blue_patriot_26.jpg' => '7f704f010bfb3fd6291a3b6a9ee465ba', + 'blue_patriot_27.jpg' => '6852500646a0a40f845d29a9998e965d', + 'blue_patriot_28.jpg' => '1fc8fe28545213a22cce040331db573b', + 'blue_patriot_29.jpg' => '698df200ff09414407fcc0c84ee74926', + 'blue_patriot_30.jpg' => 'fdd019a93a7d605d47dfa51ab6e965cc', + 'blue_patriot_31.jpg' => '27d3aab176590dab3458102d865aed21', + 'blue_patriot_32.jpg' => '1cee9c979aee7d52bcdf47f0fd1a1756', + 'blue_patriot_33.jpg' => '802673dea5d6b3318392267cfbe798b4', + 'blue_patriot_34.jpg' => '4a26464b5b3b2c4fd3621be82506bca9', + 'blue_patriot_35.jpg' => '48f2693b73a17381db62d36836958406', + 'blue_patriot_36.jpg' => 'abf7188d7973f01a9f255174ddfddf20', + 'blue_patriot_37.jpg' => 'dbf963f8163715e98d74c0beb3af2d8a', + 'blue_patriot_38.jpg' => 'a69c3868b52ceabecde8e10eed6ca0e6', + 'blue_patriot_39.jpg' => 'd4409c49b7b9fe7ff945a25df0c90395', + 'blue_patriot_40.jpg' => '623d4acd8692a8d5d91ced7108ec84e7', + 'bodybg.jpg' => 'cf7b94186d42ddb69a007fe7d6a5a2bd', + 'bullet2.gif' => 'de856ab1707989549981594c40ac0b0d', + 'captionbg.jpg' => '3cfcfda4fa37a1dd9800bd2f8ff37b11', + 'sm_folder.jpg' => 'f8de850ff6da330959af2431eb2b83fa', + ), + 'style.css' => '4eeeebf4cc2410e55cc6d0015a7b2dcb', + 'theme.php' => '522ceddf68bff62ff177e83d291b7b65', + ), + 'clan' => + array ( + 'forum' => + array ( + 'admin_delete.png' => '707ddc11a86975090610a76e8ad01923', + 'admin_edit.png' => 'a383175b504d64e64a84a21dda5c1619', + 'admin_lock.png' => '744c74fecf65bd64d4ee22681cf6bd11', + 'admin_move.png' => 'c892805676f983c34dbf308eeb2627c7', + 'admin_stick.png' => 'ef0bc1380cdbd26118c6c53272e46af6', + 'admin_unlock.png' => '1818d0d48dfe5f76c8bf3cee9d9e949c', + 'admin_unstick.png' => '8b57798a150aff163c35a9e2a7c1ff62', + 'announce.png' => '51274830e593a079d57c3213da0b97ab', + 'closed.png' => '661d62b0359cece8ea019268aea90b72', + 'closed_small.png' => '23df1d00ed2742c32f08664b39ebe5e4', + 'delete.png' => 'b9fc374f973e51f45c80884b56cab7c0', + 'e.png' => '5c4648034ca4494db00270b4f73cb4e9', + 'edit.png' => '1dfc36a823e1752f2aef6fce3d4ab4d8', + 'email.png' => 'f76baf56d637b8918f686345cd3ca7d2', + 'fcap.png' => '35e09d61f248d03d9ae67ff46f6e5a91', + 'finfobar.png' => '71585c0c2d3340ece8cf769a135286b9', + 'moderator.png' => 'dc487b54b9dbbc1fc834a8ef882adea8', + 'new.png' => '63c68b98a1ebf395a58c194688665404', + 'new_popular.gif' => '3c47023ff01dc15fb3a678cb21cf55ad', + 'new_small.png' => 'df5d599ecd2bdcc93d576d552b71a54c', + 'newthread.png' => '0b580ca6d9cd6fd514c7ac3bb3b1c171', + 'nonew.png' => '7833bd100df8495e076dfaf400d1afb3', + 'nonew_popular.gif' => 'bd77c2f2b42336d5690646d4006ea983', + 'nonew_small.png' => '2544ba225c65f82c7788b003edb2d1fe', + 'post.png' => '4abd6992f5bcb6c624ce670468ff538a', + 'profile.png' => 'd533f49ea50c756a6f61db3ae87ae8b1', + 'quote.png' => 'fd587e1696430999022aa2e6dd765904', + 'reply.png' => 'f7004bc6a716839bb4e803a4f08470ce', + 'sticky.png' => '31f95734f8ddea70f1532658cc123e24', + 'stickyclosed.png' => '0d8232ce1f8854a81a8832560fe47d4a', + 'website.png' => '882b8448acefe7857e31639a78acb47e', + ), + 'images' => + array ( + 'bar.jpg' => '699a527e29ee1fee2932255d76c095fa', + 'bar2.gif' => '7a3ae76cbf5e376e3e86eb01aaadefba', + 'bar2edge.gif' => '75b67e121016a521b1b975f3ead317a4', + 'bullet1.gif' => '097e3c018ae655310889fa98f85be57b', + 'bullet2.gif' => '026bd38853b2fc24353da648893737e5', + 'cap.png' => '32a40d90d55b3fc92350e3437ec79d7e', + 'cap2.png' => 'f56be37f5bb99b498a354762e1fac575', + 'header.png' => '200d62810e3f06bf792e920bcdce1d30', + 'logo.png' => 'bc9ceb041746cc1a021af2ed19002663', + 'menubg.png' => 'c23f21ecfb2ea65d9870e155058fb5b0', + 'topbar.png' => 'cf65e56f37871f04f3ce83337ae123e7', + ), + 'style.css' => 'b9acced713fc611ec3c94abdbf5a6bcd', + 'theme.php' => '88af12095e58d509e387eea822d36c0a', + ), + 'comfort' => + array ( + 'forum' => + array ( + 'admin_delete.png' => '36fe015a4b8cfdbbe4b8aee8b7b563a7', + 'admin_edit.png' => 'c03274b7f9e16ac1cb702ae8db849f7e', + 'admin_lock.png' => 'e77b92a1f5877b64b9ccad7cf30b798d', + 'admin_move.png' => '53724301fb9a5f735d47986feabaa5c2', + 'admin_stick.png' => 'a3f08da8ab9eda3985365793ff91caf5', + 'admin_unlock.png' => 'abbe887ff2c94e0fc7ccc6ec76e33e2f', + 'admin_unstick.png' => '61807d0afc335e394bd9050157eae4c5', + 'announce.png' => '51274830e593a079d57c3213da0b97ab', + 'closed_small.png' => '23df1d00ed2742c32f08664b39ebe5e4', + 'delete.png' => 'b9fc374f973e51f45c80884b56cab7c0', + 'e.png' => '797612f8767a25e9a934580f7d778ef5', + 'edit.png' => 'dc9067455b48da0bbc50993a4217eedd', + 'email.png' => 'bd759f54b3496efb62529a08c2b15116', + 'fcap.png' => 'fa0919ce75dbdcb15cf7e651d5842415', + 'fcap2.png' => '2c1e274a0b58e66d9cc36a08df4d20c9', + 'finfobar.png' => '71585c0c2d3340ece8cf769a135286b9', + 'moderator.png' => 'dc487b54b9dbbc1fc834a8ef882adea8', + 'new.png' => '2bbd79241cf8036164e9965055b6f8b3', + 'new_popular.gif' => '3c47023ff01dc15fb3a678cb21cf55ad', + 'new_popular.png' => '610f65b2547cdd8fd22fdf6903f90f61', + 'new_small.png' => '7ccbd065e0bb7baff3bca315f2e7989e', + 'newthread.png' => '2d08a2071204a9a9b4766969704b8fee', + 'nonew.png' => '5fe81217e3c6f672a4e2f2922ddbe1c6', + 'nonew_popular.gif' => 'bd77c2f2b42336d5690646d4006ea983', + 'nonew_small.png' => '948a5a7b2bcb069fd17dcd0c467ce2b5', + 'post.png' => '5212304c8b38fb4033ddf691fd7b77ba', + 'profile.png' => 'ed21e84603c3bcf82eb1820235c36075', + 'quote.png' => '579d14bfb1faabf191272938fae3ab65', + 'reply.png' => 'ba0faaf5b9a0c9e4edafc921a049739f', + 'sticky.png' => 'c5bb0a20ef02bf8e52f3a93907804f20', + 'stickyclosed.png' => '810fb2dee4cf3d593f5a50031a52cde8', + 'website.png' => '568b5e9dcc6fcc5067209e9390297162', + ), + 'images' => + array ( + 'bar.jpg' => '13b2cb049602ff94d0d80a0e0896d8e9', + 'bar2.gif' => '7a3ae76cbf5e376e3e86eb01aaadefba', + 'bar2edge.gif' => '30f11ad7f707603148a90c4197c5b195', + 'bg.gif' => '058052ed6c5234762c53f70b0001fb92', + 'bullet1.gif' => 'f3e084e73fc80fea93ee8e11ffef4739', + 'bullet2.gif' => '5e3525d341b9a47c514b094e9a5395a7', + ), + 'style.css' => '6bbba211070fa8517ee4b8a6d3c26e7e', + 'theme.php' => 'edba9bf51ddd484b9d77ffdb0c9c3a1c', + ), + 'comfortless' => + array ( + 'forum' => + array ( + 'admin_delete.png' => '36fe015a4b8cfdbbe4b8aee8b7b563a7', + 'admin_edit.png' => 'c03274b7f9e16ac1cb702ae8db849f7e', + 'admin_lock.png' => 'e77b92a1f5877b64b9ccad7cf30b798d', + 'admin_move.png' => '53724301fb9a5f735d47986feabaa5c2', + 'admin_stick.png' => 'a3f08da8ab9eda3985365793ff91caf5', + 'admin_unlock.png' => 'abbe887ff2c94e0fc7ccc6ec76e33e2f', + 'admin_unstick.png' => '61807d0afc335e394bd9050157eae4c5', + 'announce.png' => '51274830e593a079d57c3213da0b97ab', + 'closed_small.png' => '23df1d00ed2742c32f08664b39ebe5e4', + 'delete.png' => 'b9fc374f973e51f45c80884b56cab7c0', + 'e.png' => '22d175dba98b439b73d17da6cd142adf', + 'edit.png' => 'dc9067455b48da0bbc50993a4217eedd', + 'email.png' => 'bd759f54b3496efb62529a08c2b15116', + 'fcap.png' => 'fa0919ce75dbdcb15cf7e651d5842415', + 'fcap2.png' => '2c1e274a0b58e66d9cc36a08df4d20c9', + 'finfobar.png' => '71585c0c2d3340ece8cf769a135286b9', + 'moderator.png' => 'dc487b54b9dbbc1fc834a8ef882adea8', + 'new.png' => '2bbd79241cf8036164e9965055b6f8b3', + 'new_popular.gif' => '3c47023ff01dc15fb3a678cb21cf55ad', + 'new_small.png' => 'efb0e1cd78edb0a66d8e83c245e0f0d5', + 'newthread.png' => '3b51e035b6cb3579d955372de1b36934', + 'nonew.png' => '5fe81217e3c6f672a4e2f2922ddbe1c6', + 'nonew_popular.gif' => 'bd77c2f2b42336d5690646d4006ea983', + 'nonew_small.png' => '887892198ae123a03df21132e08c6964', + 'post.png' => '5212304c8b38fb4033ddf691fd7b77ba', + 'profile.png' => 'ed21e84603c3bcf82eb1820235c36075', + 'quote.png' => '579d14bfb1faabf191272938fae3ab65', + 'reply.png' => '26ff2128f3e5b5c985c688118015b69f', + 'sticky.png' => 'c5bb0a20ef02bf8e52f3a93907804f20', + 'stickyclosed.png' => '810fb2dee4cf3d593f5a50031a52cde8', + 'website.png' => '568b5e9dcc6fcc5067209e9390297162', + ), + 'images' => + array ( + 'bar.jpg' => '13b2cb049602ff94d0d80a0e0896d8e9', + 'bar2.gif' => '7a3ae76cbf5e376e3e86eb01aaadefba', + 'bar2edge.gif' => '30f11ad7f707603148a90c4197c5b195', + 'bg.gif' => '058052ed6c5234762c53f70b0001fb92', + 'bullet1.gif' => 'f3e084e73fc80fea93ee8e11ffef4739', + 'bullet2.gif' => '5e3525d341b9a47c514b094e9a5395a7', + ), + 'style.css' => '92e3bf1e539749704b1fcb013d9df71a', + 'theme.php' => '58fecc858bb054ae7a71bc79ea12c5b7', + ), + 'crahan' => + array ( + 'images' => + array ( + ), + 'languages' => + array ( + ), + ), + 'e107' => + array ( + 'images' => + array ( + 'bar.jpg' => 'a6db2ab78d920a41f003a0c31e688199', + 'bar2.gif' => '7a3ae76cbf5e376e3e86eb01aaadefba', + 'bar2edge.gif' => '75b67e121016a521b1b975f3ead317a4', + 'bullet1.gif' => '097e3c018ae655310889fa98f85be57b', + 'bullet2.gif' => 'd6e34836e1e3270c3fe06557f9b93d9d', + 'button.png' => '5a1a29b5670e03697659581da597b5fc', + 'cap.png' => 'b439047ea62b69e3569cc70999ff6e5f', + 'header.png' => '200d62810e3f06bf792e920bcdce1d30', + 'installlogo.png' => '3cd312e939be5dbb073ce76a3116231d', + 'logo.png' => '346418f2f391f029e9b83c854b74b1d7', + ), + 'style.css' => 'e92d7179f04ee8849024a9af22877d0b', + 'theme.php' => '39270d4c1c77ac7f34373d7fdb452984', + ), + 'e107v4a' => + array ( + 'images' => + array ( + 'bar2.gif' => 'eb85624e746f91fd33511783cccc92a6', + 'bar2edge.gif' => '6d273a53798e532091bd6354f1e39c60', + ), + 'languages' => + array ( + ), + 'forum_design.php' => '6afe8b9762a01cad599d77c37d54bf80', + ), + 'example' => + array ( + 'images' => + array ( + 'bar.jpg' => 'a6db2ab78d920a41f003a0c31e688199', + 'bar2.gif' => '7a3ae76cbf5e376e3e86eb01aaadefba', + 'bar2edge.gif' => 'd3ef60cb45ff91968ce65db5b49b985b', + 'bullet1.gif' => '097e3c018ae655310889fa98f85be57b', + 'bullet2.gif' => 'd6e34836e1e3270c3fe06557f9b93d9d', + 'cap.png' => '736f4166b8ecd0c1a8f031e336657c5e', + 'header.png' => '200d62810e3f06bf792e920bcdce1d30', + 'logo.png' => '346418f2f391f029e9b83c854b74b1d7', + ), + 'style.css' => '64dfcfe7f8a5dd55d755d00f751fa97c', + 'theme.php' => '6b0cdd3e6833728e44772a8c8722724f', + ), + 'fiblack3d' => + array ( + 'images' => + array ( + 'bar.jpg' => 'a87f6df0dc62f6059164a784e48605f3', + 'bar2.gif' => '7a3ae76cbf5e376e3e86eb01aaadefba', + 'bar2edge.gif' => '75b67e121016a521b1b975f3ead317a4', + 'blank.gif' => '0e94b3486afb85d450b20ea1a6658cd7', + 'bottomleft.png' => '258e3e69e770bbeacde6264051d8ac5c', + 'bottommiddle.png' => '356edf3b2e72b9991576d8cdc1269a1f', + 'bottomright.png' => 'd9b376c57987219f22b86737e6068080', + 'bullet1.gif' => '097e3c018ae655310889fa98f85be57b', + 'bullet2.gif' => 'f7a33fe24f02eb54392eb094b6ded7de', + 'bullet3.gif' => 'b2cc886c34040cd25e787819e20433f2', + 'button.png' => '5a1a29b5670e03697659581da597b5fc', + 'cap.png' => 'b439047ea62b69e3569cc70999ff6e5f', + 'cap1.gif' => '9ad552a50c8425d6c1d8d766216c1093', + 'fcap.png' => 'c398adcd3acaa56b3b0168fe63140363', + 'fcap2.png' => '484bca31074eacfc1b1689437780d987', + 'g_head.gif' => 'e5b7c8416887f1c7d8d9427763072117', + 'header.png' => '200d62810e3f06bf792e920bcdce1d30', + 'left.png' => '96c753c33cf6d69d093120448681a510', + 'logo.jpg' => 'a2a402adf9ec65f2abe9c5a141791d1e', + 'logo2.png' => '867f8d31edb08e05bf3540cc03eedd2f', + 'nforumcaption.png' => '18a5f435d48bdeb8e036af0020f8ed26', + 'nforumcaption2.png' => '9864c81acddb5f2d2e792738e1468f4e', + 'right.png' => 'fe20a5ed232fdb263b20b12e74ea34e2', + 'sb_template.png' => '05d718c4d7ffff4cb4a39e1fe3098a13', + 'tbbg.png' => '418dea906f043bd84f108e701921d53f', + 'topleft.png' => '1d78bbdc0e9802cf3067eeb3efcf1a5a', + 'topmiddle.png' => '875f5c3a51b520a8684a36e55bc412da', + 'topright.png' => '5be0284fbb41ff6987b64cfb783e7c7d', + 'y_head.gif' => '052f449cda374ade80ee10df09ecd227', + ), + 'style.css' => 'd398533bd3d96e28ee03af6430dacbce', + 'theme.php' => 'fdd24c507722ddbb56cd10d77c0c7c7a', + ), + 'human_condition' => + array ( + 'images' => + array ( + ), + 'languages' => + array ( + ), + ), + 'interfectus' => + array ( + 'images' => + array ( + ), + 'languages' => + array ( + ), + ), + 'jayya' => + array ( + 'forum' => + array ( + ), + 'images' => + array ( + ), + 'languages' => + array ( + ), + ), + 'khatru' => + array ( + 'images' => + array ( + ), + 'languages' => + array ( + ), + 'nexter.css' => '9290a07f99bb3d5068a3e6a3a580d325', + ), + 'kubrick' => + array ( + 'images' => + array ( + ), + 'languages' => + array ( + ), + 'nicetitle.js' => '81658d0b559af2fb4c0ad27b8ffb9a0d', + ), + 'lamb' => + array ( + 'images' => + array ( + ), + 'languages' => + array ( + ), + ), + 'leaf' => + array ( + 'fontstyles' => + array ( + ), + 'images' => + array ( + ), + 'languages' => + array ( + ), + ), + 'leap of faith' => + array ( + 'images' => + array ( + 'bar.jpg' => 'deb2fd16258227f5e99fee0074b764af', + 'bar2.gif' => 'eb85624e746f91fd33511783cccc92a6', + 'bar2edge.gif' => '6d273a53798e532091bd6354f1e39c60', + 'blank.gif' => '0e94b3486afb85d450b20ea1a6658cd7', + 'bottom.png' => '46e798abeb638c4f9540973d239b10e7', + 'bottomleft.png' => '3db4e800cc8add7f4f360c5f055aba49', + 'bottomright.png' => '28a54110d855fd47380cf094d6b7b169', + 'bullet1.gif' => 'f3e084e73fc80fea93ee8e11ffef4739', + 'bullet2.gif' => '5fea13d481fc903ce05bfed57341e1c1', + 'button.png' => '69918234a9caea763d1c66781e50fe34', + 'cap1.png' => 'd014368f2839e01b455ef1d63175188d', + 'capdark.png' => 'f8ec8fc5f9ccb1e72f0543e9405c0649', + 'capleft.png' => 'b57f36c4daf41cee56d31cbd47f9b1f1', + 'caplight.png' => 'ca308b892123bdb7e9e0f7cf1f729c59', + 'capright.png' => '36e3ec810d778dc3664b456c714e62f3', + 'captransition.png' => '7e9583f5c1c96b4191fa309a058aa314', + 'fcap.png' => 'fabf58910351f1f742dee108b60517b8', + 'fcap2.png' => '777e56bcaf32e29ad505df49f3cb6019', + 'left.png' => 'a7755093080be75e9430072bd3bb32b3', + 'right.png' => '1dc657e1d9065920653132f3a85d77ed', + 'temp.png' => '35e34c98922cf2df737eef3cec806af2', + 'top.png' => '75b4e22fcbe8059bf217690e08c265ac', + 'topleft.png' => '8b45a5185fa619c3d336e1ceb618bc81', + 'topright.png' => '1c6d6e49a6d9d173ec12f2baed2f45a8', + ), + 'style.css' => '1b8a431a51e1e374e4eadcd8d7ed3ca6', + 'theme.php' => 'ecde1a337a506f397465704e887a9865', + ), + 'nagrunium' => + array ( + 'images' => + array ( + 'bar.jpg' => '13b2cb049602ff94d0d80a0e0896d8e9', + 'bar2.gif' => '7a3ae76cbf5e376e3e86eb01aaadefba', + 'bar2edge.gif' => '30f11ad7f707603148a90c4197c5b195', + 'bg.gif' => '058052ed6c5234762c53f70b0001fb92', + 'bullet1.gif' => 'f3e084e73fc80fea93ee8e11ffef4739', + 'bullet2.gif' => '5e3525d341b9a47c514b094e9a5395a7', + ), + 'style.css' => '289d72f0f610c28fa47e856ef1d16113', + 'theme.php' => '9417c6b28e9c4f9b2754c26cdb200abb', + ), + 'newsroom' => + array ( + 'images' => + array ( + ), + ), + 'nordranious' => + array ( + 'forum' => + array ( + 'admin_delete.png' => '36fe015a4b8cfdbbe4b8aee8b7b563a7', + 'admin_edit.png' => 'c03274b7f9e16ac1cb702ae8db849f7e', + 'admin_lock.png' => 'e77b92a1f5877b64b9ccad7cf30b798d', + 'admin_move.png' => '53724301fb9a5f735d47986feabaa5c2', + 'admin_stick.png' => 'a3f08da8ab9eda3985365793ff91caf5', + 'admin_unlock.png' => 'abbe887ff2c94e0fc7ccc6ec76e33e2f', + 'admin_unstick.png' => '61807d0afc335e394bd9050157eae4c5', + 'announce.png' => '51274830e593a079d57c3213da0b97ab', + 'closed_small.png' => '23df1d00ed2742c32f08664b39ebe5e4', + 'delete.png' => 'b9fc374f973e51f45c80884b56cab7c0', + 'e.png' => '797612f8767a25e9a934580f7d778ef5', + 'edit.png' => 'dc9067455b48da0bbc50993a4217eedd', + 'email.png' => 'bd759f54b3496efb62529a08c2b15116', + 'fcap.png' => 'b660b71d0208edb76a1b16930f2b81ac', + 'fcap2.png' => '5f6f45697bc185d51f2c06d904642aad', + 'finfobar.png' => '71585c0c2d3340ece8cf769a135286b9', + 'moderator.png' => 'dc487b54b9dbbc1fc834a8ef882adea8', + 'new.png' => '2bbd79241cf8036164e9965055b6f8b3', + 'new_popular.gif' => '3c47023ff01dc15fb3a678cb21cf55ad', + 'new_small.png' => 'c593a4a99887c7eaeb1cd8dd000ebfcd', + 'newthread.png' => '94fdbfd082142c1443af2cf82914a833', + 'nonew.png' => '5fe81217e3c6f672a4e2f2922ddbe1c6', + 'nonew_popular.gif' => 'bd77c2f2b42336d5690646d4006ea983', + 'nonew_small.png' => '1e88b9f0b2e714475d4243509336b5c4', + 'post.png' => '5212304c8b38fb4033ddf691fd7b77ba', + 'profile.png' => 'ed21e84603c3bcf82eb1820235c36075', + 'quote.png' => '579d14bfb1faabf191272938fae3ab65', + 'reply.png' => '556906857646412a52b35814b4f707ba', + 'sticky.png' => 'c5bb0a20ef02bf8e52f3a93907804f20', + 'stickyclosed.png' => '810fb2dee4cf3d593f5a50031a52cde8', + 'website.png' => '568b5e9dcc6fcc5067209e9390297162', + ), + 'images' => + array ( + 'bar.jpg' => '683a63e29f5c473fe677836187953c1a', + 'bar.png' => '9791d8cbd8e00c4b4538696990977d2b', + 'bar2.gif' => '7a3ae76cbf5e376e3e86eb01aaadefba', + 'bar2edge.gif' => 'd3ef60cb45ff91968ce65db5b49b985b', + 'blank.gif' => '7de900b8e3dd46a432e384eb231f079d', + 'bullet1.gif' => '09331909ba55a4f54c08018cede1ec85', + 'bullet2.gif' => 'd6e34836e1e3270c3fe06557f9b93d9d', + 'bullet3.gif' => '54e9d1f816051d002420875fb3499fd8', + 'button.png' => '5a1a29b5670e03697659581da597b5fc', + 'cap.png' => '81e98497b6b21b117be42ab30e6b8551', + 'corner.png' => '55d255b0484a611b1e94e0c9f89fce34', + 'left.png' => 'ddc536f7ec329942af71a88a8c8edaad', + 'side.png' => '18dd6404dc3020641158c286b25b0ea9', + 'top.png' => 'ca8d4b489c4c86f2cc8e1e0d48ef5eaf', + ), + 'style.css' => '60e1cb2188f3fb4e88e21e138ff5aa07', + 'theme.php' => 'f04beabe808e9269589d0a30889d8d6d', + ), + 'phpbb' => + array ( + 'forum' => + array ( + 'admin_delete.png' => '36fe015a4b8cfdbbe4b8aee8b7b563a7', + 'admin_edit.png' => 'c03274b7f9e16ac1cb702ae8db849f7e', + 'admin_lock.png' => 'e77b92a1f5877b64b9ccad7cf30b798d', + 'admin_move.png' => '53724301fb9a5f735d47986feabaa5c2', + 'admin_stick.png' => 'a3f08da8ab9eda3985365793ff91caf5', + 'admin_unlock.png' => 'abbe887ff2c94e0fc7ccc6ec76e33e2f', + 'admin_unstick.png' => '61807d0afc335e394bd9050157eae4c5', + 'announce.png' => '51274830e593a079d57c3213da0b97ab', + 'closed_small.png' => '23df1d00ed2742c32f08664b39ebe5e4', + 'delete.png' => 'b9fc374f973e51f45c80884b56cab7c0', + 'e.png' => '797612f8767a25e9a934580f7d778ef5', + 'edit.png' => 'dc9067455b48da0bbc50993a4217eedd', + 'email.png' => 'bd759f54b3496efb62529a08c2b15116', + 'fcap.png' => '3d1b365a597132548eb9635b6bca040d', + 'fcap2.png' => '5f6f45697bc185d51f2c06d904642aad', + 'finfobar.png' => '71585c0c2d3340ece8cf769a135286b9', + 'moderator.png' => 'dc487b54b9dbbc1fc834a8ef882adea8', + 'new.png' => '2bbd79241cf8036164e9965055b6f8b3', + 'new_popular.gif' => '3c47023ff01dc15fb3a678cb21cf55ad', + 'new_small.png' => 'c593a4a99887c7eaeb1cd8dd000ebfcd', + 'newthread.png' => '94fdbfd082142c1443af2cf82914a833', + 'nonew.png' => '5fe81217e3c6f672a4e2f2922ddbe1c6', + 'nonew_popular.gif' => 'bd77c2f2b42336d5690646d4006ea983', + 'nonew_small.png' => '1e88b9f0b2e714475d4243509336b5c4', + 'post.png' => '5212304c8b38fb4033ddf691fd7b77ba', + 'profile.png' => 'ed21e84603c3bcf82eb1820235c36075', + 'quote.png' => '579d14bfb1faabf191272938fae3ab65', + 'reply.png' => '556906857646412a52b35814b4f707ba', + 'sticky.png' => 'c5bb0a20ef02bf8e52f3a93907804f20', + 'stickyclosed.png' => '810fb2dee4cf3d593f5a50031a52cde8', + 'website.png' => '568b5e9dcc6fcc5067209e9390297162', + ), + 'images' => + array ( + 'bar.jpg' => 'a6db2ab78d920a41f003a0c31e688199', + 'bar2.gif' => '7a3ae76cbf5e376e3e86eb01aaadefba', + 'bar2edge.gif' => '75b67e121016a521b1b975f3ead317a4', + 'bullet1.gif' => '097e3c018ae655310889fa98f85be57b', + 'bullet2.gif' => 'd6e34836e1e3270c3fe06557f9b93d9d', + 'bullet3.gif' => 'e1bfc882a4a4a1f3b245585e17181da6', + 'button.png' => '5a1a29b5670e03697659581da597b5fc', + 'cap.png' => 'b439047ea62b69e3569cc70999ff6e5f', + 'cap1.gif' => '9ad552a50c8425d6c1d8d766216c1093', + 'header.png' => '200d62810e3f06bf792e920bcdce1d30', + 'sb_template.png' => '05d718c4d7ffff4cb4a39e1fe3098a13', + ), + 'style.css' => '5eaeee033e7af67e3642494321211461', + 'theme.php' => '3bebdfb44352857292267e9e40baa744', + ), + 'ranyart' => + array ( + 'images' => + array ( + 'bar.jpg' => 'a6db2ab78d920a41f003a0c31e688199', + 'bar2.gif' => '7a3ae76cbf5e376e3e86eb01aaadefba', + 'bar2edge.gif' => 'd3ef60cb45ff91968ce65db5b49b985b', + 'bullet1.gif' => '097e3c018ae655310889fa98f85be57b', + 'bullet2.gif' => 'ffa05a27f0da01830e12d15095b5473b', + 'button.png' => '15462dc5844b42f6891e3a05dbfc0b3b', + 'cap.png' => '736f4166b8ecd0c1a8f031e336657c5e', + 'clock.png' => 'b8a6c6b2c3e1b66f3ae03b217665a1a2', + 'header.png' => '200d62810e3f06bf792e920bcdce1d30', + 'logo.png' => '830db48cdb37387b806423ed0ca9960d', + 'monitor.png' => 'fe57c7050bc8c7903806149e7f4e25b4', + ), + 'style.css' => '62365fd9c2b8b1b18485f69f1503818d', + 'theme.php' => '0c1cdae9b4143f3ea1a0855231fe4b84', + ), + 'reline' => + array ( + 'images' => + array ( + ), + 'languages' => + array ( + ), + ), + 'sebes' => + array ( + 'images' => + array ( + ), + 'languages' => + array ( + ), + ), + 'smacks' => + array ( + 'images' => + array ( + 'bg.gif' => '890e67e4d2d362079e3a794ff0c3950b', + 'bg.png' => 'e70a48befe520f37d50872c6d7816ab6', + 'body.png' => '555772b48dc8bebc0be424d4ef837e51', + 'bottom.png' => 'f12ecaa6b26786524f6e9b0c1d0baa91', + 'bottomleft.png' => '0df01a95deaeecdcfbd378500fb016d1', + 'bottomright.png' => 'faf4235009b7bceda62f5e6e98f71a92', + 'bullet1.gif' => '992bd9b4f72c80b5e74168af0adb225b', + 'bullet2.gif' => 'ee9887f23030161576dc7267a163c59b', + 'caption.png' => '98afcbf04a2dc04ecd6491c9a4beb3b9', + 'left.png' => '3eef5624d4a069d3e31fb8576e785419', + 'logo.png' => 'bb8d5e083cf27c045313e6e5bcd97e52', + 'right.png' => 'd47a3a781045dc015f9cca05eb1b5ab8', + 'tablebg.png' => 'c5c91fb04407c388ef0be982bb8809ae', + 'top.png' => 'a48a0e033119a0289852812325b594ef', + 'topbar.png' => '0dd080dfcd0a2df285fa26f5a3740147', + 'topleft.png' => 'c872a73060a134dbdc57727348a6d907', + 'topright.png' => '23ffd97e5448427efd333179d094387a', + ), + 'style.css' => '44eb298d24e6eff161e327c06289e801', + 'theme.php' => '8e83b87b38504a2d08292c0bbf7301c5', + ), + 'soar' => + array ( + 'images' => + array ( + 'bar.jpg' => '13b2cb049602ff94d0d80a0e0896d8e9', + 'bar2.gif' => '7a3ae76cbf5e376e3e86eb01aaadefba', + 'bar2edge.gif' => '30f11ad7f707603148a90c4197c5b195', + 'bg.gif' => '058052ed6c5234762c53f70b0001fb92', + 'blank.gif' => '0e94b3486afb85d450b20ea1a6658cd7', + 'bullet1.gif' => 'f3e084e73fc80fea93ee8e11ffef4739', + 'bullet2.gif' => '5e3525d341b9a47c514b094e9a5395a7', + 'cap1.png' => '98be8e32cc8651622d43a466f63b169c', + 'caption.png' => '3d84f35bff62f78624822c7eae1bc5d2', + 'caption2.png' => '2eac2c5145782f11f605842c3f5f6911', + 'caption3.png' => '9804cedbccc111a22dc0b56c4aa5f1ae', + 'fcap.png' => '808ecd89f8890df55e0f2a76555ef4d2', + 'fcap2.png' => '90c520d65d4dd19217739cfcc6e3979a', + 'hr.png' => 'e41d8ce6c3381c08bc20fad9ebf26aee', + 'logo.jpg' => 'c79b084a3bb2e76ab49f9ddce0319ac1', + 'nforumcaption.png' => '18a5f435d48bdeb8e036af0020f8ed26', + 'nforumcaption2.png' => '9864c81acddb5f2d2e792738e1468f4e', + 'shadow_left.png' => 'f47a342e00d6f4248b552fa5e39294d1', + 'shadow_middle.png' => '946975a66e4db58fbe6442899afbeb13', + 'shadow_right.png' => '00a7c72cc479dd89a50ccddeec650758', + ), + 'forum_design.php' => '45e828a47cedaaa44e312470846d4930', + 'style.css' => '62cb98d0e63beb9ca74cdfcd7c599785', + 'theme.js' => 'bd6ab25405b19545bbdcad691da94fe8', + 'theme.php' => '92fa9c0015733df0c6b935d0c2ce082c', + ), + 'templates' => + array ( + 'content_template.php' => '4234fe2ce5e65e85d0597efc6ee68d5d', + 'forum_template.php' => '7c4aa61097a7cf0ea4a5f3d2089a5b9d', + 'forum_viewforum_template.php' => '7a2c7fc3c28a3df76661ec297119daab', + 'forum_viewtopic_template.php' => 'fb3516a937155a9e86eaa9a080905646', + 'links_template.php' => '21d8747bb5c1d6d590a9ad0b0d26e576', + ), + 'vekna_blue' => + array ( + 'images' => + array ( + ), + 'languages' => + array ( + ), + ), + 'wan' => + array ( + 'forum' => + array ( + 'fcap.png' => '5c3f4de6a594f0cfc26ba5f262cff6a3', + 'fcap2.png' => '5faf526e1c2b8b8473d73b5f1a034baa', + ), + 'images' => + array ( + 'bar.jpg' => '36494528dd74cb5869a176be426f48fd', + 'bar2.gif' => '340f87a5da4dfff37fd833a7a9834a92', + 'bar2edge.gif' => '3a224f579f9c6fa28687b44c61a03581', + 'bullet1.gif' => 'c80146f4417e32ea9f21f9a1bd71dd19', + 'bullet2.gif' => '62dfcf66db90d4a8d16093604582630d', + 'cap.png' => 'e4767da365351414865449a5b59450a2', + 'desktop.gif' => '24bdbaec3683f038c4c1e77983357aea', + 'header.png' => '9123aa2265308104754a534b8540c8ba', + 'iconmail.png' => 'e4ba543e3f4e02185e7df1ea5b689800', + 'iconprint.png' => '933d2be01f102e99f7ed03bea96bfbe1', + ), + 'style.css' => '1e999f8f80ebc89a4bde3c803f934bd3', + 'theme.php' => 'bbe4d283f553c324863c4451e3212ea4', + ), + 'xog' => + array ( + 'images' => + array ( + 'bar.jpg' => '13b2cb049602ff94d0d80a0e0896d8e9', + 'bar2.gif' => '7a3ae76cbf5e376e3e86eb01aaadefba', + 'bar2edge.gif' => '30f11ad7f707603148a90c4197c5b195', + 'bg.gif' => '058052ed6c5234762c53f70b0001fb92', + 'bullet1.gif' => 'f3e084e73fc80fea93ee8e11ffef4739', + 'bullet2.gif' => '5e3525d341b9a47c514b094e9a5395a7', + 'hr.png' => 'e41d8ce6c3381c08bc20fad9ebf26aee', + 'logo.png' => '973175159c8710e70cbb136a9db781a6', + ), + 'style.css' => '0de81736ec6019f246ee3df97133ba2b', + 'theme.php' => 'f61421dacc4fb1456f289569b9a22b9c', + ), + ), + 'CHANGES.txt' => '20499ea696da01da57ff542cb8cc90ce', + 'Copy of class2.php' => '4bc75d69d5486bb439f681467ccb9256', + 'Copy of forum_post.php' => '0063a6cdd546d5f90374bbb3ae342a2a', + 'README.txt' => 'f4ae5aa39099819a240951d0694fe105', + 'ReadMe_English_iso-8859-1.txt' => 'a15c32416143ecdebb10fab747a9065a', + 'chat.php' => 'f99ca9a68e350852ff12b6f201ff46e4', + 'e107_6171_readme.txt' => '7f411eaafccc974f91447c8efd9992d4', + 'forum_post.php' => 'b4537a7296252a0d8c010824b698259b', + 'install.php' => 'f6c6c7a5151ead93de10528d3a38092d', + 'oldpolls.php' => '2758e56550195c508819c6062b950bc3', + 'readme.txt' => 'ff257006036939e779d287cdfee3b4b3', + 'sitemap.php' => 'd72fdc265a68f5a3b8a5d4b51d776f84', + 'stats.php' => '70a4419f7b5ce5ad398a2f2d38ab55eb', + 'upgrade.php' => '5e74e594b56732d62183c0300e222f2a', +); + diff --git a/e107_admin/cpage.php b/e107_admin/cpage.php new file mode 100644 index 000000000..46d21c214 --- /dev/null +++ b/e107_admin/cpage.php @@ -0,0 +1,453 @@ +mySQLlanguage) ? $sql->mySQLlanguage : $pref['sitelanguage']; + +if (e_QUERY) +{ + $tmp = explode(".", e_QUERY); + $action = $tmp[0]; + $sub_action = $tmp[1]; + $id = $tmp[2]; + $from = ($tmp[3] ? $tmp[3] : 0); +} + +if(isset($_POST['submitPage'])) +{ + $page -> submitPage(); +} + +if(isset($_POST['uploadfiles'])) +{ + + $page -> uploadPage(); + $id = $_POST['pe_id']; + $sub_action = ($_POST['pe_id']) ? "edit" : ""; + $page -> createPage($_POST['mode']); +} + +if(isset($_POST['submitMenu'])) +{ + $page -> submitPage("", TRUE); +} + +if(isset($_POST['updateMenu'])) +{ + $page -> submitPage($_POST['pe_id'], TRUE); +} + +if(isset($_POST['updatePage'])) +{ + $page -> submitPage($_POST['pe_id']); +} + +if(isset($_POST['delete'])) +{ + foreach(array_keys($_POST['delete']) as $pid) + { + $page -> delete_page($pid); + } +} + +if (isset($_POST['saveOptions'])) { + $page -> saveSettings(); +} + +if($page->message) +{ + $ns->tablerender("", "
".$page->message."
"); +} + +if(!e_QUERY) +{ + $page -> showExistingPages(); +} +else +{ + $function = $action."Page"; + $page -> $function(); +} + +require_once(e_ADMIN."footer.php"); + +class page +{ + var $message; + + function showExistingPages() + { + global $sql, $tp, $ns; + + $text = "
"; + + if(!$sql -> db_Select("page", "*", "ORDER BY page_datestamp DESC", "nowhere")) + { + $text .= CUSLAN_42; + } + else + { + $pages = $sql -> db_getList('ALL', FALSE, FALSE); + $text .= "
+ + + + + + + "; + + foreach($pages as $pge) + { + $text .= " + + + + + + "; + } + + $text .= " +
ID".CUSLAN_1."".CUSLAN_2."".CUSLAN_3."
$pge[page_id]$pge[page_title]".($pge[page_theme] ? "menu" : "page")." + ".ADMIN_EDIT_ICON." + +
+
"; + } + + $text .= " +
"; + + $ns -> tablerender(CUSLAN_5, $text); + } + + function createmPage() + { + $this -> createPage(TRUE); + } + + function uploadPage() + { + global $pref; + $pref['upload_storagetype'] = "1"; + require_once(e_HANDLER."upload_handler.php"); + $uploaded = file_upload(e_IMAGE."custom/"); + } + + function createPage($mode=FALSE) + { + /* mode: FALSE == page, mode: TRUE == menu */ + + global $sql, $tp, $ns, $pref, $sub_action, $id; + + if ($sub_action == "edit" && !$_POST['preview'] && !$_POST['submit']) + { + if ($sql->db_Select("page", "*", "page_id='$id' ")) + { + $row = $sql->db_Fetch(); + $page_class = $row['page_class']; + $page_password = $row['page_password']; + $page_title = $tp -> toFORM($row['page_title']); + $page_rating_flag = $row['page_rating_flag']; + $page_comment_flag = $row['page_comment_flag']; + $page_display_authordate_flag = $row['page_author']; + $data = $tp -> toFORM($row['page_text']); + $edit = TRUE; + } + + if ($sql -> db_Select("links", "*", "link_url='page.php?".$id."'")) + { + $row = $sql -> db_Fetch(); + $page_link = $row['link_name']; + } + } + + $text = "
+
+ "; + + if($mode) + { + $text .= " + + + "; + } + + $text .= " + + + + + + + + + + + + + "; + + if(!$mode) + { + $text .= " + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "; + } + + $text .= " + + + +
".CUSLAN_7.""; + + if($edit) + { + $text .= $page_theme; + } + else + { + $text .= ""; + } + + $text .= "
".CUSLAN_8."
".CUSLAN_9.""; + + require_once(e_HANDLER."ren_help.php"); + $insertjs = (!e_WYSIWYG)?"rows='15' onselect='storeCaret(this);' onclick='storeCaret(this);' onkeyup='storeCaret(this);' style='width:95%'": "rows='25' style='width:100%' "; + $data = $tp->toForm($data); + $text .= ""; + + $text .= "
".display_help('',"cpage")."
".LAN_UPLOAD_IMAGES."".$tp->parseTemplate("{UPLOADFILE=".e_IMAGE."custom/}")."
".CUSLAN_10." + ".CUSLAN_38."   + ".CUSLAN_39." +
".CUSLAN_13." + ".CUSLAN_38."   + ".CUSLAN_39." +
".CUSLAN_41." + ".CUSLAN_38."   + ".CUSLAN_39." +
".CUSLAN_14."
".CUSLAN_15."
".CUSLAN_16."
".CUSLAN_17."
".CUSLAN_18."".r_userclass("page_class", $page_class)."
". + + (!$mode ? + ($edit ? "" : "") : + ($edit ? "" : "")) + + ." +
+
+
"; + + $caption =(!$mode ? ($edit ? CUSLAN_23 : CUSLAN_24) : ($edit ? CUSLAN_25 : CUSLAN_26)); + $ns -> tablerender($caption, $text); + } + + + function submitPage($mode = FALSE, $type=FALSE) + { + global $sql, $tp, $e107cache; + + $page_title = $tp -> toDB($_POST['page_title']); + $page_text = $tp -> toDB($_POST['data']); + $pauthor = ($_POST['page_display_authordate_flag'] ? USERID : 0); + + if($mode) + { + $update = $sql -> db_Update("page", "page_title='$page_title', page_text='$page_text', page_author='$pauthor', page_rating_flag='".intval($_POST['page_rating_flag'])."', page_comment_flag='".intval($_POST['page_comment_flag'])."', page_password='".$_POST['page_password']."', page_class='".$_POST['page_class']."', page_ip_restrict='".$_POST['page_ip_restrict']."' WHERE page_id='$mode'"); + $e107cache->clear("page_{$mode}"); + $e107cache->clear("page-t_{$mode}"); + + if ($_POST['page_link']) + { + if ($sql -> db_Select("links", "link_id", "link_url='page.php?".$mode."' && link_name!='".$tp -> toDB($_POST['page_link'])."'")) + { + $sql -> db_Update("links", "link_name='".$tp -> toDB($_POST['page_link'])."' WHERE link_url='page.php?".$mode."'"); + $update++; + $e107cache->clear("sitelinks"); + } + else if (!$sql -> db_Select("links", "link_id", "link_url='page.php?".$mode."'")) + { + $sql -> db_Insert("links", "0, '".$tp -> toDB($_POST['page_link'])."', 'page.php?".$mode."', '', '', 1, 0, 0, 0, ".$_POST['page_class']); + $update++; + $e107cache->clear("sitelinks"); + } + } else { + if ($sql -> db_Select("links", "link_id", "link_url='page.php?".$mode."'")) + { + $sql -> db_Delete("links", "link_url='page.php?".$mode."'"); + $update++; + $e107cache->clear("sitelinks"); + } + } + admin_update($update, 'update', "Page updated in database."); + } + else + { + + $menuname = ($type ? $tp -> toDB($_POST['menu_name']) : ""); + + admin_update($sql -> db_Insert("page", "0, '$page_title', '$page_text', '$pauthor', '".time()."', '".intval($_POST['page_rating_flag'])."', '".intval($_POST['page_comment_flag'])."', '".$_POST['page_password']."', '".$_POST['page_class']."', '', '".$menuname."'"), 'insert', CUSLAN_27); + + if($type) + { + $sql -> db_Insert("menus", "0, '$menuname', '0', '0', '0', '', '".mysql_insert_id()."' "); + } + + if($_POST['page_link']) + { + $link = "page.php?".mysql_insert_id(); + if (!$sql->db_Select("links", "link_id", "link_name='".$tp -> toDB($_POST['page_link'])."'")) + { + $linkname = $tp -> toDB($_POST['page_link']); + $sql->db_Insert("links", "0, '$linkname', '$link', '', '', 1, 0, 0, 0, ".$_POST['page_class']); + $e107cache->clear("sitelinks"); + } + } + } + } + + function delete_page($del_id) + { + global $sql, $e107cache; + admin_update($sql -> db_Delete("page", "page_id='$del_id' "), 'delete', CUSLAN_28); + $sql -> db_Delete("menus", "menu_path='$del_id' "); + if ($sql -> db_Select("links", "link_id", "link_url='page.php?".$del_id."'")) + { + $sql -> db_Delete("links", "link_url='page.php?".$del_id."'"); + $e107cache->clear("sitelinks"); + } + } + + function optionsPage() + { + global $ns, $pref; + + if(!isset($pref['pageCookieExpire'])) $pref['pageCookieExpire'] = 84600; + + $text = "
+
+ + + + + + + + + + + + + + + +
".CUSLAN_29." + ".CUSLAN_38."   + ".CUSLAN_39." +
".CUSLAN_30." + +
+ +
+
+
"; + + $ns->tablerender("Options", $text); + } + + + function saveSettings() + { + global $pref; + $pref['listPages'] = $_POST['listPages']; + $pref['pageCookieExpire'] = $_POST['pageCookieExpire']; + save_prefs(); + $this -> message = "Settings saved."; + } + + function show_options($action) + { + if ($action == "") + { + $action = "main"; + } + $var['main']['text'] = CUSLAN_11; + $var['main']['link'] = e_SELF; + + $var['create']['text'] = CUSLAN_12; + $var['create']['link'] = e_SELF."?create"; + + $var['createm']['text'] = CUSLAN_31; + $var['createm']['link'] = e_SELF."?createm"; + + $var['options']['text'] = LAN_OPTIONS; + $var['options']['link'] = e_SELF."?options"; + + + show_admin_menu(CUSLAN_33, $action, $var); + } +} + +function cpage_adminmenu() { + global $page; + global $action; + $page -> show_options($action); +} + +?> diff --git a/e107_admin/credits.php b/e107_admin/credits.php new file mode 100644 index 000000000..f4a086ea6 --- /dev/null +++ b/e107_admin/credits.php @@ -0,0 +1,257 @@ + "MagpieRSS", + "url" => "http://magpierss.sourceforge.net/", + "description" => CRELAN_10, + "version" => "0.71.1", + "licence" => "GPL, ".CRELAN_8 + ), + array( "name" => "PCLZip", + "url" => "http://www.phpconcept.net/pclzip/", + "description" => CRELAN_11, + "version" => "2.3", + "licence" => "GPL" + ), + array( "name" => "PCLTar", + "url" => "http://www.phpconcept.net/pcltar/", + "description" => CRELAN_12, + "version" => "1.3", + "licence" => "GPL" + ), + array( "name" => "TinyMCE", + "url" => "http://tinymce.moxiecode.com/", + "description" => CRELAN_13, + "version" => "2.08", + "licence" => "GPL" + ), + array( "name" => "Nuvolo Icons", + "url" => "http://www.icon-king.com", + "description" => CRELAN_14, + "version" => "1.0", + "licence" => "GPL" + ), + array( "name" => "PHPMailer", + "url" => "http://phpmailer.sourceforge.net/", + "description" => CRELAN_15, + "version" => "1.72", + "licence" => "GPL" + ), + array( "name" => "Brainjar DHTML Menu", + "url" => "http://www.brainjar.com/dhtml/menubar/", + "description" => CRELAN_16, + "version" => "0.1", + "licence" => "GPL, ".CRELAN_8 + ), + array( "name" => "DHTML / JavaScript Calendar", + "url" => "http://www.dynarch.com/projects/", + "description" => CRELAN_17, + "version" => "1.0", + "licence" => "GPL" + ), + array( "name" => "FPDF", + "url" => "http://www.fpdf.org/", + "description" => CRELAN_18, + "version" => "1.53", + "licence" => "Freeware" + ), + array( "name" => "UFPDF", + "url" => "http://www.acko.net/node/56", + "description" => CRELAN_19, + "version" => "0.1", + "licence" => "GPL" + ), + ); + +$contentA = array( + "

".CRELAN_6."<\/h3>", + "

Carl Cedergren<\/h1>[ asperon ]


".CRELAN_20, + "

Cameron Hanly<\/h1>[ CaMer0n ]


".CRELAN_21, + "

Steve Dunstan<\/h1>[ jalist ]


".CRELAN_22, + "

Eric Vanderfeesten<\/h1> [ lisa ]


".CRELAN_23, + "

Thom Michelbrink<\/h1>[ McFly ]


".CRELAN_24, + "

William Moffett<\/h1>[ que ]


".CRELAN_25, + "

Martin Nicholls<\/h1>[ streaky ]


".CRELAN_26, + "

James Currie<\/h1>[ SweetAs ]


".CRELAN_27, + "

Pete Holzmann<\/h1>[ MrPete ]


".CRELAN_28 +); + +echo " + + +".PAGE_NAME." + + + + + + +
+
".CRELAN_7." ".$e107info['e107_version'].", build ".($e107info['e107_build'] ? $e107info['e107_build'] : "zero")."
© 2002-2006, ".CRELAN_3."
+ +"; + + +$fadejs = " + + +TEXT; + +echo $fadejs; + +echo " +
+
". +(e_QUERY && e_QUERY == "stps" ? "" : "")."
+
+
+ +
+ + +"; + +?> diff --git a/e107_admin/db.php b/e107_admin/db.php new file mode 100644 index 000000000..c8e7bf869 --- /dev/null +++ b/e107_admin/db.php @@ -0,0 +1,281 @@ + +
\n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
".DBLAN_15."
".DBLAN_4."
".DBLAN_6."
".DBLAN_28."
".DBLAN_19."
".DBLAN_8." + +
+
+

"; + +$ns->tablerender(DBLAN_10, $text); + +function backup_core() { + global $pref, $sql; + $tmp = base64_encode((serialize($pref))); + if (!$sql->db_Insert("core", "'pref_backup', '{$tmp}' ")) { + $sql->db_Update("core", "e107_value='{$tmp}' WHERE e107_name='pref_backup'"); + } +} + +function optimizesql($mySQLdefaultdb) { + + $result = mysql_list_tables($mySQLdefaultdb); + while ($row = mysql_fetch_row($result)) { + mysql_query("OPTIMIZE TABLE ".$row[0]); + } + + $str = " +
+ ".DBLAN_11." $mySQLdefaultdb ".DBLAN_12.". + +

+ +
+ +
+
+
"; + $ns = new e107table; + $ns->tablerender(DBLAN_14, $str); + +} + +function plugin_viewscan() +{ + global $sql, $pref, $ns, $tp; + require_once(e_HANDLER."plugin_class.php"); + $ep = new e107plugin; + $ep->update_plugins_table(); // scan for e_xxx changes and save to plugin table. + $ep->save_addon_prefs(); // generate global e_xxx_list prefs from plugin table. + + $ns -> tablerender(DBLAN_22, "
".DBLAN_23."

".DBLAN_13."
"); + + $text = "
+
+ + + + "; + + $sql -> db_Select("plugin", "*", "plugin_id !='' order by plugin_path ASC"); // Must order by path to pick up duplicates. (plugin names may change). + while($row = $sql-> db_Fetch()){ + $text .= " + + + + + "; + $previous = $row['plugin_path']; + } + $text .= "
".DBLAN_24."".DBLAN_25."".DBLAN_26."".DBLAN_27."
".$tp->toHtml($row['plugin_name'],FALSE,"defs")."".$row['plugin_path']."".str_replace(",","
",$row['plugin_addons'])."
"; + if($previous == $row['plugin_path']) + { + $delid = $row['plugin_id']; + $delname = $row['plugin_name']; + $text .= "\n"; + } + else + { + $text .= ($row['plugin_installflag'] == 1) ? DBLAN_27 : " "; // "Installed and not installed"; + } + $text .= "
"; + $ns -> tablerender(ADLAN_CL_7, $text); + +} + + +function pref_editor() +{ + global $pref,$ns,$tp; + ksort($pref); + + $text = "
+
+ + + + + + + "; + + foreach($pref as $key=>$val) + { + $ptext = (is_array($val)) ? "
".print_r($val,TRUE)."
" : htmlspecialchars($val); + $ptext = $tp -> textclean($ptext, 80); + + $text .= " + + + + + + "; + } + $text .= " +
".LAN_DELETE."".DBLAN_17."".DBLAN_18."".LAN_OPTIONS."
".$key."".$ptext." + +
+ +
"; + $text .= "

".DBLAN_13."
\n"; + $ns -> tablerender(DBLAN_20, $text); + + return $text; + +} + + + +function del_pref_val(){ + global $pref,$ns,$e107cache; + $del = array_keys($_POST['delpref']); + $delpref = $del[0]; + + if($delpref) + { + unset($pref[$delpref]); + $deleted_list .= "
  • ".$delpref."
  • "; + } + if($_POST['delpref2']){ + + foreach($_POST['delpref2'] as $k=>$v) + { + $deleted_list .= "
  • ".$k."
  • "; + unset($pref[$k]); + } + } + + $message = "

      ".$deleted_list."
    +

    ".DBLAN_13."
    "; + save_prefs(); + $e107cache->clear(); + $ns -> tablerender(LAN_DELETED,$message); + +} + +function delete_plugin_entry() +{ + global $sql,$ns; + $del = array_keys($_POST['delplug']); + $message = ($sql -> db_Delete("plugin", "plugin_id='".intval($del[0])."' LIMIT 1")) ? LAN_DELETED : LAN_DELETED_FAILED; + $caption = ($message == LAN_DELETED) ? LAN_DELETED : LAN_ERROR; + $ns -> tablerender($caption,$message); +} + +require_once("footer.php"); + +?> diff --git a/e107_admin/db_verify.php b/e107_admin/db_verify.php new file mode 100644 index 000000000..a5f916376 --- /dev/null +++ b/e107_admin/db_verify.php @@ -0,0 +1,402 @@ +
    "; + exit; +} + + $tables["core"] = $sql_data; + +if (!getperms("0")) { + header("location:".e_BASE."index.php"); + exit; +} + +//Get any plugin _sql.php files + + foreach($pref['e_sql_list'] as $path => $file) + { + $filename = e_PLUGIN.$path."/".$file.".php"; + if(is_readable($filename)){ + $fd = fopen($filename, "r"); + $sql_data = fread($fd, filesize($filename)); + fclose ($fd); + $id = str_replace("_sql","",$file); + $tables[$id] = $sql_data; + }else{ + echo $filename." is not readable
    "; + } + } + + + +function read_tables($tab) { + global $tablines; + global $table_list; + global $tables,$sql,$pref; + + $file = split("\n", $tables[$tab]); + foreach($file as $line) { + $line = ltrim(stripslashes($line)); + if (preg_match("/CREATE TABLE (.*) /", $line, $match)) { + if($match[1] != "user_extended"){ + $table_list[$match[1]] = 1; + $current_table = $match[1]; + $x = 0; + $cnt = 0; + } + } + + if (strpos($line, "TYPE=") !== FALSE) { + $current_table = ""; + } + + if ($current_table && $x) { + $tablines[$current_table][$cnt++] = $line; + + } + + $x = 1; + } + +// Get multi-language tables as well + if($pref['multilanguage']){ + $langs = table_list(); + foreach($table_list as $name=>$stuff){ + if($langs[$name]){ + $ltab = $langs[$name]; + $table_list[$ltab] = 1; + $tablines[$ltab] = $tablines[$name]; + } + } + } + +} + +function get_current($tab, $prefix = "") { + if (!$prefix) { + $prefix = MPREFIX; + } + $result = mysql_query('SET SQL_QUOTE_SHOW_CREATE = 1'); + $qry = 'SHOW CREATE TABLE `'.$prefix.$tab."`"; + $z = mysql_query($qry); + if ($z) { + $row = mysql_fetch_row($z); + return str_replace("`", "", stripslashes($row[1])); + } else { + + return FALSE; + } +} + +function check_tables($what) { + global $tablines; + global $table_list; + global $ns; + $cur=0; + $table_list = ""; + read_tables($what); + + $text = "
    +
    + + + + + + + "; + foreach(array_keys($table_list) as $k) { + + $prefix = MPREFIX; + $current_tab = get_current($k, $prefix); + unset($fields); + unset($xfields); + if ($current_tab) { + $lines = split("\n", $current_tab); + $fieldnum = 0; + foreach($tablines[$k] as $x) { + $fieldnum++; + $ffound = 0; + list($fname, $fparams) = split(" ", $x, 2); + if ($fname == "KEY") { + list($key, $keyname, $keyparms) = split(" ", $x, 3); + $fname = $key." ".$keyname; + $fparams = $keyparms; + } + $fields[$fname] = 1; + $fparams = ltrim(rtrim($fparams)); + $fparams = preg_replace("/\r?\n$|\r[^\n]$|,$/", "", $fparams); + + if(stristr($k, "lan_") !== FALSE && $cur != 1){ + $text .= ""; + $cur = 1; + }; + + + + $text .= ""; + $s = 0; + $xfieldnum = -1; + foreach($lines as $l) { + $xfieldnum++; + list($xl, $tmp) = split("\n", $l, 2); + $xl = ltrim(rtrim(stripslashes($xl))); + $xl = preg_replace("/\r?\n$|\r[^\n]$/", "", $xl); + list($xfname, $xfparams) = split(" ", $xl, 2); + + if ($xfname == "KEY") { + list($key, $keyname, $keyparms) = split(" ", $xl, 3); + $xfname = $key." ".$keyname; + $xfparams = $keyparms; + } + + if ($xfname != "CREATE" && $xfname != ")") { + $xfields[$xfname] = 1; + } + $xfparams = preg_replace("/,$/", "", $xfparams); + $fparams = preg_replace("/,$/", "", $fparams); + if ($xfname == $fname) { + $ffound = 1; + if (strcasecmp($fparams, $xfparams) != 0) { + $text .= ""; + $text .= ""; + $fix_active = TRUE; + } elseif($fieldnum != $xfieldnum) { + $text .= " + "; + } else { + $text .= " + "; + } + } + } + + if ($ffound == 0) { + $text .= " + "; + $fix_active = TRUE; + } + $prev_fname = $fname; + $text .= "\n"; + } + foreach(array_keys($xfields) as $tf) { + if (!$fields[$tf] && $k != "user_extended") { + $fix_active = TRUE; + $text .= ""; + } + } + } else { // Table Missing. + $text .= ""; + $fix_active = TRUE; + } + } + $text .= "
    ".DBLAN_4."".DBLAN_5."".DBLAN_6."".DBLAN_7."
    ".ADLAN_132."
    $k$fname"; + if (strpos($fparams, "KEY") !== FALSE) { + $text .= " $fparams"; + } + $text .= "".DBLAN_8."".DBLAN_9."
    ".$xfparams."
    ".DBLAN_10."
    ".$fparams."
    ".fix_form($k,$fname,$fparams,"alter")."
    ".DBLAN_5." ".DBLAN_8."".DBLAN_9." #{$xfieldnum}
    ".DBLAN_10." #{$fieldnum}
    OK ".DBLAN_11."".DBLAN_10." [$fparams]
    ".fix_form($k,$fname,$fparams,"insert",$prev_fname)."
    $k$tf".DBLAN_12." ".fix_form($k,$tf,$fparams,"drop")."
    $k ".DBLAN_13."
     ".fix_form($k,$tf,$tablines[$k],"create")."
    "; + + if($fix_active){ + $text .= "
    +
    \n"; + } + + foreach(array_keys($_POST) as $j) { + if (preg_match("/table_(.*)/", $j, $mitch)) { + $lx = $mitch[1]; + $text .= "\n"; + } + } + $text .= "
    "; + + return $text; +} + +global $table_list; + +// -------------------- Table Fixing ------------------------------ + +if(isset($_POST['do_fix'])){ + $text = "
    "; + foreach( $_POST['fix_active'] as $key=>$val){ + + if (MAGIC_QUOTES_GPC == TRUE) { + $table = stripslashes($_POST['fix_table'][$key][0]); + $newval = stripslashes($_POST['fix_newval'][$key][0]); + $mode = stripslashes($_POST['fix_mode'][$key][0]); + $after = stripslashes($_POST['fix_after'][$key][0]); + } else { + $table = $_POST['fix_table'][$key][0]; + $newval = $_POST['fix_newval'][$key][0]; + $mode = $_POST['fix_mode'][$key][0]; + $after = $_POST['fix_after'][$key][0]; + } + + + $field= $key; + + if($mode == "alter"){ + $query = "ALTER TABLE `".MPREFIX.$table."` CHANGE `$field` `$field` $newval"; + } + + if($mode == "insert"){ + $query = "ALTER TABLE `".MPREFIX.$table."` ADD `$field` $newval AFTER $after"; + } + + if($mode == "drop"){ + $query = "ALTER TABLE `".MPREFIX.$table."` DROP `$field` "; + } + + if($mode == "index"){ + $query = "ALTER TABLE `".MPREFIX.$table."` ADD INDEX `$field` (`$newval`)"; + } + + if($mode == "indexdrop"){ + $query = "ALTER TABLE `".MPREFIX.$table."` DROP INDEX `$field`"; + } + + if($mode == "create"){ + $query = "CREATE TABLE ".MPREFIX.$table." ($newval) TYPE=MyISAM;"; + } + + + $text .= ""; + + + } + $text .= "
    ".$query.""; + $text .= (mysql_query($query)) ? " - ".LAN_UPDATED."" : " - ".LAN_UPDATED_FAILED.""; + $text .= "
    "; + $text .="

    +
    + +
    +
    "; + + $ns -> tablerender(DBLAN_20, $text); +} + + + +// ---------------------- Main Form and Submit. ------------------------ +if (!$_POST['db_verify'] && !$_POST['do_fix']) { + $text = " +
    + +
    ".DBLAN_14."

    "; + foreach(array_keys($tables) as $x) { + $text .= "".$x."
    "; + } + $text .= " +
    +
    "; + $ns->tablerender(DBLAN_16, $text); +} else { + foreach(array_keys($_POST) as $k) { + if (preg_match("/table_(.*)/", $k, $match)) { + $xx = $match[1]; + $str = "
    +
    +
    + +
    +
    "; + $ns->tablerender(DBLAN_16." - $xx ".DBLAN_18, check_tables($xx).$str); + } + } +} + + + +// -------------------------------------------------------------- +function fix_form($table,$field, $newvalue,$mode,$after =''){ + + if(stristr($field, "KEY ") !== FALSE){ + $field = chop(str_replace("KEY ","",$field)); + $mode = ($mode == "drop") ? "indexdrop" : "index"; + $search = array("(",")"); + $newvalue = str_replace($search,"",$newvalue); + } + + if($mode == "create"){ + $newvalue = implode("\n",$newvalue); + } + + $text .= " ".DBLAN_19."\n"; // 'attempt to fix' + $text .= "\n"; + $text .= "\n"; + $text .= "\n"; + $text .= ($after) ? "\n" : ""; + + return $text; +} + +function table_list() { + // grab default language lists. + global $mySQLdefaultdb; + + $exclude[] = "banlist"; $exclude[] = "banner"; + $exclude[] = "cache"; $exclude[] = "core"; + $exclude[] = "online"; $exclude[] = "parser"; + $exclude[] = "plugin"; $exclude[] = "user"; + $exclude[] = "upload"; $exclude[] = "userclass_classes"; + $exclude[] = "rbinary"; $exclude[] = "session"; + $exclude[] = "tmp"; $exclude[] = "flood"; + $exclude[] = "stat_info"; $exclude[] = "stat_last"; + $exclude[] = "submit_news"; $exclude[] = "rate"; + $exclude[] = "stat_counter";$exclude[] = "user_extended"; + $exclude[] = "user_extended_struc"; + $exclude[] = "pm_messages"; + $exclude[] = "pm_blocks"; + + // print_r($search); + + $tables = mysql_list_tables($mySQLdefaultdb); + while (list($temp) = mysql_fetch_array($tables)){ + $prefix = MPREFIX."lan_"; + + if(preg_match("/^".$prefix."(.*)/", $temp, $match)){ + $e107tab = str_replace(MPREFIX, "", $temp); + $pos = strrpos($match[1],"_")+1; + $core = substr(str_replace("lan_","",$e107tab),$pos); + if (str_replace($exclude, "", $e107tab)){ + $tabs[$core] = $e107tab; + } + } + } + + return $tabs; +} + + + + +require_once(e_ADMIN."footer.php"); +?> diff --git a/e107_admin/docs.php b/e107_admin/docs.php new file mode 100644 index 000000000..1d5361765 --- /dev/null +++ b/e107_admin/docs.php @@ -0,0 +1,58 @@ +toHTML($text, TRUE); + $text = preg_replace("/Q\>(.*?)A>/si", "\\1A>", $text); + $text = str_replace("A>", "", $text); + + $ns->tablerender(str_replace("_", " ", $helplist[e_QUERY]), $text."
    "); + unset($text); +} + +require_once("footer.php"); +?> \ No newline at end of file diff --git a/e107_admin/download.php b/e107_admin/download.php new file mode 100644 index 000000000..8cd1440e8 --- /dev/null +++ b/e107_admin/download.php @@ -0,0 +1,1646 @@ +load_files(); +} + +$e_sub_cat = 'download'; + +require_once(e_HANDLER."form_handler.php"); +require_once(e_HANDLER."userclass_class.php"); +require_once(e_HANDLER."file_class.php"); + +$fl = new e_file; + +// -------- Presets. ------------ +require_once(e_HANDLER."preset_class.php"); +$pst = new e_preset; +$pst->form = array("myform","dlform"); // form id of the form that will have it's values saved. +$pst->page = array("download.php?create","download.php?cat"); // display preset options on which page(s). +$pst->id = array("admin_downloads","admin_dl_cat"); +// ------------------------------- + +$download = new download; +require_once("auth.php"); +$pst->save_preset(); // unique name(s) for the presets - comma separated. + + /* +One form example (no arrays needed) +$pst->form = "myform"; // form id of the form that will have it's values saved. +$pst->page = "download.php?create"; // display preset options on which page. +$pst->save_preset("admin_downloads"); // unique name for the preset +*/ + +$rs = new form; +if (e_QUERY) { + $tmp = explode(".", e_QUERY); + $action = $tmp[0]; + $sub_action = $tmp[1]; + $id = $tmp[2]; + $from = ($tmp[3] ? $tmp[3] : 0); + unset($tmp); +} + +if(isset($_POST['delete'])) +{ + $tmp = array_keys($_POST['delete']); + list($delete, $del_id) = explode("_", $tmp[0]); + unset($_POST['searchquery']); +} + +$from = ($from ? $from : 0); +$amount = 50; + + +if($file_array = $fl->get_files(e_DOWNLOAD, "","standard",2)){ + sort($file_array); +} + +if($public_array = $fl->get_files(e_FILE."public/")){ + foreach($public_array as $key=>$val){ + $file_array[] = str_replace(e_FILE."public/","",$val); + } +} + + + +if ($sql->db_Select("rbinary")){ + while ($row = $sql->db_Fetch()) { + extract($row); + $file_array[] = "Binary ".$binary_id."/".$binary_name; + } +} + + + +if($image_array = $fl->get_files(e_FILE."downloadimages/", ".gif|.jpg|.png|.GIF|.JPG|.PNG","standard",2)){ + sort($image_array); +} + +if($thumb_array = $fl->get_files(e_FILE."downloadthumbs/", ".gif|.jpg|.png|.GIF|.JPG|.PNG","standard",2)){ + sort($thumb_array); +} + +if(isset($_POST)){ + $e107cache->clear("download_cat"); +} + +if (isset($_POST['add_category'])) { + $download->create_category($sub_action, $id); +} + +if (isset($_POST['submit_download'])) { + $download->submit_download($sub_action, $id); + $action = "main"; + unset($sub_action, $id); +} + + +if(isset($_POST['update_catorder'])){ + foreach($_POST['catorder'] as $key=>$order){ + if($_POST['catorder'][$key]){ + $sql -> db_Update("download_category", "download_category_order='".intval($order)."' WHERE download_category_id='".intval($key)."'"); + } + } + $ns->tablerender("", "
    ".LAN_UPDATED."
    "); +} + +if (isset($_POST['updateoptions'])) +{ + $pref['download_php'] = $_POST['download_php']; + $pref['download_view'] = $_POST['download_view']; + $pref['download_sort'] = $_POST['download_sort']; + $pref['download_order'] = $_POST['download_order']; + $pref['agree_flag'] = $_POST['agree_flag']; + $pref['download_email'] = $_POST['download_email']; + $pref['agree_text'] = $tp->toDB($_POST['agree_text']); + $pref['download_denied'] = $tp->toDB($_POST['download_denied']); + $pref['download_reportbroken'] = $_POST['download_reportbroken']; + save_prefs(); + $message = DOWLAN_65; +} + +if(isset($_POST['addlimit'])) +{ + if($sql->db_Select('generic','gen_id',"gen_type = 'download_limit' AND gen_datestamp = {$_POST['newlimit_class']}")) + { + $message = DOWLAN_116; + } + else + { + if($sql->db_Insert('generic',"0, 'download_limit', '".intval($_POST['newlimit_class'])."', '".intval($_POST['new_bw_num'])."', '".intval($_POST['new_bw_days'])."', '".intval($_POST['new_count_num'])."', '".intval($_POST['new_count_days'])."'")) + { + $message = DOWLAN_117; + } + else + { + $message = DOWLAN_118; + } + } +} + +if(isset($_POST['updatelimits'])) +{ + + if($pref['download_limits'] != $_POST['download_limits']) + { + $pref['download_limits'] = ($_POST['download_limits'] == 'on') ? 1 : 0; + save_prefs(); + $message .= DOWLAN_126."
    "; + } + foreach(array_keys($_POST['count_num']) as $id) + { + if(!$_POST['count_num'][$id] && !$_POST['count_days'][$id] && !$_POST['bw_num'][$id] && !$_POST['bw_days'][$id]) + { + //All entries empty - Remove record + if($sql->db_Delete('generic',"gen_id = {$id}")) + { + $message .= $id." - ".DOWLAN_119."
    "; + } + else + { + $message .= $id." - ".DOWLAN_120."
    "; + } + } + else + { + $sql->db_Update('generic',"gen_user_id = '".intval($_POST['bw_num'][$id])."', gen_ip = '".intval($_POST['bw_days'][$id])."', gen_intdata = '".intval($_POST['count_num'][$id])."', gen_chardata = '".intval($_POST['count_days'][$id])."' WHERE gen_id = {$id}"); + $message .= $id." - ".DOWLAN_121."
    "; + } + } +} + +if(isset($_POST['submit_mirror'])) +{ + $download->submit_mirror($sub_action, $id); +} + +if($action == "mirror") +{ + $download -> show_existing_mirrors(); +} + + +if ($action == "dlm") +{ + $action = "create"; + $id = $sub_action; + $sub_action = "dlm"; +} + +if ($action == "create") { + $download->create_download($sub_action, $id); +} + +if ($delete == 'category') { + if (admin_update($sql->db_Delete("download_category", "download_category_id='$del_id' "), 'delete', DOWLAN_49." #".$del_id." ".DOWLAN_36)) { + $sql->db_Delete("download_category", "download_category_parent='{$del_id}' "); + } +} + +if ($action == "cat") { + $download->show_categories($sub_action, $id); +} + +if ($delete == 'main') { + + $result = admin_update($sql->db_Delete("download", "download_id='$del_id' "), 'delete', DOWLAN_27." #".$del_id." ".DOWLAN_36); + if($result) + { + admin_purge_related("download", $del_id); + $e_event->trigger("dldelete", $del_id); + } + unset($sub_action, $id); +} + + +if (isset($message)) { + $ns->tablerender("", "
    ".$message."
    "); +} + +if (!e_QUERY || $action == "main") { + $download->show_existing_items($action, $sub_action, $id, $from, $amount); +} + + +if ($action == "opt") { + global $pref, $ns; + $agree_flag = $pref['agree_flag']; + $agree_text = $pref['agree_text']; + $text = "
    +
    \n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ".DOWLAN_69.""; + $c = $pref['download_php'] ? " checked = 'checked' " : ""; + $text .= " ".DOWLAN_70."
    + ".DOWLAN_55." + + +
    + ".DOWLAN_56." + + + +
    + ".LAN_ORDER." + + +
    ".DOWLAN_151."". r_userclass("download_reportbroken", $_POST['download_reportbroken'])."
    ".DOWLAN_150."". ($pref['download_email'] ? "" : "")."
    ".DOWLAN_100."". ($agree_flag ? "" : "")."
    + ".DOWLAN_101." + + +
    + ".DOWLAN_146." + + +
    + +
    +
    +
    "; + $ns->tablerender(DOWLAN_54, $text); +} + +if($action == 'limits') +{ + if($sql->db_Select('userclass_classes','userclass_id, userclass_name')) + { + $classList = $sql->db_getList(); + } + if($sql->db_Select("generic", "gen_id as limit_id, gen_datestamp as limit_classnum, gen_user_id as limit_bw_num, gen_ip as limit_bw_days, gen_intdata as limit_count_num, gen_chardata as limit_count_days", "gen_type = 'download_limit'")) + { + while($row = $sql->db_Fetch()) + { + $limitList[$row['limit_classnum']] = $row; + } + } + $txt = " +
    + + + + + + + + + + + "; + + foreach($limitList as $row) + { + $txt .= " + + + + + + + "; + } + + $txt .= " + + + + + + + + + + + + + + + "; + + $txt .= "
    + "; + if($pref['download_limits'] == 1) + { + $chk = "checked = 'checked'"; + } + else + { + $chk = ""; + } + + $txt .= " + ".DOWLAN_125." +
    ".DOWLAN_67."".DOWLAN_113."".DOWLAN_107."".DOWLAN_108."
    ".$row['limit_id']."".r_userclass_name($row['limit_classnum'])." + ".DOWLAN_109." + ".DOWLAN_110." + + ".DOWLAN_111." ".DOWLAN_109." + ".DOWLAN_110." +
    + +


    ".r_userclass("newlimit_class", 0, "off", "guest, member, admin, classes, language")." + ".DOWLAN_109." + ".DOWLAN_110." + + ".DOWLAN_111." ".DOWLAN_109." + ".DOWLAN_110." +
    + +
    "; + + $ns->tablerender(DOWLAN_112, $txt); + require_once(e_ADMIN.'footer.php'); + exit; +} + +//$download->show_options($action); + +require_once("footer.php"); +exit; + +class download { + + function show_existing_items($action, $sub_action, $id, $from, $amount) { + global $sql, $rs, $ns, $tp, $mySQLdefaultdb,$pref; + $text = "
    "; + $sortorder = ($pref['download_order']) ? $pref['download_order'] : "download_datestamp"; + if(isset($_POST['searchdisp'])){ + $pref['admin_download_disp'] = implode("|",$_POST['searchdisp']); + save_prefs(); + } + + if(!$pref['admin_download_disp']){ + $search_display = array("download_name","download_class"); + }else{ + $search_display = explode("|",$pref['admin_download_disp']); + } + + $query = "SELECT d.*, dc.* FROM #download AS d LEFT JOIN #download_category AS dc ON dc. download_category_id = d.download_category"; + + if (isset($_POST['searchquery']) && $_POST['searchquery'] != "") { + $query .= " WHERE download_url REGEXP('".$_POST['searchquery']."') OR download_author REGEXP('".$_POST['searchquery']."') OR download_description REGEXP('".$_POST['searchquery']."') "; + foreach($search_display as $disp){ + $query .= " OR $disp REGEXP('".$_POST['searchquery']."') "; + } + $query .= " ORDER BY ".$sortorder." DESC"; + } else { + $query .= " ORDER BY ".($sub_action ? $sub_action : $sortorder)." ".($id ? $id : "DESC")." LIMIT $from, $amount"; + } + + if ($sql->db_Select_gen($query)) { + $text .= $rs->form_open("post", e_SELF."?".e_QUERY, "myform")." + + + + "; + +// Search Display Column header.---------- + foreach($search_display as $disp){ + if($disp == "download_name"){ + $text .= ""; + }else{ + $repl = array("download_","_"); + $text .= ""; + } + } + +// ------------------------------ + $text .=" + + "; + while ($row = $sql->db_Fetch()) { + extract($row); + $text .= " + "; + +// Display Chosen options ------------------------------------- + $bolean_list = array("download_active","download_comment"); + + foreach($search_display as $disp){ + $text .= ""; + } +// ------------------------------------------------------------- + + $text .= " + + "; + } + $text .= "
    ID".DOWLAN_27."".ucwords(str_replace($repl," ",$disp))."".LAN_OPTIONS."
    $download_id"; + + if($disp == "download_name"){ + $text .= "$download_name"; + }elseif($disp == "download_category"){ + $text .= $row['download_category_name']." "; + }elseif($disp == "download_datestamp"){ + $text .= ($row[$disp]) ? strftime($pref['shortdate'],$row[$disp])." " : " "; + }elseif($disp == "download_class" || $disp == "download_visible"){ + $text .= r_userclass_name($row[$disp])." "; + }elseif($disp == "download_filesize"){ + $text .= ($row[$disp]) ? round(($row[$disp] / 1000))." Kb " : " "; + }elseif($disp == "download_thumb"){ + $text .= ($row[$disp]) ? "" : ""; + }elseif($disp == "download_image"){ + $text .= "".$row[$disp]." "; + }elseif($disp == "download_description"){ + $text .= $tp->toHTML($row[$disp],TRUE)." "; + }elseif($disp == "download_active"){ + if($row[$disp]== 1){ $text .= "\n"; } + elseif($row[$disp]== 2){ $text .= "\n"; } + else{ $text .= "\n"; } + }elseif($disp == "download_comment"){ + $text .= ($row[$disp]) ? ADMIN_TRUE_ICON : " "; + }else{ + $text .= $row[$disp]." "; + } + + $text .= " + ".ADMIN_EDIT_ICON." + toJS(DOWLAN_33." [ID: $download_id ]")."') \" /> +
    "; + } else { + $text .= "
    ".DOWLAN_6."
    "; + } + $text .= "
    "; + +// Next-Previous. ========================== + + $downloads = $sql->db_Count("download"); + if ($downloads > $amount && !$_POST['searchquery']) { + $parms = "{$downloads},{$amount},{$from},".e_SELF."?".(e_QUERY ? "$action.$sub_action.$id." : "main.download_id.desc.")."[FROM]"; + $text .= "
    ".$tp->parseTemplate("{NEXTPREV={$parms}}"); + } + + +// Search & display options etc. =========================. + + $text .= "
    \n

    \n\n\n

    "; + + $text .= "
    ".LAN_DISPLAYOPT."
    "; + $text .= " +
    \n +
    "; +// ====================== + + $ns->tablerender(DOWLAN_7, $text); + } + + function show_options($action) { + + if ($action == "") { + $action = "main"; + } + $var['main']['text'] = DOWLAN_29; + $var['main']['link'] = e_SELF; + + $var['create']['text'] = DOWLAN_30; + $var['create']['link'] = e_SELF."?create"; + + $var['cat']['text'] = DOWLAN_31; + $var['cat']['link'] = e_SELF."?cat"; + $var['cat']['perm'] = "Q"; + + $var['opt']['text'] = LAN_OPTIONS; + $var['opt']['link'] = e_SELF."?opt"; + + $var['limits']['text'] = DOWLAN_112; + $var['limits']['link'] = e_SELF."?limits"; + + $var['mirror']['text'] = DOWLAN_128; + $var['mirror']['link'] = e_SELF."?mirror"; + + show_admin_menu(DOWLAN_32, $action, $var); + + } + + +// --------------------------------------------------------------------------- + + + function create_download($sub_action, $id) { + + + global $cal,$tp, $sql, $fl, $rs, $ns, $file_array, $image_array, $thumb_array,$pst; + require_once(e_FILE."shortcode/batch/download_shortcodes.php"); + + $download_status[0] = DOWLAN_122; + $download_status[1] = DOWLAN_123; + $download_status[2] = DOWLAN_124; + $preset = $pst->read_preset("admin_downloads"); // read preset values into array + extract($preset); + + if (!$sql->db_Select("download_category")) { + $ns->tablerender(ADLAN_24, "
    ".DOWLAN_5."
    "); + return; + } + $download_active = 1; + if ($sub_action == "edit" && !$_POST['submit']) { + if ($sql->db_Select("download", "*", "download_id='$id' ")) { + $row = $sql->db_Fetch(); + extract($row); + + if($download_mirror) + { + + $mirrorTArray = explode(chr(1), $download_mirror); + $mirrorArray = array(); + + $count=0; + foreach($mirrorTArray as $mirror) + { + if($mirror) + { + list($mid, $murl) = explode(",", $mirror); + $mirrorArray[$count]['id'] = $mid; + $mirrorArray[$count]['url'] = $murl; + $count++; + } + } + } + } + } + + if ($sub_action == "dlm" && !$_POST['submit']) { + if ($sql->db_Select("upload", "*", "upload_id='$id' ")) { + $row = $sql->db_Fetch(); + + $download_category = $row['upload_category']; + $download_name = $row['upload_name'].($row['upload_version'] ? " v" . $row['upload_version'] : ""); + $download_url = $row['upload_file']; + $download_author_email = $row['upload_email']; + $download_author_website = $row['upload_website']; + $download_description = $row['upload_description']; + $download_image = $row['upload_ss']; + $download_filesize = $row['upload_filesize']; + $image_array[] = array("path" => "", "fname" => $row['upload_ss']); + $download_author = substr($row['upload_poster'], (strpos($row['upload_poster'], ".")+1)); + } + } + + + $text = " +
    +
    + + + + + + + + + + + + + + + + + + + "; + } + else + { + + $text .= DOWLAN_132."
    +
    "; + + $mirrorList = $sql -> db_getList(); + + $m_count = (count($mirrorArray) ? count($mirrorArray) : 1); + + for($count = 1; $count <= $m_count; $count++){ + + $opt = ($count==1) ? "id='mirror'" : ""; + $text .=" + + "; + $text .= "
    "; + } + + $text .="

    + + + + + + + + "; + } + + $text .= " + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "; + + + $text .= " + + + + + + + + + + + "; + + if ($sub_action == "dlm") { + $text .= " + + + + + + + + + + + + "; + } + + $text .= " + + + +
    ".DOWLAN_11.""; + + $text .= $tp->parseTemplate("{DOWNLOAD_CATEGORY_SELECT={$download_category}}",true,$download_shortcodes); + + $text .= "
    ".DOWLAN_12.": + toForm($download_name)."\" maxlength='200' /> +
    ".DOWLAN_13.":
    ".DOWLAN_131."   + +
    + ".DOWLAN_149." + + +
    ".DOWLAN_128.":"; + + if(!$sql -> db_Select("download_mirror")) + { + $text .= DOWLAN_144."
    ".DOWLAN_155." + + ".DOWLAN_156."
    + ".DOWLAN_157." +
    ".DOWLAN_15.": + +
    ".DOWLAN_16.": + +
    ".DOWLAN_17.": + +
    ".DOWLAN_18.": + +
    ".DOWLAN_19.": + "; + + if($sub_action == "dlm" && $download_image) + { + $text .= " + \n"; + } + + $text .= " +
    ".DOWLAN_20.": + +
    ".LAN_DATESTAMP.": + "; + if(!$download_datestamp){ + $download_datestamp = time(); + } + $cal_options['firstDay'] = 0; + $cal_options['showsTime'] = false; + $cal_options['showOthers'] = false; + $cal_options['weekNumbers'] = false; + $cal_options['ifFormat'] = "%d/%m/%Y %H:%M:%S"; + $cal_options['timeFormat'] = "24"; + $cal_attrib['class'] = "tbox"; + $cal_attrib['size'] = "12"; + $cal_attrib['name'] = "download_datestamp"; + $cal_attrib['value'] = date("d/m/Y H:i:s", $download_datestamp); + $text .= $cal->make_input_field($cal_options, $cal_attrib); + + $update_checked = ($_POST['update_datestamp']) ? "checked='checked'" : ""; + $text .= "  ".DOWLAN_148." + +
    ".DOWLAN_21.": + "; + + $text .= "
    ".DOWLAN_102.":"; + + + if ($download_comment == "0") { + $text .= LAN_YES.": + ".LAN_NO.": "; + } else { + $text .= LAN_YES.": + ".LAN_NO.": "; + } + + $text .= "
    ".DOWLAN_145.":".r_userclass('download_visible', $download_visible, 'off', 'public, nobody, member, admin, classes, language')."
    ".DOWLAN_106.":".r_userclass('download_class', $download_class, 'off', 'public, nobody, member, admin, classes, language')."
    ".DOWLAN_153.":
    + +
    ".DOWLAN_103.":
    + + +
    "; + + + if ($id && $sub_action == "edit") { + $text .= " "; + } else { + $text .= ""; + } + + $text .= "
    +
    +
    "; + $ns->tablerender(ADLAN_24, $text); + } + + +// ----------------------------------------------------------------------------- + + + function show_message($message) { + global $ns; + $ns->tablerender("", "
    ".$message."
    "); + } + + +// ----------------------------------------------------------------------------- + + + + function submit_download($sub_action, $id) { + global $tp, $sql, $DOWNLOADS_DIRECTORY, $e_event; + + if($sub_action == 'edit') + { + if($_POST['download_url_external'] == '') + { + $_POST['download_filesize_external'] = FALSE; + } + } + + if ($_POST['download_url_external'] && $_POST['download_url'] == '') + { + $durl = $_POST['download_url_external']; + $filesize = $_POST['download_filesize_external']; + } + else + { + $durl = $_POST['download_url']; + if($_POST['download_filesize_external']) + { + $filesize = $_POST['download_filesize_external']; + } + else + { + if (strpos($DOWNLOADS_DIRECTORY, "/") === 0 || strpos($DOWNLOADS_DIRECTORY, ":") >= 1) + { + $filesize = filesize($DOWNLOADS_DIRECTORY.$durl); + } + else + { + $filesize = filesize(e_BASE.$DOWNLOADS_DIRECTORY.$durl); + } + } + } + + if (!$filesize) + { + if($sql->db_Select("upload", "upload_filesize", "upload_file='$durl'")) + { + $row = $sql->db_Fetch(); + $filesize = $row['upload_filesize']; + } + } + + // ---- Move Images and Files ------------ + + if($_POST['move_image']) + { + if($_POST['download_thumb']) + { + $oldname = e_FILE."public/".$_POST['download_thumb']; + $newname = e_FILE."downloadthumbs/".$_POST['download_thumb']; + if(!$this -> move_file($oldname,$newname)) + { + return; + } + } + if($_POST['download_image']) + { + $oldname = e_FILE."public/".$_POST['download_image']; + $newname = e_FILE."downloadimages/".$_POST['download_image']; + if(!$this -> move_file($oldname,$newname)) + { + return; + } + } + } + + if($_POST['move_file'] && $_POST['download_url']) + { + $oldname = e_FILE."public/".$_POST['download_url']; + $newname = $_POST['move_file'].$_POST['download_url']; + if(!$this -> move_file($oldname,$newname)) + { + return; + } + $durl = str_replace(e_DOWNLOAD,"",$newname); + } + + + // ------------------------------------------ + + + $_POST['download_description'] = $tp->toDB($_POST['download_description']); + $_POST['download_name'] = $tp->toDB($_POST['download_name']); + $_POST['download_author'] = $tp->toDB($_POST['download_author']); + + if (preg_match("#(.*?)/(.*?)/(.*?) (.*?):(.*?):(.*?)$#", $_POST['download_datestamp'], $matches)){ + $_POST['download_datestamp'] = mktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[1], $matches[3]); + }else{ + $_POST['download_datestamp'] = time(); + } + + if($_POST['update_datestamp']){ $_POST['download_datestamp'] = time(); } + + $mirrorStr = ""; + $mirrorReq = ""; + + if($_POST['download_mirror_name'][0]) + { + $mirrors = count($_POST['download_mirror_name']); + for($a=0; $a<$mirrors; $a++) + { + $mirror_id = $_POST['download_mirror_name'][$a]; + $mirror_url = $_POST['download_mirror'][$a]; + $mirrorStr .= $mirror_id.",".$mirror_url.",0".chr(1); + } + } + + if ($id) + { + admin_update($sql->db_Update("download", "download_name='".$_POST['download_name']."', download_url='".$durl."', download_author='".$_POST['download_author']."', download_author_email='".$_POST['download_author_email']."', download_author_website='".$_POST['download_author_website']."', download_description='".$_POST['download_description']."', download_filesize='".$filesize."', download_category='".intval($_POST['download_category'])."', download_active='".intval($_POST['download_active'])."', download_datestamp='".intval($_POST['download_datestamp'])."', download_thumb='".$_POST['download_thumb']."', download_image='".$_POST['download_image']."', download_comment='".intval($_POST['download_comment'])."', download_class = '{$_POST['download_class']}', download_mirror='$mirrorStr', download_mirror_type='".intval($_POST['download_mirror_type'])."' , download_visible='".$_POST['download_visible']."' WHERE download_id=".intval($id)), 'update', DOWLAN_2." (".$_POST['download_name'].")"); + $dlinfo = array("download_id" => $download_id, "download_name" => $_POST['download_name'], "download_url" => $durl, "download_author" => $_POST['download_author'], "download_author_email" => $_POST['download_author_email'], "download_author_website" => $_POST['download_author_website'], "download_description" => $_POST['download_description'], "download_filesize" => $filesize, "download_category" => $_POST['download_category'], "download_active" => $_POST['download_active'], "download_datestamp" => $time, "download_thumb" => $_POST['download_thumb'], "download_image" => $_POST['download_image'], "download_comment" => $_POST['download_comment'] ); + $e_event->trigger("dlupdate", $dlinfo); + } else { + if (admin_update($download_id = $sql->db_Insert("download", "0, '".$_POST['download_name']."', '".$durl."', '".$_POST['download_author']."', '".$_POST['download_author_email']."', '".$_POST['download_author_website']."', '".$_POST['download_description']."', '".$filesize."', '0', '".intval($_POST['download_category'])."', '".intval($_POST['download_active'])."', '".intval($_POST['download_datestamp'])."', '".$_POST['download_thumb']."', '".$_POST['download_image']."', '".intval($_POST['download_comment'])."', '{$_POST['download_class']}', '$mirrorStr', '".intval($_POST['download_mirror_type'])."', '".$_POST['download_visible']."' "), 'insert', DOWLAN_1." (".$_POST['download_name'].")")) { + $dlinfo = array("download_id" => $download_id, "download_name" => $_POST['download_name'], "download_url" => $durl, "download_author" => $_POST['download_author'], "download_author_email" => $_POST['download_author_email'], "download_author_website" => $_POST['download_author_website'], "download_description" => $_POST['download_description'], "download_filesize" => $filesize, "download_category" => $_POST['download_category'], "download_active" => $_POST['download_active'], "download_datestamp" => $time, "download_thumb" => $_POST['download_thumb'], "download_image" => $_POST['download_image'], "download_comment" => $_POST['download_comment'] ); + $e_event->trigger("dlpost", $dlinfo); + + if ($_POST['remove_upload']) { + $sql->db_Update("upload", "upload_active='1' WHERE upload_id='".$_POST['remove_id']."'"); + $mes = "
    ".$_POST['download_name']." ".DOWLAN_104; + $mes .= "

    ".DOWLAN_105.""; + $this->show_message($mes); + } + } + } + } + + +// ----------------------------------------------------------------------------- + + function show_categories($sub_action, $id) + { + global $sql, $rs, $ns, $tp, $pst; + + if (!is_object($sql2)) { + $sql2 = new db; + } + $text = $rs->form_open("post", e_SELF."?".e_QUERY, "myform"); + $text .= "
    "; + + $qry = " + SELECT dc.*, COUNT(d.download_id) AS filecount FROM #download_category AS dc + LEFT JOIN #download AS d ON d.download_category = dc.download_category_id + GROUP BY dc.download_category_id + ORDER BY dc.download_category_order + "; + if($sql->db_Select_gen($qry)) + { + $categories = $sql->db_getList(); + foreach($categories as $cat) + { + $cat_array[$cat['download_category_parent']][] = $cat; + } + + $text .= " + + + + + + + + "; + + + //Start displaying parent categories + foreach($cat_array[0] as $parent) + { + if(strstr($parent['download_category_icon'], chr(1))) + { + list($parent['download_category_icon'], $parent['download_category_icon_empty']) = explode(chr(1), $parent['download_category_icon']); + } + + $text .= " + + + + + + "; + + //Show main categories + + if(is_array($cat_array[$parent['download_category_id']])) + { + foreach($cat_array[$parent['download_category_id']] as $main) + { + + if(strstr($main['download_category_icon'], chr(1))) + { + list($main['download_category_icon'], $main['download_category_icon_empty']) = explode(chr(1), $main['download_category_icon']); + } + $text .= " + + + + + + "; + + //Show sub categories + if(is_array($cat_array[$main['download_category_id']])) + { + foreach($cat_array[$main['download_category_id']] as $sub) + { + + if(strstr($sub['download_category_icon'], chr(1))) + { + list($sub['download_category_icon'], $sub['download_category_icon_empty']) = explode(chr(1), $sub['download_category_icon']); + } + $text .= " + + + + + + "; + } + } + } + } + + } + + $text .= "
     ".DOWLAN_11."".DOWLAN_52."".LAN_ORDER."".LAN_OPTIONS."
    ".($parent['download_category_icon'] ? "" : " ")."{$parent['download_category_name']} + + + ".ADMIN_EDIT_ICON." + "; + if(!is_array($cat_array[$parent['download_category_id']])) + { + $text .= "toJS(DOWLAN_34." [ID: {$parent['download_category_id']} ]")."') \"/>"; + } + $text .= " +
    ".($main['download_category_icon'] ? "" : " ")."{$main['download_category_name']}
    {$main['download_category_description']}
    {$main['filecount']} + + + ".ADMIN_EDIT_ICON.""; + if(!is_array($cat_array[$main['download_category_id']]) && !$main['filecount']) + { + $text .= "toJS(DOWLAN_34." [ID: {$main['download_category_id']} ]")."') \"/>"; + } + $text .= " +
    ".($sub['download_category_icon'] ? "" : " ")."    ".DOWLAN_53.": {$sub['download_category_name']}
        {$sub['download_category_description']}
    {$sub['filecount']} + + + ".ADMIN_EDIT_ICON." + "; + if(!$sub['filecount']) + { + $text .= "toJS(DOWLAN_34." [ID: {$sub['download_category_id']} ]")."') \"/>"; + } + $text .= " +
    "; + $text .= "
    + +
    "; + } + else + { + $text .= "
    ".DOWLAN_38."
    "; + } + $text .= ""; + $ns->tablerender(DOWLAN_37, $text); + + unset($download_category_id, $download_category_name, $download_category_description, $download_category_parent, $download_category_icon, $download_category_class); + + $handle = opendir(e_IMAGE."icons"); + while ($file = readdir($handle)) { + if ($file != "." && $file != ".." && $file != "/" && $file != "CVS") { + $iconlist[] = $file; + } + } + closedir($handle); + + if ($sub_action == "edit" && !$_POST['add_category']) { + if ($sql->db_Select("download_category", "*", "download_category_id=$id")) { + $row = $sql->db_Fetch(); + extract($row); + $main_category_parent = $download_category_parent; + if(strstr($download_category_icon, chr(1))) + { + list($download_category_icon, $download_category_icon_empty) = explode(chr(1), $download_category_icon); + } + else + { + $download_category_icon_empty = ""; + } + } + } + + $preset = $pst->read_preset("admin_dl_cat"); // read preset values into array + extract($preset); + + $frm_action = (isset($_POST['add_category'])) ? e_SELF."?cat" : e_SELF."?".e_QUERY; + $text = "
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + "; + + + $text .= " + + + +
    ".DOWLAN_37.": "; + + if (!$download_cats = $sql->db_Select("download_category")) { + $text .= " + \n"; + } else { + $text .= " + "; + } + $text .= "
    ".DOWLAN_12.": + +
    ".DOWLAN_18.": + +
    ".DOWLAN_41.": + + +
    + +
    ".DOWLAN_147.": + + +
    + +
    ".DOWLAN_43.":
    (".DOWLAN_44.")
    ".r_userclass("download_category_class", $download_category_class, 'off', 'public, nobody, member, admin, classes, language')." + +
    "; + if ($id && $sub_action == "edit" && !isset($_POST['add_category'])) { + $text .= " "; + } else { + $text .= ""; + } + $text .= "
    +
    +
    "; + $ns->tablerender(DOWLAN_39, $text); + } + + function create_category($sub_action, $id) { + global $sql, $tp; + $download_category_name = $tp->toDB($_POST['download_category_name']); + $download_category_description = $tp->toDB($_POST['download_category_description']); + $download_category_icon = $tp->toDB($_POST['download_category_icon']); + + if(isset($_POST['download_category_icon_empty']) && $_POST['download_category_icon_empty'] != ""){ + $download_category_icon .= trim(chr(1).$tp->toDB($_POST['download_category_icon_empty'])); + } + + if ($id) { + admin_update($sql->db_Update("download_category", "download_category_name='$download_category_name', download_category_description='$download_category_description', download_category_icon ='$download_category_icon', download_category_parent= '".intval($_POST['download_category_parent'])."', download_category_class='".$_POST['download_category_class']."' WHERE download_category_id='$id'"), 'update', DOWLAN_48); + } else { + admin_update($sql->db_Insert("download_category", "0, '$download_category_name', '$download_category_description', '$download_category_icon', '".intval($_POST['download_category_parent'])."', '".$_POST['download_category_class']."', 0 "), 'insert', DOWLAN_47); + } + if ($sub_action == "sn") { + $sql->db_Delete("tmp", "tmp_time='$id' "); + } + } + + + + function show_existing_mirrors() + { + + global $sql, $ns, $tp, $sub_action, $id, $delete, $del_id; + + if($delete == "mirror") + { + admin_update($sql -> db_Delete("download_mirror", "mirror_id=".$del_id), delete, DOWLAN_135); + } + + + if(!$sql -> db_Select("download_mirror")) + { + $text = "
    ".DOWLAN_144."
    "; // No mirrors defined yet + } + else + { + + $text = "
    +
    + + + + + + + + "; + + $mirrorList = $sql -> db_getList(); + + foreach($mirrorList as $mirror) + { + extract($mirror); + $text .= " + + + + + + + + "; + } + $text .= "
    ID".DOWLAN_12."".DOWLAN_136."".LAN_OPTIONS."
    $mirror_id".$tp -> toHTML($mirror_name)."".($mirror_image ? "" : "None")." + ".ADMIN_EDIT_ICON." + +
    "; + + } + + $ns -> tablerender(DOWLAN_138, $text); + + require_once(e_HANDLER."file_class.php"); + $fl = new e_file; + $rejecthumb = array('$.','$..','/','CVS','thumbs.db','*._$',"thumb_", 'index', 'null*'); + $imagelist = $fl->get_files(e_FILE."downloadimages/","",$rejecthumb); + + if($sub_action == "edit" && !defined("SUBMITTED")) + { + $sql -> db_Select("download_mirror", "*", "mirror_id='".intval($id)."' "); + $mirror = $sql -> db_Fetch(); + extract($mirror); + $edit = TRUE; + } + else + { + unset($mirror_name, $mirror_url, $mirror_image, $mirror_location, $mirror_description); + $edit = FALSE; + } + + $text = "
    +
    \n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ".DOWLAN_12." + +
    ".DOWLAN_139." + +
    ".DOWLAN_136." + + + +
    + +
    ".DOWLAN_141." + +
    ".DOWLAN_18." + +
    + ".($edit ? "" : "")." +
    +
    +
    "; + + $caption = ($edit ? DOWLAN_142 : DOWLAN_143); + + $ns -> tablerender($caption, $text); + } + + function submit_mirror() + { + global $tp, $sql; + define("SUBMITTED", TRUE); + if(isset($_POST['mirror_name']) && isset($_POST['mirror_url'])) + { + $name = $tp -> toDB($_POST['mirror_name']); + $url = $tp -> toDB($_POST['mirror_url']); + $location = $tp -> toDB($_POST['mirror_location']); + + $description = $tp -> toDB($_POST['mirror_description']); + + if (isset($_POST['id'])){ + admin_update($sql -> db_Update("download_mirror", "mirror_name='$name', mirror_url='$url', mirror_image='".$_POST['mirror_image']."', mirror_location='$location', mirror_description='$description' WHERE mirror_id=".$_POST['id']), 'update', DOWLAN_133); + } else { + admin_update($sql -> db_Insert("download_mirror", "0, '$name', '$url', '".$_POST['mirror_image']."', '$location', '$description', 0"), 'insert', DOWLAN_134); + } + } + } + + // --------------------------------------------------------------------------- + + function move_file($oldname,$newname) + { + global $ns; + if(file_exists($newname)) + { + return TRUE; + } + + if(!file_exists($oldname) || is_dir($oldname)) + { + $ns -> tablerender(LAN_ERROR,DOWLAN_68 . " : ".$oldname); + return FALSE; + } + + $directory = dirname($newname); + if(is_writable($directory)) + { + if(!rename($oldname,$newname)) + { + $ns -> tablerender(LAN_ERROR,DOWLAN_152." ".$oldname ." -> ".$newname); + return FALSE; + } + else + { + return TRUE; + } + } + else + { + $ns -> tablerender(LAN_ERROR,$directory ." ".LAN_NOTWRITABLE); + return FALSE; + } + } + +// ------------------------------------------------------------------------- + + +} // end class. + + +function download_adminmenu($parms) { + global $download; + global $action; + $download->show_options($action); +} + + + + + +?> diff --git a/e107_admin/e107_update.php b/e107_admin/e107_update.php new file mode 100644 index 000000000..a9db8406a --- /dev/null +++ b/e107_admin/e107_update.php @@ -0,0 +1,117 @@ + $rmks) { + $installed = call_user_func("update_".$func); + if ((LAN_UPDATE == $_POST[$func]) && !$installed) { + if (function_exists("update_".$func)) { + $message .= LAN_UPDATE_7." {$rmks}
    "; + $error=call_user_func("update_".$func, "do"); + if ($error!='') { + $message = $error; + } + } + } + } + if ($message) { + $ns->tablerender(LAN_UPDATE, $message); + } +} + +function show_updates($dbupdate, $additional = false) { + global $ns; + $text = "
    +
    + + + + + + "; + + $updates = 0; + + foreach($dbupdate as $func => $rmks) { + if (function_exists("update_".$func)) { + $text .= ""; + if (call_user_func("update_".$func)) { + $text .= ""; + } else { + $updates++; + $text .= ""; + } + $text .= ""; + } + } + + $text .= "
    ".LAN_UPDATE."".LAN_UPDATE_2."
    {$rmks}".LAN_UPDATE_3."
    "; + $ns->tablerender(($additional ? (defined("LAN_UPDATE_11") ? LAN_UPDATE_11 : '.617 to .7 Update Continued') : LAN_UPDATE_10), $text); +} + +if ($_POST) { + $message = run_updates($dbupdate); +} + +if($sql->db_Select("plugin", "plugin_version", "plugin_path = 'forum' AND plugin_installflag='1' ")) { + if(file_exists(e_PLUGIN.'forum/forum_update_check.php')) + { + include_once(e_PLUGIN.'forum/forum_update_check.php'); + } +} +if ($sql -> db_Query("SHOW COLUMNS FROM ".MPREFIX."stat_info") && $sql -> db_Select("plugin", "*", "plugin_path = 'log' AND plugin_installflag='1'")) { + if(file_exists(e_PLUGIN.'log/log_update_check.php')) + { + include_once(e_PLUGIN.'log/log_update_check.php'); + } +} + +if($sql->db_Select("plugin", "plugin_version", "plugin_path = 'content' AND plugin_installflag='1' ")) +{ + if(file_exists(e_PLUGIN.'content/content_update_check.php')) + { + include_once(e_PLUGIN.'content/content_update_check.php'); + } +} + +if ($sql->db_Select("plugin", "plugin_version", "plugin_path = 'pm' AND plugin_installflag='1' ")) +{ + if(file_exists(e_PLUGIN.'pm/pm_update_check.php')) + { + include_once(e_PLUGIN.'pm/pm_update_check.php'); + } +} + +if ($_POST) { + $message = run_updates($dbupdatep); +} + +if (isset($dbupdatep)) { + show_updates($dbupdatep, true); +} +show_updates($dbupdate); + +require_once("footer.php"); + +?> \ No newline at end of file diff --git a/e107_admin/emoticon.php b/e107_admin/emoticon.php new file mode 100644 index 000000000..4be2728a5 --- /dev/null +++ b/e107_admin/emoticon.php @@ -0,0 +1,353 @@ +db_Count("core", "(*)", "e107_name = 'emote_default'")) +{ + $tmp = 'a:28:{s:9:"alien!png";s:6:"!alien";s:10:"amazed!png";s:7:"!amazed";s:9:"angry!png";s:11:"!grr !angry";s:12:"biglaugh!png";s:4:"!lol";s:11:"cheesey!png";s:10:":D :oD :-D";s:12:"confused!png";s:10:":? :o? :-?";s:7:"cry!png";s:19:"&| &-| &o| :(( !cry";s:8:"dead!png";s:21:"x) xo) x-) x( xo( x-(";s:9:"dodge!png";s:6:"!dodge";s:9:"frown!png";s:10:":( :o( :-(";s:7:"gah!png";s:10:":@ :o@ :o@";s:8:"grin!png";s:10:":D :oD :-D";s:9:"heart!png";s:6:"!heart";s:8:"idea!png";s:10:":! :o! :-!";s:7:"ill!png";s:4:"!ill";s:7:"mad!png";s:13:"~:( ~:o( ~:-(";s:12:"mistrust!png";s:9:"!mistrust";s:11:"neutral!png";s:10:":| :o| :-|";s:12:"question!png";s:2:"?!";s:12:"rolleyes!png";s:10:"B) Bo) B-)";s:7:"sad!png";s:4:"!sad";s:10:"shades!png";s:10:"8) 8o) 8-)";s:7:"shy!png";s:4:"!shy";s:9:"smile!png";s:10:":) :o) :-)";s:11:"special!png";s:3:"%-6";s:12:"suprised!png";s:10:":O :oO :-O";s:10:"tongue!png";s:21:":p :op :-p :P :oP :-P";s:8:"wink!png";s:10:";) ;o) ;-)";}'; + $sql->db_Insert("core", "'emote_default', '$tmp' "); +} + +if (isset($_POST['active'])) +{ + if ($pref['smiley_activate'] != $_POST['smiley_activate']) { + $pref['smiley_activate'] = $_POST['smiley_activate']; + save_prefs(); + $update = true; + } + admin_update($update); +} + +/* get packs */ + +require_once(e_HANDLER."file_class.php"); +$fl = new e_file; +$emote = new emotec; +foreach($_POST as $key => $value) +{ + if(strstr($key, "subPack_")) + { + $subpack = str_replace("subPack_", "", $key); + $emote -> emoteConf($subpack); + break; + } + + if(strstr($key, "defPack_")) + { + $pref['emotepack'] = str_replace("defPack_", "", $key); + save_prefs(); + break; + } +} + +$check = TRUE; +$check = $emote -> installCheck(); +if($check!==FALSE){ + $emote -> listPacks(); +} + +class emotec +{ + + var $packArray; + + function emotec() + { + /* constructor */ + global $fl; + $this -> packArray = $fl -> get_dirs(e_IMAGE."emotes"); + + if(isset($_POST['sub_conf'])) + { + $this -> saveConf(); + } + } + + function listPacks() + { + + global $ns, $fl, $pref; + + $text = "
    +
    + + + + + + + + + +
    ".EMOLAN_4.": ".($pref['smiley_activate'] ? "" : "")."
    + +
    +
    +
    + "; + + $ns -> tablerender(EMOLAN_1, $text); + + + $text = " +
    + + + + + + + "; + + $reject = array('^\.$','^\.\.$','^\/$','^CVS$','thumbs\.db','.*\._$', 'emoteconf*'); + foreach($this -> packArray as $pack) + { + $emoteArray = $fl -> get_files(e_IMAGE."emotes/".$pack, "", $reject); + + $text .= " + + + + + + + "; + } + + $text .= " +
    ".EMOLAN_2."".EMOLAN_3."".EMOLAN_8."".EMOLAN_9."
    $pack + "; + + foreach($emoteArray as $emote) + { + $text .= " "; + } + + $text .= "".($pref['emotepack'] == $pack ? EMOLAN_10 : "")."
    +
    + "; + $ns -> tablerender(EMOLAN_13, $text); + } + + function emoteConf($packID) + { + + global $ns, $fl, $pref, $sysprefs, $tp; + $corea = "emote_".$packID; + + $emotecode = $sysprefs -> getArray($corea); + + $reject = array('^\.$','^\.\.$','^\/$','^CVS$','thumbs\.db','.*\._$', 'emoteconf*', '*\.txt', '*\.html', '*\.pak', '*php*', '.cvsignore'); + $emoteArray = $fl -> get_files(e_IMAGE."emotes/".$packID, "", $reject); + + $eArray = array(); + foreach($emoteArray as $value) + { + if(!strstr($value['fname'], ".php") && !strstr($value['fname'], ".txt") && !strstr($value['fname'], ".pak") && !strstr($value['fname'], ".xml") && !strstr($value['fname'], "phpBB") && !strstr($value['fname'], ".html")) + { + $eArray[] = array('path' => $value['path'], 'fname' => $value['fname']); + } + } + + $text = " +
    + + + + + + + "; + + foreach($eArray as $emote) + { + $ename = $emote['fname']; + $evalue = str_replace(".", "!", $ename); + + $text .= " + + + + + + "; + } + + $text .= " + + + + +
    ".EMOLAN_2."".EMOLAN_5."".EMOLAN_6." ( ".EMOLAN_7." )
    ".$ename."
    + +
    "; + $ns -> tablerender(EMOLAN_15.": '".$packID."'", $text); + + } + + function saveConf() + { + global $ns, $sql, $tp; + + $packID = $_POST['packID']; + unset($_POST['sub_conf'], $_POST['packID']); + + foreach($_POST as $key => $value) + { + $key = str_replace("_", "!", $key); + $_POST[$key] = $value; + } + + $encoded_emotes = $tp -> toDB($_POST); + $tmp = addslashes(serialize($encoded_emotes)); + + if ($sql->db_Select("core", "*", "e107_name='emote_".$packID."'")) { + admin_update($sql->db_Update("core", "e107_value='$tmp' WHERE e107_name='emote_".$packID."' "), 'update', EMOLAN_16); + } else { + admin_update($sql->db_Insert("core", "'emote_".$packID."', '$tmp' "), 'insert', EMOLAN_16); + } + } + + function installCheck() + { + global $sql, $fl; + foreach($this -> packArray as $value) + { + if(strpos($value,' ')!==FALSE){ + global $ns; + $msg = " +
    ".EMOLAN_17."
    ".EMOLAN_18."


    + + + + + + + + + +
    ".EMOLAN_19."".EMOLAN_20."
    ".$value."".e_IMAGE."emotes/
    +
    "; + $ns->tablerender(EMOLAN_21, $msg); + return FALSE; + } + if(!$sql -> db_Select("core", "*", "e107_name='emote_".$value."' ")) + { + $fileArray = $fl -> get_files(e_IMAGE."emotes/".$value); + foreach($fileArray as $file) + { + if(strstr($file['fname'], ".xml")) + { + $confFile = array('file' => $file['fname'], 'type' => "xml"); + } + else if(strstr($file['fname'], ".pak")) + { + $confFile = array('file' => $file['fname'], 'type' => "pak"); + } + else if(strstr($file['fname'], ".php")) + { + $confFile = array('file' => $file['fname'], 'type' => "php"); + } + } + + /* .pak file ------------------------------------------------------------------------------------------------------------------------------------ */ + if($confFile['type'] == "pak") + { + $filename = e_IMAGE."emotes/".$value."/".$confFile['file']; + $pakconf = file ($filename); + $contentArray = array(); + foreach($pakconf as $line) + { + if(trim($line) && strstr($line, "=+") && !strstr($line, ".txt") && !strstr($line, ".html") && !strstr($line, "cvs")) $contentArray[] = $line; + } + $confArray = array(); + foreach($contentArray as $pakline) + { + $tmp = explode("=+:", $pakline); + $confIC = str_replace(".", "!", $tmp[0]); + $confArray[$confIC] = trim($tmp[2]); + } + $tmp = addslashes(serialize($confArray)); + $sql->db_Insert("core", "'emote_".$value."', '$tmp' "); + echo "
    New emote pak found: ' ".$value."'
    "; + } + /* end ----------------------------------------------------------------------------------------------------------------------------------------- */ + + /* .xml file ------------------------------------------------------------------------------------------------------------------------------------ */ + if($confFile['type'] == "xml") + { + $filename = e_IMAGE."emotes/".$value."/".$confFile['file']; + + $handle = fopen ($filename, "r"); + $contents = fread ($handle, filesize ($filename)); + fclose ($handle); + + preg_match_all("#\(.*?)\<\/emoticon\>#si", $contents, $match); + $confArray = array(); + + for($a=0; $a<=(count($match[0])); $a++) + { + preg_match_all("#\(.*?)\<\/string\>#si", $match[0][$a], $match2); + + $codet = ""; + foreach($match2[1] as $code) + { + $codet .= $code." "; + } + + foreach($fileArray as $emote) + { + if(strstr($emote['fname'], $match[1][$a])) + { + $file = str_replace(".", "!", $emote['fname']); + } + } + $confArray[$file] = $codet; + } + + $tmp = addslashes(serialize($confArray)); + $sql->db_Insert("core", "'emote_".$value."', '$tmp' "); + echo "
    New emote xml pak found: ' ".$value."'
    "; + } + + if($confFile['type'] == "php") + { + echo ".conf file found: installing '".$value."'
    "; + include_once(e_IMAGE."emotes/".$value."/".$confFile['file']); + $sql->db_Insert("core", "'emote_".$value."', '$_emoteconf' "); + echo "
    New emote php found: ' ".$value."'
    "; + } + /* end ----------------------------------------------------------------------------------------------------------------------------------------- */ + + } + } + } +} + +require_once("footer.php"); + +?> diff --git a/e107_admin/fileinspector.php b/e107_admin/fileinspector.php new file mode 100644 index 000000000..0020331d2 --- /dev/null +++ b/e107_admin/fileinspector.php @@ -0,0 +1,785 @@ + $ADMIN_DIRECTORY, 'files' => $FILES_DIRECTORY, 'images' => $IMAGES_DIRECTORY, 'themes' => $THEMES_DIRECTORY, 'plugins' => $PLUGINS_DIRECTORY, 'handlers' => $HANDLERS_DIRECTORY, 'languages' => $LANGUAGES_DIRECTORY, 'downloads' => $DOWNLOADS_DIRECTORY, 'docs' => $DOCS_DIRECTORY); +foreach ($maindirs as $maindirs_key => $maindirs_value) { + $coredir[$maindirs_key] = substr($maindirs_value, 0, -1); +} + +require_once('core_image.php'); + +if (e_QUERY) { + $fi -> snapshot_interface(); +} else if (isset($_POST['scan'])) { + $fi -> scan_results(); + $fi -> scan_config(); +} else { + $fi -> scan_config(); +} + +class file_inspector { + + var $root_dir; + var $files = array(); + var $parent; + var $count = array(); + var $results = 0; + + function file_inspector() { + global $e107; + set_time_limit(240); + $this -> root_dir = $e107 -> file_path; + if (substr($this -> root_dir, -1) == '/') { + $this -> root_dir = substr($this -> root_dir, 0, -1); + } + if ($_POST['core'] == 'fail') { + $_POST['integrity'] = TRUE; + } + if (MAGIC_QUOTES_GPC && $_POST['regex']) { + $_POST['regex'] = stripslashes($_POST['regex']); + } + if ($_POST['regex']) { + if ($_POST['core'] == 'fail') { + $_POST['core'] = 'all'; + } + $_POST['missing'] = 0; + $_POST['integrity'] = 0; + } + } + + function scan_config() { + global $ns, $rs, $pref; + + $text = "
    +
    + + + + "; + + $text .= " + + + "; + + $text .= " + + + "; + + $text .= " + + + "; + + $text .= " + + + "; + + $text .= " + + "; + + $text .= " + + + "; + + if ($pref['developer']) { + $text .= " + + "; + + $text .= " + + + "; + + $text .= " + + + "; + + $text .= " + + + "; + } + + $text .= " + + +
    ".FC_LAN_2."
    + ".FC_LAN_3." ".FC_LAN_5.": + + ".FC_LAN_4."   + ".FC_LAN_6."   + ".FC_LAN_12."   +
    + ".FC_LAN_3." ".FC_LAN_13.": + + ".FC_LAN_9."   + ".FC_LAN_10."   +
    + ".FC_LAN_3." ".FC_LAN_7.": + + ".FC_LAN_9."   + ".FC_LAN_10."   +
    + ".FC_LAN_3." ".FC_LAN_21.": + + ".FC_LAN_9."   + ".FC_LAN_10."   +
    + ".FC_LAN_8.": + + ".FC_LAN_9."   + ".FC_LAN_10."   +
    + ".FC_LAN_14.": + + ".FC_LAN_15."   + ".FC_LAN_16."   +
    ".FC_LAN_17."
    + ".FC_LAN_18.": + + ## +
    + ".FC_LAN_19.": + + +
    + ".FC_LAN_20.": + + +
    ".$rs -> form_button('submit', 'scan', FC_LAN_11)."
    +
    +
    "; + + $ns -> tablerender(FC_LAN_1, $text); + + } + + function scan($dir, $image) { + $handle = opendir($dir.'/'); + while (false !== ($readdir = readdir($handle))) { + if ($readdir != '.' && $readdir != '..' && $readdir != '/' && $readdir != 'CVS' && $readdir != 'Thumbs.db' && (strpos('._', $readdir) === FALSE)) { + $path = $dir.'/'.$readdir; + if (is_dir($path)) { + $dirs[$path] = $readdir; + } else if (!isset($image[$readdir])) { + $files[$readdir] = $this -> checksum($path, TRUE); + } + } + } + closedir($handle); + + if (isset($dirs)) { + ksort ($dirs); + foreach ($dirs as $dir_path => $dir_list) { + $list[$dir_list] = ($set = $this -> scan($dir_path, $image[$dir_list])) ? $set : array(); + } + } + + if (isset($files)) { + ksort ($files); + foreach ($files as $file_name => $file_list) { + $list[$file_name] = $file_list; + } + } + + return $list; + } + + function inspect($list, $deprecated, $level, $dir, &$tree_end, &$parent_expand) { + global $coredir; + unset ($childOut); + $parent_expand = false; + if (substr($dir, -1) == '/') { + $dir = substr($dir, 0, -1); + } + $dir_id = dechex(crc32($dir)); + $this -> files[$dir_id]['.']['level'] = $level; + $this -> files[$dir_id]['.']['parent'] = $this -> parent; + $this -> files[$dir_id]['.']['file'] = $dir; + $directory = $level ? basename($dir) : SITENAME; + $level++; + + foreach ($list as $key => $value) { + $this -> parent = $dir_id; + if (is_array($value)) { + $path = $dir.'/'.$key; + $child_open = false; + $child_end = true; + $sub_text .= $this -> inspect($value, $deprecated[$key], $level, $path, $child_end, $child_expand); + $tree_end = false; + if ($child_expand) { + $parent_expand = true; + $last_expand = true; + } + } else { + $path = $dir.'/'.$key; + $fid = strtolower($key); + $this -> files[$dir_id][$fid]['file'] = ($_POST['type'] == 'tree') ? $key : $path; + if (($this -> files[$dir_id][$fid]['size'] = filesize($path)) !== FALSE) { + if ($_POST['core'] != 'none') { + $this -> count['core']['num']++; + $this -> count['core']['size'] += $this -> files[$dir_id][$fid]['size']; + if ($_POST['regex']) { + $file_content = file($path); + if (($this -> files[$dir_id][$fid]['size'] = filesize($path)) !== FALSE) { + if ($this -> files[$dir_id][$fid]['lines'] = preg_grep("#".$_POST['regex']."#".$_POST['mod'], $file_content)){ + $this -> files[$dir_id][$fid]['file'] = ($_POST['type'] == 'tree') ? $key : $path; + $this -> files[$dir_id][$fid]['icon'] = 'file_core.png'; + $dir_icon = 'fileinspector.png'; + $parent_expand = TRUE; + $this -> results++; + } else { + unset($this -> files[$dir_id][$fid]); + $known[$dir_id][$fid] = true; + $dir_icon = ($dir_icon == 'fileinspector.png') ? $dir_icon : 'folder.png'; + } + } + } else { + //if (strpos($dir.'/'.$key, 'htmlarea') === false) { + if ($_POST['integrity']) { + if ($dir.'/'.$key != $this -> root_dir.'/'.$coredir['admin'].'/core_image.php' && $dir.'/'.$key != $this -> root_dir.'/e107_config.php') { + if ($this -> checksum($path) != $value) { + $this -> count['fail']['num']++; + $this -> count['fail']['size'] += $this -> files[$dir_id][$fid]['size']; + $this -> files[$dir_id][$fid]['icon'] = 'file_fail.png'; + $dir_icon = 'folder_fail.png'; + $parent_expand = TRUE; + } else { + $this -> count['pass']['num']++; + $this -> count['pass']['size'] += $this -> files[$dir_id][$fid]['size']; + if ($_POST['core'] != 'fail') { + $this -> files[$dir_id][$fid]['icon'] = 'file_check.png'; + $dir_icon = ($dir_icon == 'folder_fail.png' || $dir_icon == 'folder_missing.png') ? $dir_icon : 'folder_check.png'; + } else { + unset($this -> files[$dir_id][$fid]); + $known[$dir_id][$fid] = true; + } + } + } else { + $this -> count['uncalculable']['num']++; + $this -> count['uncalculable']['size'] += $this -> files[$dir_id][$fid]['size']; + if ($_POST['core'] != 'fail') { + $this -> files[$dir_id][$fid]['icon'] = 'file_uncalc.png'; + } else { + unset($this -> files[$dir_id][$fid]); + $known[$dir_id][$fid] = true; + } + } + } else { + $this -> files[$dir_id][$fid]['icon'] = 'file_core.png'; + } + //} else { + // $this -> count['warning']['num']++; + // $this -> count['warning']['size'] += $this -> files[$dir_id][$fid]['size']; + // $this -> files[$dir_id][$fid]['icon'] = 'file_warning.png'; + // $dir_icon = 'folder_warning.png'; + // $parent_expand = TRUE; + //} + } + } else { + unset ($this -> files[$dir_id][$fid]); + $known[$dir_id][$fid] = true; + } + } else if ($_POST['missing']) { + $this -> count['missing']['num']++; + $this -> files[$dir_id][$fid]['icon'] = 'file_missing.png'; + $dir_icon = ($dir_icon == 'folder_fail.png') ? $dir_icon : 'folder_missing.png'; + $parent_expand = TRUE; + } else { + unset ($this -> files[$dir_id][$fid]); + } + } + } + + if ($_POST['noncore'] || $_POST['oldcore']) { + $handle = opendir($dir.'/'); + while (false !== ($readdir = readdir($handle))) { + if ($readdir != '.' && $readdir != '..' && $readdir != '/' && $readdir != 'CVS' && $readdir != 'Thumbs.db' && (strpos('._', $readdir) === FALSE)) { + if (is_dir($dir.'/'.$readdir)) { + if (!isset($list[$readdir]) && ($level > 1 || $readdir == 'e107_install')) { + $child_open = false; + $child_end = true; + $sub_text .= $this -> inspect(array(), $deprecated[$readdir], $level, $dir.'/'.$readdir, $child_end, $child_expand); + $tree_end = false; + if ($child_expand) { + $parent_expand = true; + $last_expand = true; + } + } + } else { + $aid = strtolower($readdir); + if (!isset($this -> files[$dir_id][$aid]['file']) && !$known[$dir_id][$aid]) { + if (strpos($dir.'/'.$readdir, 'htmlarea') === false) { + if (isset($deprecated[$readdir])) { + if ($_POST['oldcore']) { + $this -> files[$dir_id][$aid]['file'] = ($_POST['type'] == 'tree') ? $readdir : $dir.'/'.$readdir; + $this -> files[$dir_id][$aid]['size'] = filesize($dir.'/'.$readdir); + $this -> files[$dir_id][$aid]['icon'] = 'file_old.png'; + $this -> count['deprecated']['num']++; + $this -> count['deprecated']['size'] += $this -> files[$dir_id][$aid]['size']; + } + } else { + if ($_POST['noncore']) { + $this -> files[$dir_id][$aid]['file'] = ($_POST['type'] == 'tree') ? $readdir : $dir.'/'.$readdir; + $this -> files[$dir_id][$aid]['size'] = filesize($dir.'/'.$readdir); + $this -> files[$dir_id][$aid]['icon'] = 'file_unknown.png'; + $this -> count['unknown']['num']++; + $this -> count['unknown']['size'] += $this -> files[$dir_id][$aid]['size']; + } + } + } else { + $this -> files[$dir_id][$aid]['file'] = ($_POST['type'] == 'tree') ? $readdir : $dir.'/'.$readdir; + $this -> files[$dir_id][$aid]['size'] = filesize($dir.'/'.$readdir); + $this -> files[$dir_id][$aid]['icon'] = 'file_warning.png'; + $this -> count['warning']['num']++; + $this -> count['warning']['size'] += $this -> files[$dir_id][$aid]['size']; + $this -> count['deprecated']['num']++; + $this -> count['deprecated']['size'] += $this -> files[$dir_id][$aid]['size']; + $dir_icon = 'folder_warning.png'; + $parent_expand = TRUE; + } + if ($_POST['regex']) { + $file_content = file($dir.'/'.$readdir); + if ($this -> files[$dir_id][$aid]['lines'] = preg_grep("#".$_POST['regex']."#".$_POST['mod'], $file_content)) { + $dir_icon = 'fileinspector.png'; + $parent_expand = TRUE; + $this -> results++; + } else { + unset($this -> files[$dir_id][$aid]); + $dir_icon = ($dir_icon == 'fileinspector.png') ? $dir_icon : 'folder.png'; + } + } else { + if (isset($deprecated[$readdir])) { + if ($_POST['oldcore']) { + $dir_icon = ($dir_icon == 'folder_warning.png' || $dir_icon == 'folder_fail.png' || $dir_icon == 'folder_missing.png' || $dir_icon == 'folder_old_dir.png') ? $dir_icon : 'folder_old.png'; + $parent_expand = TRUE; + } + } else { + if ($_POST['noncore']) { + $dir_icon = ($dir_icon == 'folder_warning.png' || $dir_icon == 'folder_fail.png' || $dir_icon == 'folder_missing.png' || $dir_icon == 'folder_old.png' || $dir_icon == 'folder_old_dir.png') ? $dir_icon : 'folder_unknown.png'; + $parent_expand = TRUE; + } + } + } + } else if ($_POST['core'] == 'none') { + unset($this -> files[$dir_id][$aid]); + } + } + } + } + closedir($handle); + } + + $dir_icon = $dir_icon ? $dir_icon : 'folder.png'; + $icon = ""; + $hide = ($last_expand && $dir_icon != 'folder_core.png') ? "" : "style='display: none'"; + $text = "
    "; + $text .= $tree_end ? "" : ""; + $text .= " ".$icon." ".$directory.""; + $text .= $tree_end ? "" : "
    ".$sub_text."
    "; + $text .= "
    "; + + $this -> files[$dir_id]['.']['icon'] = $dir_icon; + + return $text; + } + + function scan_results() { + global $ns, $rs, $core_image, $deprecated_image; + $scan_text = $this -> inspect($core_image, $deprecated_image, 0, $this -> root_dir); + + if ($_POST['type'] == 'tree') { + $text = "
    + + + + "; + + $text .= ""; + + $text .= " + + "; + + $text .= "
    ".FR_LAN_2."
    +
    + ".$scan_text." +
    +
    "; + } else { + $text = "
    + + + + "; + + $text .= " + + +
    ".FR_LAN_2."
    "; + } + + $text .= ""; + + if ($_POST['type'] == 'tree') { + $text .= " + "; + } else { + $text .= " + "; + } + + if ($_POST['core'] != 'none') { + $text .= ""; + } + if ($_POST['missing']) { + $text .= ""; + } + if ($_POST['noncore']) { + $text .= ""; + } + if ($_POST['oldcore']) { + $text .= ""; + } + if ($_POST['core'] == 'all') { + $text .= ""; + } + + if ($this -> count['warning']['num']) { + $text .= ""; + $text .= ""; + + $text .= ""; + + $text .= ""; + + } + if ($_POST['integrity'] && $_POST['core'] != 'none') { + $integrity_icon = $this -> count['fail']['num'] ? 'integrity_fail.png' : 'integrity_pass.png'; + $integrity_text = $this -> count['fail']['num'] ? '( '.$this -> count['fail']['num'].' '.FR_LAN_19.' )' : '( '.FR_LAN_20.' )'; + $text .= ""; + $text .= ""; + + $text .= ""; + $text .= ""; + $text .= ""; + + $text .= ""; + + $text .= ""; + + $text .= ""; + } + + if ($_POST['type'] == 'tree' && !$this -> results && $_POST['regex']) { + $text .= " + "; + } + + $text .= "
    +  ".FR_LAN_3." root_dir))."')\"> +
    +  ".FR_LAN_3."
     ".FR_LAN_4.": ".($this -> count['core']['num'] ? $this -> count['core']['num'] : FR_LAN_21)." ".$this -> parsesize($this -> count['core']['size'], 2)."
     ".FR_LAN_22.": ".($this -> count['missing']['num'] ? $this -> count['missing']['num'] : FR_LAN_21)." 
     ".FR_LAN_5.": ".($this -> count['unknown']['num'] ? $this -> count['unknown']['num'] : FR_LAN_21)." ".$this -> parsesize($this -> count['unknown']['size'], 2)."
     ".FR_LAN_24.": ".($this -> count['deprecated']['num'] ? $this -> count['deprecated']['num'] : FR_LAN_21)." ".$this -> parsesize($this -> count['deprecated']['size'], 2)."
     ".FR_LAN_6.": ".($this -> count['core']['num'] + $this -> count['unknown']['num'] + $this -> count['deprecated']['num'])." ".$this -> parsesize($this -> count['core']['size'] + $this -> count['unknown']['size'] + $this -> count['deprecated']['size'], 2)."
     
    +  ".FR_LAN_26."
     ".FR_LAN_28.": ".($this -> count['warning']['num'] ? $this -> count['warning']['num'] : FR_LAN_21)." ".$this -> parsesize($this -> count['warning']['size'], 2)."
     ".FR_LAN_27."
     
    +  ".FR_LAN_7." ".$integrity_text."
     ".FR_LAN_8.": ".($this -> count['pass']['num'] ? $this -> count['pass']['num'] : FR_LAN_21)." ".$this -> parsesize($this -> count['pass']['size'], 2)."
     ".FR_LAN_9.": ".($this -> count['fail']['num'] ? $this -> count['fail']['num'] : FR_LAN_21)." ".$this -> parsesize($this -> count['fail']['size'], 2)."
     ".FR_LAN_25.": ".($this -> count['uncalculable']['num'] ? $this -> count['uncalculable']['num'] : FR_LAN_21)." ".$this -> parsesize($this -> count['uncalculable']['size'], 2)."
     
     ".FR_LAN_10.": 
    + +

    ".FR_LAN_23."
    "; + + if ($_POST['type'] != 'tree') { + $text .= "
    + "; + if (!$this -> results && $_POST['regex']) { + $text .= ""; + } + } + + foreach ($this -> files as $dir_id => $fid) { + ksort($fid); + $text .= ($_POST['type'] == 'tree') ? "
    ".FR_LAN_23."
    " : ""; + $initial = FALSE; + foreach ($fid as $key => $stext) { + if (!$initial) { + if ($_POST['type'] == 'tree') { + $text .= " + "; + } + } else { + if ($_POST['type'] != 'tree') { + $stext['file'] = str_replace($this -> root_dir."/", "", $stext['file']); + } + $text .= " + + "; + } + $initial = TRUE; + } + $text .= ($_POST['type'] == 'tree') ? "" : ""; + } + + if ($_POST['type'] != 'tree') { + $text .= "
    "; + } + + $text .= "
    +
    "; + + $ns -> tablerender(FR_LAN_1.'...', $text); + } + + function create_image($dir) { + global $core_image, $deprecated_image, $coredir; + + foreach ($coredir as $trim_key => $trim_dirs) { + $search[$trim_key] = "'".$trim_dirs."'"; + $replace[$trim_key] = "\$coredir['".$trim_key."']"; + } + + $data = " scan($dir) : $core_image; + $image_array = var_export($scan_current, true); + $image_array = str_replace($search, $replace, $image_array); + $data .= "\$core_image = ".$image_array.";\n\n"; + + $scan_deprecated = ($_POST['snaptype'] == 'deprecated') ? $this -> scan($dir, $core_image) : $deprecated_image; + $image_array = var_export($scan_deprecated, true); + $image_array = str_replace($search, $replace, $image_array); + $data .= "\$deprecated_image = ".$image_array.";\n\n"; + + $data .= "?>"; + $fp = fopen(e_ADMIN.'core_image.php', 'w'); + fwrite($fp, $data); + } + + function snapshot_interface() { + global $ns, $rs; + $text = ""; + if (isset($_POST['create_snapshot'])) { + $this -> create_image($_POST['snapshot_path']); + $text = "
    +
    + + + + "; + + $text .= " + + + + + +
    Snapshot Created
    + The snapshot (".e_ADMIN."core_image.php) was successfully created. +
    ".$rs -> form_button('submit', 'main_page', 'Return To Main Page')."
    +
    +

    "; + } + + $text .= "
    +
    + + + + "; + + $text .= " + + + + + + + + + + + +
    Create Snapshot
    + Absolute path of root directory to create image from: + + root_dir)."' /> +
    + Create snapshot of current or deprecated core files: + + Current   + Deprecated   +
    ".$rs -> form_button('submit', 'create_snapshot', 'Create Snapshot')."
    +
    +
    "; + + $ns -> tablerender('Snapshot', $text); + + } + + function checksum($filename) { + $checksum = md5(str_replace(array(chr(13),chr(10)), "", file_get_contents($filename))); + return $checksum; + } + + function parsesize($size, $dec = 0) { + $size = $size ? $size : 0; + $kb = 1024; + $mb = 1024 * $kb; + $gb = 1024 * $mb; + $tb = 1024 * $gb; + if ($size < $kb) { + return $size." b"; + } else if($size < $mb) { + return round($size/$kb)." kb"; + } else if($size < $gb) { + return round($size/$mb, $dec)." mb"; + } else if($size < $tb) { + return round($size/$gb, $dec)." gb"; + } else { + return round($size/$tb, $dec)." tb"; + } + } + + function regex_match($file) { + $file_content = file_get_contents($file); + $match = preg_match($_POST['regex'], $file_content); + return $match; + } +} + +require_once('footer.php'); + +function headerjs() { +global $e107; +$text = " +\n"; + +return $text; +} + +?> \ No newline at end of file diff --git a/e107_admin/filemanager.php b/e107_admin/filemanager.php new file mode 100644 index 000000000..221ba30dd --- /dev/null +++ b/e107_admin/filemanager.php @@ -0,0 +1,377 @@ +Debug ".$path."
    "; +} + + +// =============================================== + + +foreach($_POST['deleteconfirm'] as $key=>$delfile){ + // check for delete. + if (isset($_POST['selectedfile'][$key]) && isset($_POST['deletefiles'])) { + if (!$_POST['ac'] == md5(ADMINPWCHANGE)) { + exit; + } + $destination_file = e_BASE.$delfile; + if (@unlink($destination_file)) { + $message .= FMLAN_26." '".$destination_file."' ".FMLAN_27.".
    "; + } else { + $message .= FMLAN_28." '".$destination_file."'.
    "; + } + } + + // check for move to downloads or downloadimages. + if (isset($_POST['selectedfile'][$key]) && (isset($_POST['movetodls'])) ){ + $newfile = str_replace($path,"",$delfile); + + // Move file to whatever folder. + if (isset($_POST['movetodls'])){ + + $newpath = $_POST['movepath']; + + if (rename(e_BASE.$delfile,$newpath.$newfile)){ + $message .= FMLAN_38." ".$newpath.$newfile."
    "; + } else { + $message .= FMLAN_39." ".$newpath.$newfile."
    "; + $message .= (!is_writable($newpath)) ? $newpath.LAN_NOTWRITABLE : ""; + } + } + } +} + + + +if (isset($_POST['upload'])) { + if (!$_POST['ac'] == md5(ADMINPWCHANGE)) { + exit; + } + $pref['upload_storagetype'] = "1"; + require_once(e_HANDLER."upload_handler.php"); + $files = $_FILES['file_userfile']; + foreach($files['name'] as $key => $name) { + if ($files['size'][$key]) { + $uploaded = file_upload(e_BASE.$_POST['upload_dir'][$key]); + } + } +} + +if (isset($message)) { + $ns->tablerender("", "
    ".$message."
    "); +} + +if (strpos(e_QUERY, ".") && !is_dir(realpath(e_BASE.$path))){ + echo "

    "; + if (!strpos(e_QUERY, "/")) { + $path = ""; + } else { + $path = substr($path, 0, strrpos(substr($path, 0, -1), "/"))."/"; + } +} + +$files = array(); +$dirs = array(); +$path = explode("?", $path); +$path = $path[0]; +$path = explode(".. ", $path); +$path = $path[0]; + +if ($handle = opendir(e_BASE.$path)) { + while (false !== ($file = readdir($handle))) { + if ($file != "." && $file != "..") { + + if (getenv('windir') && is_file(e_BASE.$path."\\".$file)) { + if (is_file(e_BASE.$path."\\".$file)) { + $files[] = $file; + } else { + $dirs[] = $file; + } + } else { + if (is_file(e_BASE.$path."/".$file)) { + $files[] = $file; + } else { + $dirs[] = $file; + } + } + } + } +} +closedir($handle); + +if (count($files) != 0) { + sort($files); +} +if (count($dirs) != 0) { + sort($dirs); +} + +if (count($files) == 1) { + $cstr = FMLAN_12; +} else { + $cstr = FMLAN_13; +} + +if (count($dirs) == 1) { + $dstr = FMLAN_14; +} else { + $dstr = FMLAN_15; +} + +$pathd = $path; + +$text = "
    \n +
    \n + \n + \n\n + + \n + \n + \n\n + + \n + \n + \n\n + +
    \n + ".FMLAN_32." + \n + \n +
    \n + \n +
    \n +
    \n +
    "; +$ns->tablerender(FMLAN_34, $text); + + +$text = "
    +
    + + "; + +$text .= " + + + + + + "; + +if ($path != e_FILE) { + if (substr_count($path, "/") == 1) { + $pathup = e_SELF; + } else { + $pathup = e_SELF."?".substr($path, 0, strrpos(substr($path, 0, -1), "/"))."/"; + } + $text .= " + "; +} + +$c = 0; +while ($dirs[$c]) { + $dirsize = dirsize($path.$dirs[$c]); + $text .= " + + + + + + + + + "; + $c++; +} + +$c = 0; +while ($files[$c]) { + $img = substr(strrchr($files[$c], "."), 1, 3); + if (!$img || !preg_match("/css|exe|gif|htm|jpg|js|php|png|txt|xml|zip/i", $img)) { + $img = "def"; + } + $size = parsesize(filesize(e_BASE.$path."/".$files[$c])); + $text .= " + + "; + $gen = new convert; + $filedate = $gen -> convert_date(filemtime(e_BASE.$path."/".$files[$c]), "forum"); + $text .= " + + + "; + $c++; +} + + $text .= "
     ".FMLAN_17."".FMLAN_18."".FMLAN_19."".LAN_OPTIONS."
    \"".FMLAN_30."\" + \"".FMLAN_16."\" +
    + \"".$dirs[$c]." + + ".$dirs[$c]." + ".$dirsize." +  "; + if (FILE_UPLOADS && is_writable(e_BASE.$path.$dirs[$c])) { + $text .= " +
    + + + +
    "; + } else { + $text .= " "; + } + $text .= "
    + \"".$files[$c]."\" + + ".$files[$c]." + ".$size."".$filedate.""; + + $text .= ""; + $text .=""; + + $text .="
    "; + + if ($pubfolder || e_QUERY == ""){ + require_once(e_HANDLER."file_class.php"); + $fl = new e_file; + $dl_dirlist = $fl->get_dirs(e_DOWNLOAD); + $movechoice = array(); + $movechoice[] = e_DOWNLOAD; + foreach($dl_dirlist as $dirs){ + $movechoice[] = e_DOWNLOAD.$dirs."/"; + } + sort($movechoice); + $movechoice[] = e_FILE."downloadimages/"; + if(e_QUERY != str_replace("../","",e_FILE."public/")){ + $movechoice[] = e_FILE."public/"; + } + if(e_QUERY != str_replace("../","",e_FILE."downloadthumbs/")){ + $movechoice[] = e_FILE."downloadthumbs/"; + } + if(e_QUERY != str_replace("../","",e_FILE."misc/")){ + $movechoice[] = e_FILE."misc/"; + } + if(e_QUERY != str_replace("../","",e_IMAGE)){ + $movechoice[] = e_IMAGE; + } + if(e_QUERY != str_replace("../","",e_IMAGE."newspost_images/")){ + $movechoice[] = e_IMAGE."newspost_images/"; + } + + + + + $text .= FMLAN_48."  "; + $text .="toJS(FMLAN_49)."') \" /> + "; + } + + $text .= "toJS(FMLAN_46)."') \" /> +
    + +
    +
    "; + +$ns->tablerender(FMLAN_29.": root/".$pathd."  [ ".count($dirs)." ".$dstr.", ".count($files)." ".$cstr." ]", $text); + +function dirsize($dir) { + $_SERVER["DOCUMENT_ROOT"].e_HTTP.$dir; + $dh = @opendir($_SERVER["DOCUMENT_ROOT"].e_HTTP.$dir); + $size = 0; + while ($file = @readdir($dh)) { + if ($file != "." and $file != "..") { + $path = $dir."/".$file; + if (is_file($_SERVER["DOCUMENT_ROOT"].e_HTTP.$path)) { + $size += filesize($_SERVER["DOCUMENT_ROOT"].e_HTTP.$path); + } else { + $size += dirsize($path."/"); + } + } + } + @closedir($dh); + return parsesize($size); +} + +function parsesize($size) { + $kb = 1024; + $mb = 1024 * $kb; + $gb = 1024 * $mb; + $tb = 1024 * $gb; + if ($size < $kb) { + return $size." b"; + } + else if($size < $mb) { + return round($size/$kb, 2)." kb"; + } + else if($size < $gb) { + return round($size/$mb, 2)." mb"; + } + else if($size < $tb) { + return round($size/$gb, 2)." gb"; + } else { + return round($size/$tb, 2)." tb"; + } +} + +require_once("footer.php"); +?> \ No newline at end of file diff --git a/e107_admin/filetypes_.php b/e107_admin/filetypes_.php new file mode 100644 index 000000000..ff76bf5b2 --- /dev/null +++ b/e107_admin/filetypes_.php @@ -0,0 +1 @@ +zip, gz, jpg, png, gif \ No newline at end of file diff --git a/e107_admin/fla.php b/e107_admin/fla.php new file mode 100644 index 000000000..6989e8131 --- /dev/null +++ b/e107_admin/fla.php @@ -0,0 +1,157 @@ + db_Delete("generic", "gen_id='$delete' "); + } + $message = FLALAN_3.": ".$delcount; + + $bancount = 0; + foreach($_POST['flaban'] as $ban) + { + if($sql -> db_Select("generic", "*", "gen_id=$ban")) + { + $at = $sql -> db_Fetch(); + $banlist_ip = $at['gen_ip']; + $sql->db_Insert("banlist", "'$banlist_ip', '".ADMINID."', '".FLALAN_4."' "); + $sql -> db_Delete("generic", "gen_id='$ban' "); + $bancount ++; + } + } + $message .= ", ".FLALAN_5.": ".$bancount; +} + + +if(e_QUERY == "dabl") +{ + $sql -> db_Delete("generic", "gen_type='auto_banned' "); + $message = FLALAN_17; +} + + +if($sql -> db_Select("generic", "*", "gen_type='auto_banned' ORDER BY gen_datestamp DESC ")) +{ + $abArray = $sql -> db_getList(); + $message = FLALAN_15; + foreach($abArray as $ab) + { + $message .= " - ".$ab['gen_ip']; + } + + $message .= ""; + +} + +if (isset($message)) { + $ns->tablerender("", "
    ".$message."
    "); +} + +$gen = new convert; +$fla_total = $sql->db_Count("generic", "(*)", "WHERE gen_type='failed_login'"); +if(!$sql -> db_Select("generic", "*", "gen_type='failed_login' ORDER BY gen_datestamp DESC LIMIT $from,$amount")) +{ + $text = "
    ".FLALAN_2."
    "; +} +else +{ + + $faArray = $sql -> db_getList('ALL', FALSE, FALSE); + + $text = " +
    + + + + + + + + "; + + foreach($faArray as $fa) + { + extract($fa); + + $host = $e107->get_host_name(getenv($gen_ip)); + $text .= " + + + + + + "; + } + + $text .= " + + + + + + + +
    ".FLALAN_6."".FLALAN_7."".FLALAN_8."".FLALAN_9."
    ".$gen->convert_date($gen_datestamp, "forum")."".str_replace(":::", "
    ", htmlentities($gen_chardata, ENT_QUOTES, CHARSET))."
    ".$fa['gen_ip']."
    {$host}
    + ".LAN_DELETE."
    + ".LAN_BAN." +
    + + ".FLALAN_11." - + ".FLALAN_12." +
    + ".FLALAN_13." - + ".FLALAN_14." + +
    +
    +

    + "; + + $parms = $fla_total.",".$amount.",".$from.",".e_SELF.'?'."[FROM].".$amount; + $text .= $tp->parseTemplate("{NEXTPREV={$parms}}"); + + $text .= "
    "; + + + +} + +$ns->tablerender(FLALAN_1, $text); + +require_once("footer.php"); + +?> diff --git a/e107_admin/footer.php b/e107_admin/footer.php new file mode 100644 index 000000000..0926fe1dc --- /dev/null +++ b/e107_admin/footer.php @@ -0,0 +1,99 @@ +db_Select('generic', '*', "gen_type='empty_cache'")) + { + $sql->db_Insert('generic', "0,'empty_cache','".time()."','0','','0',''"); + } else { + $row = $sql->db_Fetch(); + if (($row['gen_datestamp']+604800) < time()) // If cache not cleared in last 7 days, clear it. + { + require_once(e_HANDLER."cache_handler.php"); + $ec = new ecache; + $ec->clear(); + $sql->db_Update('generic', "gen_datestamp='".time()."' WHERE gen_type='empty_cache'"); + } + } + } +} +if (strpos(e_SELF.'?'.e_QUERY, 'menus.php?configure') === FALSE) { + parse_admin($ADMIN_FOOTER); +} +$eTimingStop = microtime(); +global $eTimingStart, $eTraffic; +$rendertime = number_format($eTraffic->TimeDelta( $eTimingStart, $eTimingStop ), 4); +$db_time = number_format($db_time,4); +$rinfo = ''; + +if($pref['displayrendertime']){ $rinfo .= "Render time: {$rendertime} second(s); {$db_time} of that for queries. "; } +if($pref['displaysql']){ $rinfo .= "DB queries: ".$sql -> db_QueryCount().". "; } +if(isset($pref['displaycacheinfo']) && $pref['displaycacheinfo']){ $rinfo .= $cachestring."."; } +echo ($rinfo ? "\n
    {$rinfo}
    \n" : ""); + +if($error_handler->debug == true) { + echo " +

    "; + + echo " +
    +

    PHP Errors:


    + ".$error_handler->return_errors()." +
    + "; + $tmp = $eTraffic->Display(); + if (strlen($tmp)) { + $ns->tablerender('Traffic Counters', $tmp); + } + + $tmp = $db_debug->Show_Performance(); + if (strlen($tmp)) { + $ns->tablerender('Time Analysis', $tmp); + } + $tmp = $db_debug->Show_SQL_Details(); + if (strlen($tmp)) { + $ns->tablerender('SQL Analysis', $tmp); + } +} + +if (function_exists('theme_foot')) +{ + echo theme_foot(); +} + +if(isset($footer_js) && is_array($footer_js)) +{ + $footer_js = array_unique($footer_js); + foreach($footer_js as $fname) + { + echo "\n"; + $js_included[] = $fname; + } +} + +echo ""; + +$sql->db_Close(); + +?> diff --git a/e107_admin/frontpage.php b/e107_admin/frontpage.php new file mode 100644 index 000000000..9ed149919 --- /dev/null +++ b/e107_admin/frontpage.php @@ -0,0 +1,266 @@ + 'news.php', 'title' => ADLAN_0); +$front_page['download'] = array('page' => 'download.php', 'title' => ADLAN_24); +$front_page['wmessage'] = array('page' => 'index.php', 'title' => ADLAN_28); + +if ($sql -> db_Select("page", "*", "page_theme=''")) { + $front_page['custom']['title'] = 'Custom Page'; + while ($row = $sql -> db_Fetch()) { + $front_page['custom']['page'][] = array('page' => 'page.php?'.$row['page_id'], 'title' => $row['page_title']); + } +} + + +foreach($pref['e_frontpage_list'] as $val) +{ + if (is_readable(e_PLUGIN.$val."/e_frontpage.php")) + { + require_once(e_PLUGIN.$val."/e_frontpage.php"); + } +} + + + +if (isset($_POST['edit'])) { + $_POST['type'] = (isset($_POST['edit']['all'])) ? 'all_users' : 'user_class'; + $_POST['class'] = key($_POST['edit']); +} + +if (isset($_POST['updatesettings'])) { + if ($_POST['frontpage'] == 'other') { + $_POST['other_page'] = $tp -> toForm($_POST['other_page']); + $frontpage_value = $_POST['other_page'] ? $_POST['other_page'] : 'news.php'; + } else { + if (is_array($front_page[$_POST['frontpage']]['page'])) { + $frontpage_value = $front_page[$_POST['frontpage']]['page'][$_POST['multipage'][$_POST['frontpage']]]['page']; + } else { + $frontpage_value = $front_page[$_POST['frontpage']]['page']; + } + } + + if ($_POST['type'] == 'all_users') { + unset($pref['frontpage']); + $pref['frontpage']['all'] = $frontpage_value; + } else { + if (isset($pref['frontpage']['all'])) { + $pref['frontpage']['252'] = ($_POST['class'] == '252') ? $frontpage_value : $pref['frontpage']['all']; + $pref['frontpage']['253'] = ($_POST['class'] == '253') ? $frontpage_value : $pref['frontpage']['all']; + $pref['frontpage']['254'] = ($_POST['class'] == '254') ? $frontpage_value : $pref['frontpage']['all']; + $class_list = get_userclass_list(); + foreach ($class_list as $fp_class) { + $pref['frontpage'][$fp_class['userclass_id']] = ($_POST['class'] == $fp_class['userclass_id']) ? $frontpage_value : $pref['frontpage']['all']; + } + unset($pref['frontpage']['all']); + } + $pref['frontpage'][$_POST['class']] = $frontpage_value; + } + + save_prefs(); + $ns -> tablerender(LAN_UPDATED, "
    ".FRTLAN_1."
    "); +} + +$fp = new frontpage; + +if (isset($_POST['select']) || isset($_POST['edit'])) { + $fp -> select_page(); +} else { + $fp -> select_class(); +} + +class frontpage { + function select_class() { + global $rs, $pref, $ns, $front_page; + $text = "
    +
    + "; + + $text .= " + + + "; + + $text .= " + + +
    ".FRTLAN_2.": + ".$rs -> form_radio('type', 'all_users', (isset($pref['frontpage']['all']) ? TRUE : FALSE))." ".FRTLAN_31."  + ".$rs -> form_radio('type', 'user_class', (isset($pref['frontpage']['all']) ? FALSE : TRUE))." ".FRTLAN_32.": + ".r_userclass('class', '', 'off', 'guest,member,admin,classes')."
    + ".$rs -> form_button('submit', 'select', LAN_SELECT)." +
    +
    +
    "; + + $ns -> tablerender(FRTLAN_13, $text); + + $text = "
    +
    + + + + + "; + + if (isset($pref['frontpage']['all'])) { + $text .= " + + + + "; + } else { + foreach ($pref['frontpage'] as $current_key => $current_value) { + if ($current_key == 252) { + $title = FRTLAN_27; + } else if ($current_key == 253) { + $title = FRTLAN_28; + } else if ($current_key == 254) { + $title = FRTLAN_29; + } else { + $class_list = get_userclass_list(); + foreach ($class_list as $fp_class) { + if ($current_key == $fp_class['userclass_id']) { + $title = $fp_class['userclass_name']; + } + } + } + $text .= " + + + + "; + } + } + $text .= "
    ".FRTLAN_32."".FRTLAN_34."".LAN_EDIT."
    All Users".$pref['frontpage']['all']." + +
    ".$title."".$current_value." + +
    +
    +
    "; + + $ns -> tablerender(FRTLAN_33, $text); + + } + + function select_page() { + global $rs, $pref, $ns, $front_page; + + if ($_POST['type'] == 'all_users') { + $title = FRTLAN_26; + } else { + if ($_POST['class'] == 252) { + $title = FRTLAN_27; + } else if ($_POST['class'] == 253) { + $title = FRTLAN_28; + } else if ($_POST['class'] == 254) { + $title = FRTLAN_29; + } else { + $class_list = get_userclass_list(); + foreach ($class_list as $fp_class) { + if ($_POST['class'] == $fp_class['userclass_id']) { + $title = $fp_class['userclass_name']; + } + } + } + } + + $text = "
    +
    + + + + "; + + foreach ($front_page as $front_key => $front_value) { + $type_selected = FALSE; + $current_setting = (isset($pref['frontpage']['all'])) ? $pref['frontpage']['all'] : $pref['frontpage'][$_POST['class']]; + if (is_array($front_value['page'])) { + foreach ($front_value['page'] as $multipage) { + if ($current_setting == $multipage['page']) { + $type_selected = TRUE; + $not_other = TRUE; + } + } + } else { + if ($current_setting == $front_value['page']) { + $type_selected = TRUE; + $not_other = TRUE; + } + } + + $text .= ""; + + if (is_array($front_value['page'])) { + $text .= ""; + $text .= ""; + } else { + $text .= ""; + } + $text .= ""; + } + + $text .= " + + + + "; + + $text .= " + + +
    ".FRTLAN_2." ".$title.":
    "; + $text .= $rs -> form_radio('frontpage', $front_key, $type_selected); + $text .= "".$front_value['title'].""; + $text .= $rs -> form_select_open('multipage['.$front_key.']'); + $type = isset($pref['frontpage']['all']) ? 'all' : $_POST['class']; + foreach ($front_value['page'] as $multipage_key => $multipage_value) { + $sub_selected = ($pref['frontpage'][$type] == $multipage_value['page']) ? TRUE : FALSE; + $text .= $rs -> form_option($multipage_value['title'], $sub_selected, $multipage_key); + } + $text .= $rs -> form_select_close(); + $text .= "".$front_value['title']."
    ".$rs -> form_radio('frontpage', 'other', (!$not_other ? TRUE : FALSE))."".FRTLAN_15." + ".$rs -> form_text('other_page', 50, (!$not_other ? $current_setting : ''))." +
    "; + $text .= $rs -> form_hidden('type', $_POST['type']); + $text .= $rs -> form_hidden('class', $_POST['class']); + $text .= $rs -> form_button('submit', 'updatesettings', FRTLAN_12); + $text .= "
    +
    +
    "; + + $ns -> tablerender(FRTLAN_13, $text); + } +} + +require_once('footer.php'); + +?> \ No newline at end of file diff --git a/e107_admin/header.php b/e107_admin/header.php new file mode 100644 index 000000000..8e7928721 --- /dev/null +++ b/e107_admin/header.php @@ -0,0 +1,336 @@ +"; +if (file_exists(e_LANGUAGEDIR.e_LANGUAGE.'/admin/lan_header.php')) { + @include_once(e_LANGUAGEDIR.e_LANGUAGE."/admin/lan_header.php"); +} else { + @include_once(e_LANGUAGEDIR."English/admin/lan_header.php"); +} +if (file_exists(e_LANGUAGEDIR.e_LANGUAGE.'/admin/lan_footer.php')) { + @include_once(e_LANGUAGEDIR.e_LANGUAGE.'/admin/lan_footer.php'); +} else { + @include_once(e_LANGUAGEDIR.'English/admin/lan_footer.php'); +} +if (!defined('ADMIN_WIDTH')) { + define('ADMIN_WIDTH', 'width: 95%'); +} + +if (!defined('ADMIN_TRUE_ICON')) +{ + define("ADMIN_TRUE_ICON", ""); + define("ADMIN_TRUE_ICON_PATH", e_IMAGE."fileinspector/integrity_pass.png"); +} + +if (!defined('ADMIN_FALSE_ICON')) +{ + define("ADMIN_FALSE_ICON", ""); + define("ADMIN_FALSE_ICON_PATH", e_IMAGE."fileinspector/integrity_fail.png"); +} + + +if (!defined('ADMIN_EDIT_ICON')) +{ + define("ADMIN_EDIT_ICON", ""); + define("ADMIN_EDIT_ICON_PATH", e_IMAGE."admin_images/edit_16.png"); +} + + + +if (!defined('ADMIN_DELETE_ICON')) +{ + define("ADMIN_DELETE_ICON", ""); + define("ADMIN_DELETE_ICON_PATH", e_IMAGE."admin_images/delete_16.png"); +} + +echo " + + + ".SITENAME." : ".LAN_head_4."\n"; +echo " + \n"; +if (strpos(e_SELF.'?'.e_QUERY, 'menus.php?configure') === FALSE && isset($pref['admincss']) && $pref['admincss'] && file_exists(THEME.$pref['admincss'])) { + $css_file = file_exists(THEME.'admin_'.$pref['admincss']) ? THEME_ABS.'admin_'.$pref['admincss'] : THEME_ABS.$pref['admincss']; + echo "\n"; +} else if (isset($pref['themecss']) && $pref['themecss'] && file_exists(THEME.$pref['themecss'])) { + $css_file = file_exists(THEME.'admin_'.$pref['themecss']) ? THEME_ABS.'admin_'.$pref['themecss'] : THEME_ABS.$pref['themecss']; + echo "\n"; +} else { + $css_file = file_exists(THEME.'admin_style.css') ? THEME_ABS.'admin_style.css' : THEME_ABS.'style.css'; + echo "\n"; +} + +if (!isset($no_core_css) || !$no_core_css) { + echo "\n"; +} + +// ---------- Favicon --------- +if (file_exists(THEME."favicon.ico")) { + echo "\n\n"; +}elseif (file_exists(e_BASE."favicon.ico")) { + echo "\n\n"; +} + + +if (function_exists('theme_head')) { + echo theme_head(); +} +if (strpos(e_SELF.'?'.e_QUERY, 'menus.php?configure') === FALSE) { + echo "\n"; +} +if (file_exists(THEME."theme.js")) { + echo "\n"; +} +if (filesize(e_FILE.'user.js')) { + echo "\n"; +} +if (function_exists("headerjs")) { + echo headerjs(); +} +if (isset($htmlarea_js) && $htmlarea_js) { + echo $htmlarea_js; +} +if (strpos(e_SELF, 'fileinspector.php') === FALSE) { +echo "\n"; +} +if (isset($eplug_js) && $eplug_js) { + echo "\n"; +} +if (isset($eplug_css) && $eplug_css) { + echo "\n\n"; +} +if(check_class($pref['post_html']) && $pref['wysiwyg'] && $e_wysiwyg == TRUE){ + require_once(e_HANDLER."tiny_mce/wysiwyg.php"); + echo wysiwyg($e_wysiwyg); + define("e_WYSIWYG",TRUE); +}else{ + define("e_WYSIWYG",FALSE); +} +// load plugin header-data. +foreach($pref['e_meta_list'] as $val) +{ + if(is_readable(e_PLUGIN.$val."/e_meta.php")) + { + require_once(e_PLUGIN.$val."/e_meta.php"); + } +} + + + +echo " +\n"; + +$ns = new e107table; +$e107_var = array(); + +if (!function_exists('show_admin_menu')) { + function show_admin_menu($title, $active_page, $e107_vars, $js = FALSE, $sub_link = FALSE, $sortlist = FALSE) { + global $ns, $BUTTON, $BUTTON_OVER, $BUTTONS_START, $BUTTONS_END, $SUB_BUTTON, $SUB_BUTTON_OVER, $SUB_BUTTONS_START, $SUB_BUTTONS_END; + $id_title = "yop_".str_replace(" ", "", $title); + if (!isset($BUTTONS_START)) { + $BUTTONS_START = "
    \n"; + } + if (!isset($BUTTON)) { + $BUTTON = "\n"; + } + if (!isset($BUTTON_OVER)) { + $BUTTON_OVER = "\n"; + } + if (!isset($BUTTONS_END)) { + $BUTTONS_END = "
    \n"; + } + if (!isset($SUB_BUTTON)) { + $SUB_BUTTON = "{LINK_TEXT}
    "; + } + if (!isset($SUB_BUTTON_OVER)) { + $SUB_BUTTON_OVER = " « {LINK_TEXT} »
    "; + } + if (!isset($SUB_BUTTONS_START)) { + $SUB_BUTTONS_START = "
    + +
    {SUB_HEAD}
    "; + } + + if ($sortlist == TRUE) { + $temp = $e107_vars; + unset($e107_vars); + foreach (array_keys($temp) as $key) { + $func_list[] = $temp[$key]['text']; + } + + usort($func_list, 'strcoll'); + + foreach ($func_list as $func_text) { + foreach (array_keys($temp) as $key) { + if ($temp[$key]['text'] == $func_text) { + $e107_vars[] = $temp[$key]; + } + } + } + } + + $search[0] = "/\{LINK_TEXT\}(.*?)/si"; + $search[1] = "/\{LINK_URL\}(.*?)/si"; + $search[2] = "/\{ONCLICK\}(.*?)/si"; + $search[3] = "/\{SUB_HEAD\}(.*?)/si"; + $search[4] = "/\{SUB_HEAD_ID\}(.*?)/si"; + + if ($sub_link) { + $replace[0] = ''; + $replace[1] = ''; + $replace[2] = ''; + $replace[3] = $title; + $replace[4] = $id_title; + $text = preg_replace($search, $replace, $SUB_BUTTONS_START); + } else { + $text = $BUTTONS_START; + } + + foreach (array_keys($e107_vars) as $act) { + if (!isset($e107_vars[$act]['perm']) || !$e107_vars[$act]['perm'] || getperms($e107_vars[$act]['perm'])) { + if ($active_page == $act || (str_replace("?", "", e_PAGE.e_QUERY) == str_replace("?", "", $act))) { + $BUTTON_TEMPLATE = $sub_link ? $SUB_BUTTON_OVER : $BUTTON_OVER; + } else { + $BUTTON_TEMPLATE = $sub_link ? $SUB_BUTTON : $BUTTON; + } + $replace[0] = str_replace(" ", " ", $e107_vars[$act]['text']); + $replace[1] = $e107_vars[$act]['link']; + if ($e107_vars[$act]['include']!='') { + $replace[2] = $e107_vars[$act]['include']; + } else { + $replace[2] = $js ? "onclick=\"showhideit('".$act."');\"" : "onclick=\"document.location='".$e107_vars[$act]['link']."'; disabled=true;\""; + } + $replace[3] = $title; + $replace[4] = $id_title; + $text .= preg_replace($search, $replace, $BUTTON_TEMPLATE); + } + } + $text .= $sub_link ? $SUB_BUTTONS_END : $BUTTONS_END; + + if ($title == "" || $sub_link) { + return $text; + } else { + $ns -> tablerender($title, $text, array('id' => $id_title, 'style' => 'button_menu')); + } + } +} + +if (file_exists(THEME.'admin_template.php')) { + require_once(THEME.'admin_template.php'); +} else { + require_once(e_BASE.$THEMES_DIRECTORY.'templates/admin_template.php'); +} + +if (!function_exists("parse_admin")) { + function parse_admin($ADMINLAYOUT) { + global $tp; + $adtmp = explode("\n", $ADMINLAYOUT); + for ($a = 0; $a < count($adtmp); $a++) { + if (preg_match("/{.+?}/", $adtmp[$a])) { + echo $tp->parseTemplate($adtmp[$a]); + } else { + echo $adtmp[$a]; + } + } + } +} + +function admin_update($update, $type = 'update', $success = false, $failed = false) { + global $ns; + if (($type == 'update' && $update) || ($type == 'insert' && $update !== false)) { + $caption = LAN_UPDATE; + $text = "".($success ? $success : LAN_UPDATED).""; + } else if ($type == 'delete' && $update) { + $caption = LAN_DELETE; + $text = "".($success ? $success : LAN_DELETED).""; + } else if (!mysql_errno()) { + if ($type == 'update') { + $caption = LAN_UPDATED_FAILED; + $text = "".LAN_NO_CHANGE."
    ".LAN_TRY_AGAIN."
    "; + } else if ($type == 'delete') { + $caption = LAN_DELETE; + $text = "".LAN_DELETED_FAILED.".
    ".LAN_TRY_AGAIN."
    "; + } + } else { + $caption = LAN_UPDATED_FAILED; + $text = "".($failed ? $failed : LAN_UPDATED_FAILED." - ".LAN_TRY_AGAIN)."
    ".LAN_ERROR." ".mysql_errno().": ".mysql_error(); + } + $ns -> tablerender($caption, "
    ".$text."
    "); + return $update; +} + +function admin_purge_related($table, $id) +{ + global $ns, $tp; + $msg = ""; + $tp->parseTemplate(""); + + // Delete any related comments + require_once(e_HANDLER."comment_class.php"); + $_com = new comment; + $num = $_com->delete_comments($table, $id); + if($num) + { + $msg .= $num." ".ADLAN_114." ".LAN_DELETED."
    "; + } + + // Delete any related ratings + require_once(e_HANDLER."rate_class.php"); + $_rate = new rater; + $num = $_rate->delete_ratings($table, $id); + if($num) + { + $msg .= LAN_RATING." ".LAN_DELETED."
    "; + } + + if($msg) + { + $ns->tablerender(LAN_DELETE, $msg); + } +} + +if (strpos(e_SELF.'?'.e_QUERY, 'menus.php?configure') === FALSE) { + parse_admin($ADMIN_HEADER); +} + +?> \ No newline at end of file diff --git a/e107_admin/image.php b/e107_admin/image.php new file mode 100644 index 000000000..38f2f6cb5 --- /dev/null +++ b/e107_admin/image.php @@ -0,0 +1,385 @@ +db_Update("user", "user_image='' WHERE user_image='-upload-$image'"); + $sql->db_Update("user", "user_sess='' WHERE user_sess='$image'"); + $message = $image." ".IMALAN_28; +} + +if (isset($_POST['deleteall'])) { + $handle = opendir(e_FILE."public/avatars/"); + while ($file = readdir($handle)) { + if ($file != '.' && $file != '..' && $file != "index.html" && $file != "null.txt" && $file != '/' && $file != 'CVS' && $file != 'Thumbs.db') { + $dirlist[] = $file; + } + } + closedir($handle); + $count = 0; + while (list($key, $image_name) = each($dirlist)) { + if (!$sql->db_Select("user", "*", "user_image='-upload-$image_name' OR user_sess='$image_name'")) { + unlink(e_FILE."public/avatars/".$image_name); + $count ++; + } + } + $message = $count." ".IMALAN_26; +} + +if (isset($_POST['avdelete'])) { + require_once(e_HANDLER."avatar_handler.php"); + foreach($_POST['avdelete'] as $key => $val) + { + $key = $tp->toDB($key); // We only need the key + if ($sql->db_Select("user", "*", "user_id='$key'")) { + $row = $sql->db_Fetch(); + extract($row); + $avname=avatar($user_image); + if (strpos($avname,"http://")===FALSE) + { // Internal file, so unlink it + @unlink($avname); + } + $sql->db_Update("user","user_image='' WHERE user_id='$key'"); + $message = IMALAN_51.$user_name." ".IMALAN_28; + } + } + $_POST['check_avatar_sizes'] = TRUE; // Force size recheck after doing one or more deletes +} + +if (isset($_POST['update_options'])) { + $pref['image_post'] = $_POST['image_post']; + $pref['resize_method'] = $_POST['resize_method']; + $pref['im_path'] = $tp->toDB($_POST['im_path']); + $pref['image_post_class'] = $_POST['image_post_class']; + $pref['image_post_disabled_method'] = $_POST['image_post_disabled_method']; + $pref['enable_png_image_fix'] = $_POST['enable_png_image_fix']; + + save_prefs(); + $message = IMALAN_9; +} + +if (isset($message)) { + $ns->tablerender("", "
    ".$message."
    "); +} + + +if (isset($_POST['show_avatars'])) { + + $handle = opendir(e_FILE."public/avatars/"); + while ($file = readdir($handle)) { + if ($file != '.' && $file != '..' && $file != "index.html" && $file != "null.txt" && $file != '/' && $file != 'CVS' && $file != 'Thumbs.db' && !is_dir($file)) { + $dirlist[] = $file; + } + } + closedir($handle); + + $text = "
    \n"; + + if (!is_array($dirlist)) { + $text .= IMALAN_29; + } else { + + + + while (list($key, $image_name) = each($dirlist)) { + $users = IMALAN_21." | "; + if ($sql->db_Select("user", "*", "user_image='-upload-$image_name' OR user_sess='$image_name'")) { + while ($row = $sql->db_Fetch()) { + extract($row); + $users .= "$user_name (".($user_sess == $image_name ? IMALAN_24 : IMALAN_23).") | "; + } + } else { + $users = IMALAN_22; + } + + $text .= "
    +
    + + + + + + + + + + +
    $image_name

    + + +
    $users
    +
    +
    "; + } + + $text .= "
    +
    + + + + +
    + +
    +
    +
    "; + + } + + $text .= "
    "; + + $ns->tablerender(IMALAN_18, $text); +} + +if (isset($_POST['check_avatar_sizes'])) { + // + // Set up to track what we've done + // + $iUserCount = 0; + $iAVinternal = 0; + $iAVexternal = 0; + $iAVnotfound = 0; + $iAVtoobig = 0; + require_once(e_HANDLER."avatar_handler.php"); + $text = "
    \n"; + $text .= "
    +
    + + + + + + + + + "; + + // + // Loop through avatar field for every user + // + $iUserCount = $sql->db_Count("user"); + if ($sql->db_Select("user", "*", "user_image!=''")) { + while ($row = $sql->db_Fetch()) { + extract($row); + + // + // Check size + // + $avname=avatar($user_image); + if (strpos($avname,"http://")!==FALSE) + { + $iAVexternal++; + $bAVext=TRUE; + } else { + $iAVinternal++; + $bAVext=FALSE; + } + $image_stats = getimagesize($avname); + $sBadImage=""; + if (!$image_stats) + { + $iAVnotfound++; + // allow delete + $sBadImage=IMALAN_42; + } else { + $imageWidth = $image_stats[0]; + $imageHeight = $image_stats[1]; + if ( ($imageHeight > $pref['im_height']) || ($imageWidth>$pref['im_width']) ) + { // Too tall or too wide + $iAVtoobig++; + if ($imageWidth > $pref['im_width']) { + $sBadImage = IMALAN_40." ($imageWidth)"; + } + if ($imageHeight > $pref['im_height']) { + if (strlen($sBadImage)) + { + $sBadImage .= ", "; + } + $sBadImage .= IMALAN_41." ($imageHeight)"; + } + } + } + + // + // If not found or too big, allow delete + // + if (strlen($sBadImage)) + { + $sBadImage .=" [".$avname."]"; // Show all files that have a problem + $text .= " + + + + "; + } + } + } + // + // Done, so show stats + // + $text .= " + + + + + + + + + + + + + + + + + + + + +
    ".$pref['im_width']."".IMALAN_38."
    ".$pref['im_height']."".IMALAN_39."
    + + ".IMALAN_51."".$user_name." ".$sBadImage."
    ".$iAVnotfound."".IMALAN_45."
    ".$iAVtoobig."".IMALAN_46."
    ".$iAVinternal."".IMALAN_47."
    ".$iAVexternal."".IMALAN_48."
    ".($iAVexternal+$iAVinternal)." (".(int)(100.0*(($iAVexternal+$iAVinternal)/$iUserCount)).'%, '.$iUserCount." ".IMALAN_50.")".IMALAN_49."
    +
    +
    "; + + $text .= "
    "; + + $ns->tablerender(IMALAN_37, $text); +} + + +$text = "
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + ".IMALAN_1."
    + ".IMALAN_2." +
    ". ($pref['image_post'] ? "" : "")." +
    + ".IMALAN_10."
    + ".IMALAN_11." +
    + + + + +
    + ".IMALAN_12."
    + ".IMALAN_13." +
    +
    ".IMALAN_3."
    ".IMALAN_4."
    + +
    ".IMALAN_5."
    ".IMALAN_6."
    + +
    ".IMALAN_34."
    + ".IMALAN_35." +
    ".($pref['enable_png_image_fix'] ? "" : "")." +
    ".IMALAN_16." + +
    ".IMALAN_36." + +
    + +
    "; +$ns->tablerender(IMALAN_7, $text); + + +require_once("footer.php"); + + + +$pref['resize_method'] = $_POST['resize_method']; +$pref['im_path'] = $_POST['im_path']; + + +?> diff --git a/e107_admin/includes/beginner.php b/e107_admin/includes/beginner.php new file mode 100644 index 000000000..90e28687c --- /dev/null +++ b/e107_admin/includes/beginner.php @@ -0,0 +1,89 @@ +

    + "; + + // $newarray[28] = array(e_ADMIN."plugin.php", ADLAN_98, ADLAN_99, "Z", 2, E_16_PLUGMANAGER, E_32_PLUGMANAGER); + + $selection = array(22,12,17,25,5,19,7,23,28,26); + // $selection = array(21,11,17,24,5,19,7,27,28,25); + foreach($selection as $id) + { + $buts .= render_links($newarray[$id][0],$newarray[$id][1],$newarray[$id][2],$newarray[$id][3],$newarray[$id][6],'beginner'); + } + + $text .= $buts; + $text .= render_clean(); + $text .= "\n

    "; + + $text .= "
    ".ADLAN_144." ".ADLAN_145."  
    "; + + if($buts != '') + { + $ns->tablerender(ADLAN_47." ".ADMINNAME, $text); + } + + + + + + + $text = "
    + "; + + $text .= render_links(e_ADMIN."plugin.php", ADLAN_98, ADLAN_99, "Z", E_32_PLUGMANAGER, "classis"); + + if ($sql->db_Select("plugin", "*", "plugin_installflag=1")) + { + while ($row = $sql->db_Fetch()) + { + extract($row); + include(e_PLUGIN.$plugin_path."/plugin.php"); + if ($eplug_conffile) + { + $eplug_name = $tp->toHTML($eplug_name,FALSE,"defs emotes_off"); + $plugin_icon = $eplug_icon ? "" : E_32_CAT_PLUG; + $plugin_array[ucfirst($eplug_name)] = array('link' => e_PLUGIN.$plugin_path."/".$eplug_conffile, 'title' => $eplug_name, 'caption' => $eplug_caption, 'perms' => "P".$plugin_id, 'icon' => $plugin_icon); + } + unset($eplug_conffile, $eplug_name, $eplug_caption, $eplug_icon); + } + } + + ksort($plugin_array, SORT_STRING); + foreach ($plugin_array as $plug_key => $plug_value) + { + $text .= render_links($plug_value['link'], $plug_value['title'], $plug_value['caption'], $plug_value['perms'], $plug_value['icon'], 'classis'); + } + + $text .= render_clean(); + $text .= "
    "; + + $ns->tablerender(ADLAN_CL_7, $text); + +?> diff --git a/e107_admin/includes/cascade.php b/e107_admin/includes/cascade.php new file mode 100644 index 000000000..98a39a0a2 --- /dev/null +++ b/e107_admin/includes/cascade.php @@ -0,0 +1,59 @@ + + "; + +while (list($key, $funcinfo) = each($newarray)) { + $text .= render_links($funcinfo[0], $funcinfo[1], $funcinfo[2], $funcinfo[3], $funcinfo[5], 'adminb'); +} + +$text .= " + + "; + +$text .= render_links(e_ADMIN."plugin.php", ADLAN_98, ADLAN_99, "Z", E_16_PLUGMANAGER, 'adminb'); + +if ($sql->db_Select("plugin", "*", "plugin_installflag=1")) { + while ($row = $sql->db_Fetch()) { + extract($row); + include(e_PLUGIN.$plugin_path."/plugin.php"); + if ($eplug_conffile) { + $eplug_name = $tp->toHTML($eplug_name,FALSE,"defs emotes_off"); + $plugin_icon = $eplug_icon_small ? "" : E_16_PLUGIN; + $plugin_array[ucfirst($eplug_name)] = array('link' => e_PLUGIN.$plugin_path."/".$eplug_conffile, 'title' => $eplug_name, 'caption' => $eplug_caption, 'perms' => "P".$plugin_id, 'icon' => $plugin_icon); + } + unset($eplug_conffile, $eplug_name, $eplug_caption, $eplug_icon_small); + } +} + +ksort($plugin_array, SORT_STRING); +foreach ($plugin_array as $plug_key => $plug_value) { + $text .= render_links($plug_value['link'], $plug_value['title'], $plug_value['caption'], $plug_value['perms'], $plug_value['icon'], 'adminb'); +} + +$text .= "
    + ".ADLAN_CL_7." +
    "; + +$ns->tablerender(ADLAN_47." ".ADMINNAME, $text); + +?> diff --git a/e107_admin/includes/categories.php b/e107_admin/includes/categories.php new file mode 100644 index 000000000..57ffaa044 --- /dev/null +++ b/e107_admin/includes/categories.php @@ -0,0 +1,83 @@ + + "; + +foreach ($admin_cat['id'] as $cat_key => $cat_id) { + $text_check = FALSE; + $text_cat = " + "; + if ($text_check) { + $text .= $text_cat; + } +} + +$text .= "
    ".$admin_cat['title'][$cat_key]."
    ".$admin_cat['lrg_img'][$cat_key]." + "; + if ($cat_key != 5) { + foreach ($newarray as $key => $funcinfo) { + if ($funcinfo[4] == $cat_key) { + $text_rend = render_links($funcinfo[0], $funcinfo[1], $funcinfo[2], $funcinfo[3], $funcinfo[5], 'default'); + if ($text_rend) { + $text_check = TRUE; + } + $text_cat .= $text_rend; + } + } + } else { + $text_rend = render_links(e_ADMIN."plugin.php", ADLAN_98, ADLAN_99, "Z", E_16_PLUGMANAGER, 'default'); + + if ($text_rend) { + $text_check = TRUE; + } + $text_cat .= $text_rend; + if ($sql->db_Select("plugin", "*", "plugin_installflag=1")) { + while ($row = $sql->db_Fetch()) { + extract($row); + include(e_PLUGIN.$plugin_path."/plugin.php"); + if ($eplug_conffile) { + $eplug_name = $tp->toHTML($eplug_name,FALSE,"defs emotes_off"); + $plugin_icon = $eplug_icon_small ? "".$eplug_caption."" : E_16_PLUGIN; + $plugin_array[ucfirst($eplug_name)] = array('link' => e_PLUGIN.$plugin_path."/".$eplug_conffile, 'title' => $eplug_name, 'caption' => $eplug_caption, 'perms' => "P".$plugin_id, 'icon' => $plugin_icon); + //$text_rend = render_links(e_PLUGIN.$plugin_path."/".$eplug_conffile, $eplug_name, $eplug_caption, "P".$plugin_id, $plugin_icon, 'default'); + if ($plugin_array[0]) { + $text_check = TRUE; + } + //$text_cat .= $text_rend; + } + unset($eplug_conffile, $eplug_name, $eplug_caption, $eplug_icon_small); + } + } + ksort($plugin_array, SORT_STRING); + foreach ($plugin_array as $plug_key => $plug_value) { + $text_cat .= render_links($plug_value['link'], $plug_value['title'], $plug_value['caption'], $plug_value['perms'], $plug_value['icon'], 'default'); + } + } + $text_cat .= render_clean(); + $text_cat .= "
    +
    "; + +$ns->tablerender(ADLAN_47." ".ADMINNAME, $text); + +echo admin_info(); + +?> diff --git a/e107_admin/includes/classis.php b/e107_admin/includes/classis.php new file mode 100644 index 000000000..2f5c65df6 --- /dev/null +++ b/e107_admin/includes/classis.php @@ -0,0 +1,66 @@ + + "; + $text .= $buts; + $text .= render_clean(); + $text .= "
    "; + $ns->tablerender(ADLAN_47." ".ADMINNAME, $text); +} +$text = "
    + "; + +$text .= render_links(e_ADMIN."plugin.php", ADLAN_98, ADLAN_99, "Z", E_32_PLUGMANAGER, "classis"); + +if ($sql->db_Select("plugin", "*", "plugin_installflag=1")) { + while ($row = $sql->db_Fetch()) { + extract($row); + include(e_PLUGIN.$plugin_path."/plugin.php"); + if ($eplug_conffile) { + $eplug_name = $tp->toHTML($eplug_name,FALSE,"defs emotes_off"); + $plugin_icon = $eplug_icon ? "" : E_32_CAT_PLUG; + $plugin_array[ucfirst($eplug_name)] = array('link' => e_PLUGIN.$plugin_path."/".$eplug_conffile, 'title' => $eplug_name, 'caption' => $eplug_caption, 'perms' => "P".$plugin_id, 'icon' => $plugin_icon); + } + unset($eplug_conffile, $eplug_name, $eplug_caption, $eplug_icon); + } +} + +ksort($plugin_array, SORT_STRING); +foreach ($plugin_array as $plug_key => $plug_value) { + $text .= render_links($plug_value['link'], $plug_value['title'], $plug_value['caption'], $plug_value['perms'], $plug_value['icon'], 'classis'); +} + +$text .= render_clean(); + +$text .= "
    "; + +$ns->tablerender(ADLAN_CL_7, $text); + +?> diff --git a/e107_admin/includes/combo.php b/e107_admin/includes/combo.php new file mode 100644 index 000000000..f13a7ef44 --- /dev/null +++ b/e107_admin/includes/combo.php @@ -0,0 +1,70 @@ + + "; +$buts = ""; +while (list($key, $funcinfo) = each($newarray)) { + $buts .= render_links($funcinfo[0], $funcinfo[1], $funcinfo[2], $funcinfo[3], $funcinfo[5], 'default'); +} +$text .= $buts; +while ($td <= 5) { + $text .= ""; + $td++; +} +$td = 1; +$text .= "
    "; +if($buts != ""){ + $ns->tablerender(ADLAN_47." ".ADMINNAME, $text); +} + +$text = "
    + "; + +$text .= render_links(e_ADMIN."plugin.php", ADLAN_98, ADLAN_99, "Z", E_32_PLUGMANAGER, "classis"); + +if ($sql->db_Select("plugin", "*", "plugin_installflag=1")) { + while ($row = $sql->db_Fetch()) { + extract($row); + include(e_PLUGIN.$plugin_path."/plugin.php"); + if ($eplug_conffile) { + $eplug_name = $tp->toHTML($eplug_name,FALSE,"defs emotes_off"); + $plugin_icon = $eplug_icon ? "" : E_32_CAT_PLUG; + $plugin_array[ucfirst($eplug_name)] = array('link' => e_PLUGIN.$plugin_path."/".$eplug_conffile, 'title' => $eplug_name, 'caption' => $eplug_caption, 'perms' => "P".$plugin_id, 'icon' => $plugin_icon); + } + unset($eplug_conffile, $eplug_name, $eplug_caption, $eplug_icon); + } +} + +ksort($plugin_array, SORT_STRING); +foreach ($plugin_array as $plug_key => $plug_value) { + $text .= render_links($plug_value['link'], $plug_value['title'], $plug_value['caption'], $plug_value['perms'], $plug_value['icon'], 'classis'); +} + +$text .= render_clean(); + +$text .= "
    "; + +$ns->tablerender(ADLAN_CL_7, $text); + +echo admin_info(); + +?> diff --git a/e107_admin/includes/compact.php b/e107_admin/includes/compact.php new file mode 100644 index 000000000..9d0e5f502 --- /dev/null +++ b/e107_admin/includes/compact.php @@ -0,0 +1,73 @@ + + "; + +while (list($key, $funcinfo) = each($newarray)) { + $buts .= render_links($funcinfo[0], $funcinfo[1], $funcinfo[2], $funcinfo[3], $funcinfo[5], 'default'); +} +$text .= $buts; + +$text_cat = ''; +while ($td <= 5) { + $text_cat .= ""; + $td++; +} +$td = 1; + +$text .= "
    "; + +if($buts !=""){ + $ns->tablerender(ADLAN_47." ".ADMINNAME, $text); +} + +$text = "
    + "; + +$text .= render_links(e_ADMIN."plugin.php", ADLAN_98, ADLAN_99, "Z", E_16_PLUGMANAGER, 'default'); + +if ($sql->db_Select("plugin", "*", "plugin_installflag=1")) { + while ($row = $sql->db_Fetch()) { + extract($row); + include(e_PLUGIN.$plugin_path."/plugin.php"); + if ($eplug_conffile) { + $eplug_name = $tp->toHTML($eplug_name,FALSE,"defs emotes_off"); + $plugin_icon = $eplug_icon_small ? "" : E_16_PLUGIN; + $plugin_array[ucfirst($eplug_name)] = array('link' => e_PLUGIN.$plugin_path."/".$eplug_conffile, 'title' => $eplug_name, 'caption' => $eplug_caption, 'perms' => "P".$plugin_id, 'icon' => $plugin_icon); + } + unset($eplug_conffile, $eplug_name, $eplug_caption, $eplug_icon_small); + } +} + +ksort($plugin_array, SORT_STRING); +foreach ($plugin_array as $plug_key => $plug_value) { + $text .= render_links($plug_value['link'], $plug_value['title'], $plug_value['caption'], $plug_value['perms'], $plug_value['icon'], 'default'); +} + +$text .= " +
    "; + +$ns->tablerender(ADLAN_CL_7, $text); + +echo admin_info(); + +?> diff --git a/e107_admin/index.php b/e107_admin/index.php new file mode 100644 index 000000000..a4ee67f4a --- /dev/null +++ b/e107_admin/index.php @@ -0,0 +1,23 @@ + \ No newline at end of file diff --git a/e107_admin/lancheck.php b/e107_admin/lancheck.php new file mode 100644 index 000000000..cd10ee005 --- /dev/null +++ b/e107_admin/lancheck.php @@ -0,0 +1,680 @@ +
    "; + $input .= chr(60)."?php\n"; + if ($old_kom == "") + { + // create CVS compatible description. + $diz = chr(47)."*\n"; + $diz .= "+---------------------------------------------------------------+\n"; + $diz .= "| e107 website system ".$lan." Language File\n"; + $diz .= "| Released under the terms and conditions of the\n"; + $diz .= "| GNU General Public License (http://gnu.org).\n"; + $diz .= "|\n"; + $diz .= "| ".chr(36)."Source: $writeit ".chr(36)."\n"; + $diz .= "| ".chr(36)."Revision: 1.0 ".chr(36)."\n"; + $diz .= "| ".chr(36)."Date: ".date("Y/m/d H:i:s")." ".chr(36)."\n"; + $diz .= "| ".chr(36)."Author: ".USERNAME." ".chr(36)."\n"; + $diz .= "+---------------------------------------------------------------+\n"; + $diz .= "*".chr(47)."\n\n"; + } + else + { + $diz = $old_kom; + } + + $input .= $diz; + $message .= str_replace("\n","
    ",$diz); + + for ($i=0; $i'.$notdef_end; + $input .= $notdef_start."setlocale(".$defvar.",".$deflang.");".$notdef_end; + } + else + { + $message .= $notdef_start.$func.'('.$quote.htmlentities($defvar).$quote.',"'.$deflang.'");
    '.$notdef_end; + $input .= $notdef_start.$func."(".$quote.$defvar.$quote.", ".chr(34).$deflang.chr(34).");".$notdef_end; + } + } + + $message .="
    "; + $message .=""; + $input .= "\n\n?>"; + + // Write to file. + $fp = @fopen($writeit,"w"); + if(!@fwrite($fp, $input)) + { + $caption = LAN_ERROR; + $message = LAN_CHECK_17; + } + else + { + $caption = LAN_SAVED." $lan/".$writeit.""; + } + fclose($writeit); + + $message .= "
    +

    "; + $message .= "

    +
    "; + + + $ns -> tablerender($caption, $message); + require_once(e_ADMIN."footer.php"); + exit; +} + +// ============================================================================ + +// Edit the Language File. + +if($f != ""){ + + if (!$mode) + { + $dir1 = e_BASE.$LANGUAGES_DIRECTORY."English/"; + $f1=$f; + $dir2 = e_BASE.$LANGUAGES_DIRECTORY.$lan."/"; + $f2=$f; + } + else + { + $fullpath_orig = $f; + $fullpath_trans = str_replace("English",$lan,$f); + + $f1 = basename($fullpath_orig); + $f2 = basename($fullpath_trans); + $dir1 = dirname($fullpath_orig)."/"; + $dir2 = dirname($fullpath_trans)."/"; + } + + edit_lanfiles($dir1,$dir2,$f1,$f2); + +} + +// =========================================================================== + +$core_plugins = array( + "alt_auth","banner_menu","blogcalendar_menu","calendar_menu","chatbox_menu", + "clock_menu","comment_menu","compliance_menu","content","counter_menu", + "featurebox","forum","gsitemap","integrity_check","lastseen","links_page", + "linkwords","list_new","log","login_menu","newforumposts_main","newsfeed", + "newsletter","online_extended_menu","online_menu","other_news_menu","pdf", + "pm","poll","powered_by_menu","rss_menu","search_menu","sitebutton_menu", + "trackback","tree_menu","userlanguage_menu","usertheme_menu" + ); + +$core_themes = array("crahan","e107v4a","human_condition","interfectus","jayya", + "khatru","kubrick","lamb","leaf","reline","sebes","vekna_blue"); + + +if(isset($_POST['language_sel']) && isset($_POST['language'])){ + + $ns -> tablerender(LAN_CHECK_3.": ".$_POST['language'],check_core_lanfiles($_POST['language'])); + $ns -> tablerender(LAN_CHECK_3.": ".$_POST['language']."/admin",check_core_lanfiles($_POST['language'],"admin/")); + + $plug_text = " + + + + + "; + + foreach($core_plugins as $plugs) + { + if(is_readable(e_PLUGIN.$plugs)) + { + $plug_text .= check_lanfiles('P',$plugs,"English",$_POST['language']); + } + } + $plug_text .= "
    ".LAN_PLUGIN."".LAN_CHECK_16."".$_POST['language']."".LAN_OPTIONS."
    "; + $ns -> tablerender(ADLAN_CL_7,$plug_text); + + $theme_text = " + + + + + "; + foreach($core_themes as $them) + { + if(is_readable(e_THEME.$them)) + { + $theme_text .= check_lanfiles('T',$them,"English",$_POST['language']); + } + } + $theme_text .= "
    Theme".LAN_CHECK_16."".$_POST['language']."".LAN_OPTIONS."
    "; + + $ns -> tablerender("Themes",$theme_text); + require_once(e_ADMIN."footer.php"); + exit; +} + + +function check_core_lanfiles($checklan,$subdir=''){ + global $lanfiles,$_POST; + + $English = get_comp_lan_phrases(e_LANGUAGEDIR."English/".$subdir,$checklan); + $check = get_comp_lan_phrases(e_LANGUAGEDIR.$checklan."/".$subdir,$checklan); + + $text .= " + + + + "; + + $keys = array_keys($English); + + sort($keys); + + foreach($keys as $k) + { + if($k != "bom") + { + $lnk = $k; + $k_check = str_replace("English",$checklan,$k); + if(array_key_exists($k,$check)) + { + $text .= ""; + $subkeys = array_keys($English[$k]); + + $er=""; + $utf_error = ""; + + $bomkey = str_replace(".php","",$k_check); + $bom_error = ($check['bom'][$bomkey]) ? "".LAN_CHECK_15."
    " : ""; // illegal chars + + foreach($subkeys as $sk) + { + if($utf_error == "" && !is_utf8($check[$k][$sk])) + { + $utf_error = "".LAN_CHECK_19."
    "; + } + + if($sk == "LC_ALL"){ + $check[$k][$sk] = str_replace(chr(34).chr(34),"",$check[$k][$sk]); + } + + if((!array_key_exists($sk,$check[$k]) && $English[$k][$sk] != "") || (trim($check[$k][$sk]) == "" && $English[$k][$sk] != "")) + { + + $er .= ($er) ? "
    " : ""; + $er .= $sk." ".LAN_CHECK_5; + } + } + + $style = ($er) ? "forumheader2" : "forumheader3"; + $text .= ""; + } + else + { + $text .= " + + "; // file missing. + } + // Leave in EDIT button for all entries - to allow re-translation of bad entries. + $subpath = ($subdir!='') ? $subdir.$k : $k; + $text .=""; + } + } + $text .= "
    ".LAN_CHECK_16."".$_POST['language']." File".LAN_OPTIONS."
    {$lnk}
    "; + $text .= $bom_error . $utf_error; + $text .= (!$er && !$bom_error && !$utf_error) ? LAN_OK : $er."
    "; + $text .= "
    {$lnk}".LAN_CHECK_4." + "; + $text .="
    "; + + return $text; +} + + +function get_lan_file_phrases($dir1,$dir2,$file1,$file2){ + + $ret = array(); + $fname = $dir1.$file1; + $type='orig'; + + if(is_file($fname)) + { + $data = file($fname); + $ret=$ret + fill_phrases_array($data,$type); + if(substr($data[0],0,5) != "get_files($comp_dir, ".php","standard",$depth)){ + sort($lang_array); + } + + $regexp = (strpos($comp_dir,e_LANGUAGEDIR) !== FALSE) ? "#.php#" : "#".$lang."#"; + + foreach($lang_array as $f) + { + if(preg_match($regexp,$f['path'].$f['fname']) && is_file($f['path'].$f['fname'])) + { + $data = file($f['path'].$f['fname']); + $relpath = str_replace($comp_dir,"",$f['path']); + if(substr($data[0],0,5) != ""; + $k_check = str_replace("English",$target_lan,$k); + if(array_key_exists($k_check,$check)) + { + $text .= " + ".$comp_name." + ".str_replace("English/","",$lnk).""; + + $subkeys = array_keys($baselang[$k]); + $er=""; + $utf_error = ""; + + $bomkey = str_replace(".php","",$k_check); + $bom_error = ($check['bom'][$bomkey]) ? "".LAN_CHECK_15."
    " : ""; // illegal chars + + foreach($subkeys as $sk) + { + if($utf_error == "" && !is_utf8($check[$k_check][$sk])) + { + $utf_error = "".LAN_CHECK_19."
    "; + } + + if(!array_key_exists($sk,$check[$k_check]) || (trim($check[$k_check][$sk]) == "" && $baselang[$k][$sk] != "")) + { + $er .= ($er) ? "
    " : ""; + $er .= $sk." ".LAN_CHECK_5; + } + } + + $style = ($er) ? "forumheader2" : "forumheader3"; + $text .= "
    "; + $text .= $bom_error . $utf_error; + $text .= (!$er && !$bom_error && !$utf_error) ? LAN_OK : $er."
    "; + $text .= "
    "; + } + else + { + $text .= " + ".$comp_name." + ".str_replace("English/","",$lnk)." + ".LAN_CHECK_4.""; + } + + $text .=" + "; + $text .=""; + } + + + + // if (!$known) {$text = LAN_CHECK_18." : --> ".$fname." :: ".$dname;} + return $text; +} + +function edit_lanfiles($dir1,$dir2,$f1,$f2){ + global $ns,$sql,$lan; + +/* echo "
    dir1 = $dir1"; + echo "
    file1 = $f1"; + + echo "
    dir2 = $dir2"; + echo "
    file2 = $f2";*/ + + if($dir2.$f2 == e_LANGUAGEDIR.$lan."/English.php") // it's a language config file. + { + $f2 = $lan.".php"; + $root_file = e_LANGUAGEDIR.$lan."/".$lan.".php"; + } + else + { + $root_file = $dir2.$f2; + } + + if($dir2.$f2 == e_LANGUAGEDIR.$lan."/English_custom.php") // it's a language config file. + { + $f2 = $lan."_custom.php"; + $root_file = e_LANGUAGEDIR.$lan."/".$lan."_custom.php"; + } + + + $writable = (is_writable($dir2)) ? TRUE : FALSE; + $trans = get_lan_file_phrases($dir1,$dir2,$f1,$f2); + $keys = array_keys($trans); + sort($keys); + + $text = "
    +
    + "; + + $subkeys = array_keys($trans['orig']); + foreach($subkeys as $sk) + { + $rowamount = round(strlen($trans['orig'][$sk])/34)+1; + $hglt1=""; $hglt2=""; + if ($trans['tran'][$sk] == "" && $trans['orig'][$sk]!="") { + $hglt1=""; + $hglt2=""; + } + $text .=" + + "; + $text .= ""; + } + + //Check if directory is writable + if($writable) + { + $text .=" + "; + } + + $text .= " +
    ".$hglt1.htmlentities($sk).$hglt2."".htmlentities(str_replace("ndef++","",$trans['orig'][$sk])) .""; + $text .= ($writable) ? "" : ""; + //echo "orig --> ".$trans['orig'][$sk]."
    "; + if (strpos($trans['orig'][$sk],"ndef++") !== False) + { + //echo "+orig --> ".$trans['orig'][$sk]." <> ".strpos($trans['orig'][$sk],"ndef++")."
    "; + $text .= ""; + } + else + { + $text .= ""; + } + $text .="
    + "; + + if($root_file) + { + $text .= ""; + } + + $text .= "
    +
    +
    "; + + $text .= "
    +

    "; + $text .= (!$writable) ? "
    ".$dir2.$f2.LAN_NOTWRITABLE : ""; + $text .= "

    +
    "; + + + $caption = LAN_CHECK_3." ".$dir2.$f2." -> ".$lan.""; + $ns -> tablerender($caption, $text); + require_once(e_ADMIN."footer.php"); + exit; + +} + +function fill_phrases_array($data,$type) { + + $retloc = array(); + + foreach($data as $line){ + //echo "line--> ".$line."
    "; + if (strpos($line,"define(") !== FALSE && strpos($line,");") === FALSE) + { + $indef=1; + $bigline=""; + // echo "big1 -->".$line."
    "; + } + if ($indef) + { + $bigline.=str_replace("\n","",$line); + // echo "big2 -->".$line."
    "; + } + if (strpos($line,"define(") === FALSE && strpos($line,");") !== FALSE) + { + $indef=0; + $we_have_bigline=1; + // echo "big3 -->".$line."
    "; + } + + if(strpos($line,"setlocale(") !== FALSE) + { + $indef=1; + $we_have_bigline=0; + } + + if ((strpos($line,"define(") !== FALSE && strpos($line,");") !== FALSE && substr(ltrim($line),0,2) != "//") || $we_have_bigline || strpos($line,"setlocale(") !== FALSE) + { + + if ($we_have_bigline) + { + $we_have_bigline=0; + $line=$bigline; + // echo "big -->".$line."
    "; + } + $ndef = ""; + //echo "_ndefline -->".$line."
    "; + if (strpos($line,"defined(") !== FALSE ) + { + $ndef = "ndef++"; + $line = substr($line,strpos($line,"define(")); + } + + if(strpos($line,"setlocale(") !== FALSE) + { + $pos = substr(strstr($line,","),1); + $rep = array(");","\n",'""'); + $val = str_replace($rep,"",$pos); + $retloc[$type]['LC_ALL']= $val; + $retloc['orig']['LC_ALL']= "'en'"; + } + else + { + + //echo "ndefline: ".$line."
    "; + if(preg_match("#\"(.*?)\".*?\"(.*)\"#",$line,$matches) || + preg_match("#\'(.*?)\'.*?\"(.*)\"#",$line,$matches) || + preg_match("#\"(.*?)\".*?\'(.*)\'#",$line,$matches) || + preg_match("#\'(.*?)\'.*?\'(.*)\'#",$line,$matches) || + preg_match("#\((.*?)\,.*?\"(.*)\"#",$line,$matches) || + preg_match("#\((.*?)\,.*?\'(.*)\'#",$line,$matches)){ + //echo "get_lan -->".$matches[1]." :: ".$ndef.$matches[2]."
    "; + $retloc[$type][$matches[1]]= $ndef.$matches[2]; + } + } + } + } + + return $retloc; + } + + +function is_utf8($string) { + // From http://w3.org/International/questions/qa-forms-utf-8.html + if(strtolower(CHARSET) != "utf-8" || $string == "") + { + return TRUE; + } + + return preg_match('%^(?: + [\x09\x0A\x0D\x20-\x7E] + | [\xC2-\xDF][\x80-\xBF] + | \xE0[\xA0-\xBF][\x80-\xBF] + | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} + | \xED[\x80-\x9F][\x80-\xBF] + | \xF0[\x90-\xBF][\x80-\xBF]{2} + | [\xF1-\xF3][\x80-\xBF]{3} + | \xF4[\x80-\x8F][\x80-\xBF]{2} + )*$%xs', $string); + +} + + +function lancheck_adminmenu() { + + include_lan(e_LANGUAGEDIR.e_LANGUAGE."/admin/lan_language.php"); + + global $action,$pref; + if ($action == "") { + $action = "tools"; + } + + if($action == "modify"){ + $action = "db"; + } + $var['main']['text'] = LAN_PREFS; + $var['main']['link'] = e_ADMIN."language.php"; + + if(isset($pref['multilanguage']) && $pref['multilanguage']){ + $var['db']['text'] = LANG_LAN_03; + $var['db']['link'] = e_ADMIN."language.php?db"; + } + + $var['tools']['text'] = ADLAN_CL_6; + $var['tools']['link'] = e_ADMIN."language.php?tools"; + + + show_admin_menu(ADLAN_132, $action, $var); +} + +?> diff --git a/e107_admin/language.php b/e107_admin/language.php new file mode 100644 index 000000000..9d99c1be8 --- /dev/null +++ b/e107_admin/language.php @@ -0,0 +1,465 @@ +tablerender(LAN_SAVED, "
    ".LAN_SETSAVED."
    "); + +} + + +// ----------------- delete tables --------------------------------------------- +if (isset($_POST['del_existing']) && $_POST['lang_choices']) { + + $lang = strtolower($_POST['lang_choices']); + foreach ($tabs as $del_table) { + if (db_Table_exists($lang."_".$del_table)) { + $qry = "DROP TABLE ".$mySQLprefix."lan_".$lang."_".$del_table; + echo $qry; + $message .= (mysql_query($qry)) ? $_POST['lang_choices']." ".$del_table." deleted
    " : + $_POST['lang_choices']." $del_table couldn't be deleted
    "; + } + } + global $cachevar; + unset($cachevar['table_list']); + +} + +// ----------create tables ----------------------------------------------------- + +if (isset($_POST['create_tables']) && $_POST['language']) { + + $table_to_copy = array(); + $lang_to_create = array(); + + + foreach ($tabs as $value) { + $lang = strtolower($_POST['language']); + if (isset($_POST[$value])) { + $copdata = ($_POST['copydata_'.$value]) ? 1 : 0; + if (copy_table($value, "lan_".$lang."_".$value, $_POST['drop'],$copdata)) { + $message .= " ".$_POST['language']." ".$value." created
    "; + } else { + $message .= (!$_POST['drop'])? " ".$_POST['language']." ".$value." ".LANG_LAN_00."
    " : $_POST['language']." ".$value." ".LANG_LAN_01."
    "; + } + } elseif(db_Table_exists($lang."_".$value)) { + if ($_POST['remove']) { + // Remove table. + $message .= (mysql_query("DROP TABLE ".$mySQLprefix."lan_".$lang."_".$value)) ? $_POST['language']." ".$value." ".LAN_DELETED."
    " : $_POST['language']." $value ".LANG_LAN_02."
    "; + } else { + // leave table. + $message = $_POST['language']." ".$value." was disabled but left intact."; + } + } + } + global $cachevar; + unset($cachevar['table_list']); +} + + + + if(isset($message) && $message){ + $ns->tablerender(LAN_OK, $message); + } + + + +unset($text); + + +if (!e_QUERY || $action == 'main' && !$_POST['language'] && !$_POST['edit_existing']) { + multilang_prefs(); +} + +if ($action == 'db') { + multilang_db(); +} + +if($action == "tools"){ + show_tools(); +} + + + + + +// Grab Language configuration. --- +if ($_POST['edit_existing']) { + + $text .= " +
    +
    + \n"; + + foreach ($tabs as $table_name) { + $installed = strtolower($_POST['lang_choices'])."_".$table_name; + if (stristr($_POST['lang_choices'], $installed) === FALSE) { + $text .= " + \n + \n"; + } + } + + $text .= " + "; + + // =========================================================================== + + // Drop tables ? + $text .= " + \n + + + + + + + + + + +
    ".ucfirst(str_replace("_", " ", $table_name))."\n"; + $selected = (db_Table_exists($installed)) ? "checked='checked'" : ""; + $text .= ""; + $text .= ""; + $text .= "
      + +
    ".LANG_LAN_07."".$rs->form_checkbox("drop", 1)."\n + ".LANG_LAN_08."
    ".LANG_LAN_10."".$rs->form_checkbox("remove", 1)."\n + ".LANG_LAN_11."
    "; + + $button_capt = LANG_LAN_06. " / ". LAN_UPDATE; + $text .=""; + + $text .="
    \n"; + + $text .= $rs->form_close(); + $ns->tablerender($_POST['lang_choices'], $text); +} + +require_once(e_ADMIN."footer.php"); + +// --------------------------------------------------------------------------- +function multilang_prefs() { + global $ns, $pref,$lanlist; + + $text = "
    + + "; + + + $text .= " + + + + "; + + $text .= " + + + + + "; + + $text .= " + + + + + "; + + + $text .= " + + +
    ".LANG_LAN_14.": "; + + + $text .= " + +
    ".LANG_LAN_12.": "; + $checked = ($pref['multilanguage'] == 1) ? "checked='checked'" : ""; + $text .= " +
    ".LANG_LAN_18."
    + ".LANG_LAN_19."
    ".LANG_LAN_20."
    www."; + $text .= " +
    "; + $text .= ""; + $text .= "
    + +
    "; + + $caption = LANG_LAN_13; // "Language Preferences"; + $ns->tablerender($caption, $text); +} + +// ---------------------------------------------------------------------------- + +function db_Table_exists($table) +{ + global $mySQLdefaultdb; + $tables = getcachedvars("table_list"); + if(!$tables) + { + $tablist = mysql_list_tables($mySQLdefaultdb); + while($tmp = mysql_fetch_array($tablist)) + { + $tables[] = $tmp[0]; + } + cachevars("table_list", $tables); + } + return in_array(strtolower(MPREFIX."lan_".$table), $tables); +} +// ---------------------------------------------------------------------------- + +function copy_table($oldtable, $newtable, $drop = FALSE, $data = FALSE) +{ + global $sql; + $old = MPREFIX.strtolower($oldtable); + $new = MPREFIX.strtolower($newtable); + if($drop) + { + $sql->db_Select_gen("DROP TABLE IF EXISTS {$new}"); + } + + //Get $old table structure + $sql->db_Select_gen('SET SQL_QUOTE_SHOW_CREATE = 1'); + $qry = "SHOW CREATE TABLE {$old}"; + if($sql->db_Select_gen($qry)) + { + $row = $sql->db_Fetch(); + $qry = $row[1]; + $qry = str_replace($old, $new, $qry); + } + $result = mysql_query($qry); + if(!$result) + { + return FALSE; + } + if ($data) //We need to copy the data too + { + $qry = "INSERT INTO {$new} SELECT * FROM {$old}"; + $sql->db_Select_gen($qry); + } + return TRUE; +} + +// ---------------------------------------------------------------------------- + +function table_list() { + // grab default language lists. + global $mySQLdefaultdb; + + $exclude[] = "banlist"; $exclude[] = "banner"; + $exclude[] = "cache"; $exclude[] = "core"; + $exclude[] = "online"; $exclude[] = "parser"; + $exclude[] = "plugin"; $exclude[] = "user"; + $exclude[] = "upload"; $exclude[] = "userclass_classes"; + $exclude[] = "rbinary"; $exclude[] = "session"; + $exclude[] = "tmp"; $exclude[] = "flood"; + $exclude[] = "stat_info"; $exclude[] = "stat_last"; + $exclude[] = "submit_news"; $exclude[] = "rate"; + $exclude[] = "stat_counter";$exclude[] = "user_extended"; + $exclude[] = "user_extended_struc"; + $exclude[] = "pm_messages"; + $exclude[] = "pm_blocks"; + + $tables = mysql_list_tables($mySQLdefaultdb); + + while (list($temp) = mysql_fetch_array($tables)) + { + if(strpos($temp, MPREFIX) === 0) + { + $e107tab = str_replace(MPREFIX, "", $temp); + if (!in_array($e107tab, $exclude) && stristr($e107tab, "lan_") === FALSE) + { + $tabs[] = $e107tab; + } + } + } + + return $tabs; +} + + +// ------------- render form --------------------------------------------------- +function multilang_db(){ + global $pref,$ns,$tp,$rs,$lanlist,$tabs; + + if(isset($pref['multilanguage']) && $pref['multilanguage']){ + $caption = LANG_LAN_16; // language + $text = MLAD_LAN_4."

    "; + + + // Choose Language to Edit: + $text = "
    +
    + + + + + \n\n"; + sort($lanlist); + for($i = 0; $i < count($lanlist); $i++) + { + $installed = 0; + + $text .= ""; + } + + $text .= "
    ".ADLAN_132."".LANG_LAN_03."".LAN_OPTIONS."
    ".$lanlist[$i]."\n"; + foreach ($tabs as $tab_name) { + if (db_Table_exists(strtolower($lanlist[$i])."_".$tab_name)) { + $text .= $tab_name.", "; + $installed++; + } + } + if($lanlist[$i] == $pref['sitelanguage']){ + $text .= "
    ".LANG_LAN_17."
    "; + }else{ + $text .= (!$installed)? "
    ".LANG_LAN_05."
    " : ""; + } + $text .= "
    \n"; + $text .= $rs->form_open("post", e_SELF."?modify", "lang_form_".str_replace(" ", "_", $lanlist[$i])); + $text .= "
    \n"; + if ($installed) { + $text .= " \n"; + $text .= " \n"; + } elseif($lanlist[$i] != $pref['sitelanguage']) { + $text .= "\n"; + } + $text .= ""; + $text .= "
    "; + $text .= $rs->form_close(); + $text .= "
    "; + + $ns->tablerender($caption, $text); + } +} + + +// ---------------------------------------------------------------------------- + +function show_tools() +{ + global $ns; + + include_lan(e_LANGUAGEDIR.e_LANGUAGE."/admin/lan_lancheck.php"); + + $text .= " +
    + + + + +
    ".LAN_CHECK_1." + + +
    "; + + $ns->tablerender(LANG_LAN_21, $text); +} + + +// ---------------------------------------------------------------------------- + +function language_adminmenu() { + global $action,$pref; + if ($action == "") { + $action = "main"; + } + + if($action == "modify"){ + $action = "db"; + } + $var['main']['text'] = LAN_PREFS; + $var['main']['link'] = e_SELF; + + if(isset($pref['multilanguage']) && $pref['multilanguage']){ + $var['db']['text'] = LANG_LAN_03; + $var['db']['link'] = e_SELF."?db"; + } + + $lcnt = explode(",",e_LANLIST); + if(count($lcnt) > 1) + { + $var['tools']['text'] = ADLAN_CL_6; + $var['tools']['link'] = e_SELF."?tools"; + } + + show_admin_menu(ADLAN_132, $action, $var); +} + +?> diff --git a/e107_admin/links.php b/e107_admin/links.php new file mode 100644 index 000000000..3af69833e --- /dev/null +++ b/e107_admin/links.php @@ -0,0 +1,790 @@ +form = "linkform"; +$pst->page = "links.php?create"; +$pst->id = "admin_links"; +require_once('auth.php'); +// -------------------- +$pst->save_preset(); + +require_once(e_HANDLER.'userclass_class.php'); +require_once(e_HANDLER.'form_handler.php'); + +$rs = new form; +$linkpost = new links; + +if (e_QUERY) { + $tmp = explode('.', e_QUERY); + $action = $tmp[0]; + $sub_action = $tmp[1]; + $id = $tmp[2]; + unset($tmp); +} + +foreach(array_keys($_POST) as $k) +{ + if (preg_match("#(.*?)_delete_(\d+)(.*)#", $k, $matches)) + { + $delete = $matches[1]; + $del_id = $matches[2]; + } +} + +if(isset($_POST['generate_sublinks']) && isset($_POST['sublink_type']) && $_POST['sublink_parent'] !="" ){ + + $subtype = $_POST['sublink_type']; + $sublink = $linkpost->sublink_list($subtype); + if(!is_object($sql2)){ + $sql2 = new db; + } + + $sql -> db_Select("links", "*", "link_id = '".$_POST['sublink_parent']."'"); + $par = $sql-> db_Fetch(); + extract($par); + + $sql -> db_Select($sublink['table'], "*", $sublink['query']); + $count = 1; + while($row = $sql-> db_Fetch()){ + $subcat = $row[($sublink['fieldid'])]; + $name = $row[($sublink['fieldname'])]; + $subname = $name; // eliminate old embedded hierarchy from names. (e.g. 'submenu.TopName.name') + $suburl = str_replace("#",$subcat,$sublink['url']); + $subicon = ($sublink['fieldicon']) ? $row[($sublink['fieldicon'])] : $link_button; + $subdiz = ($sublink['fielddiz']) ? $row[($sublink['fielddiz'])] : $link_description; + $subparent = $_POST['sublink_parent']; + + if($sql2->db_Insert("links", "0, '$subname', '$suburl', '$subdiz', '$subicon', '$link_category', '$count', '$subparent', '$link_open', '$link_class' ")){ + $message .= LAN_CREATED. " ($name)
    "; + }else{ + $message .= LAN_CREATED_FAILED. " ($name)
    "; + } + $count++; + } + + if($message){ + $ns -> tablerender(LAN_CREATED, $message); + } +} + +if (isset($_POST['inc'])) { + $qs = explode(".", $_POST['inc']); + $linkid = $qs[0]; + $link_order = $qs[1]; + $sql->db_Update("links", "link_order=link_order+1 WHERE link_order='".($link_order-1)."'"); + $sql->db_Update("links", "link_order=link_order-1 WHERE link_id='".$linkid."'"); +} + +if (isset($_POST['dec'])) { + $qs = explode(".", $_POST['dec']); + $linkid = $qs[0]; + $link_order = $qs[1]; + $sql->db_Update("links", "link_order=link_order-1 WHERE link_order='".($link_order+1)."'"); + $sql->db_Update("links", "link_order=link_order+1 WHERE link_id='".$linkid."'"); +} + +if (isset($_POST['update'])) { + + foreach ($_POST['link_order'] as $loid) { + $tmp = explode(".", $loid); + $sql->db_Update("links", "link_order=".$tmp[1]." WHERE link_id=".$tmp[0]); + } + foreach ($_POST['link_class'] as $lckey => $lcid) { + $sql->db_Update("links", "link_class='".$lcid."' WHERE link_id=".$lckey); + } + $e107cache->clear("sitelinks"); + $linkpost->show_message(LAN_UPDATED); +} + +if (isset($_POST['updateoptions'])) { + $pref['linkpage_screentip'] = $_POST['linkpage_screentip']; + $pref['sitelinks_expandsub'] = $_POST['sitelinks_expandsub']; + save_prefs(); + $e107cache->clear("sitelinks"); + $linkpost->show_message(LCLAN_1); +} + +if ($delete == 'main') +{ + if($sql->db_Select("links", "link_id, link_name, link_order", "link_id='".$del_id."'")){ + $row = $sql->db_Fetch(); + $msg = $linkpost->delete_link($row); + + if($msg){ + $e107cache->clear("sitelinks"); + $linkpost->show_message($msg); + } + } +} + +if (isset($_POST['add_link'])) { + $linkpost->submit_link($sub_action, $_POST['link_id']); + unset($id); +} + +$linkArray = $linkpost->getLinks(); + +if ($action == 'create') { + $linkpost->create_link($sub_action, $id); +} + + +if (!e_QUERY || $action == 'main') { + $linkpost->show_existing_items(); +} + +if ($action == 'opt') { + $linkpost->show_pref_options(); +} + +if($action == "sublinks"){ + $linkpost->show_sublink_generator(); +} + +require_once('footer.php'); +exit; + +// End --------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +class links +{ + var $link_total; + var $aIdOptPrep, $aIdOptData, $aIdOptTest; + + function getLinks() + { + global $sql; + if($this->link_total = $sql->db_Select("links", "*", "ORDER BY link_category,link_order, link_id ASC", "nowhere")) + { + while($row = $sql->db_Fetch()) + { + $ret[$row['link_parent']][] = $row; + } + } + return $ret; + } + + + function linkName($text) + { + // This function is ONLY needed for link databases that have been upgraded from + // before 0.7+ -- all new link collections make use of link_parent instead + // of hierarchy embedded in the link_name. (Unfortunately, the upgraded + // data still includes embedded coding.) + + if(substr($text, 0, 8) == "submenu.") // for backwards compatibility only. + { + $tmp = explode(".",$text); + switch (count($tmp)) { + case 3: // submenu.parent.node + $tmp = $tmp[2]; break; + case 5: // submenu.parent.midlev.child.node + $tmp = $tmp[4]; break; + case 2: // submenu.parent (invalid?) + default: + $parentLen = strlen($tmp[1]); + $tmp = substr($text,8+$parentLen+1); // Skip submenu.parent. + } + return $tmp; + } + else + { + return $text; + } + } + + function dropdown($curval="", $lid=0, $indent=0) + { // Drop-down list using on the parent_id. :) + global $linkArray,$id,$sub_action; + + if(0 == $indent) {$ret = "\n";} + foreach($linkArray[$lid] as $l) + { + $s = ($l['link_id'] == $curval ? " selected='selected' " : "" ); + $thename = $this->linkName($l['link_name']); + // prevent making self the parent. + if ($l['link_id'] == $id) { $thename = "(".$thename.")"; } + if($sub_action == "sub") + { + $thelink = ($l['link_id'] != $lid) ? $l['link_id'] : $l['link_parent'] ; + } + else + { + $thelink = ($l['link_id'] != $id) ? $l['link_id'] : $l['link_parent'] ; + } + $ret .= "\n"; + + if(array_key_exists($l['link_id'], $linkArray)) + { + $ret .= $this->dropdown($curval, $l['link_id'], $indent+1); + } + } + return $ret; + } + + + function existing($id=0, $level=0) + { + global $linkArray; + $ret = ""; + foreach($linkArray[$id] as $l) + { + $s = ($l['link_parent'] == $curval ? " selected='selected' " : "" ); + $ret .= $this->display_row($l, $level); + if(array_key_exists($l['link_id'], $linkArray)) + { + $ret .= $this->existing($l['link_id'], $level+1); + } + } + return $ret; + } + + function show_existing_items() + { + global $sql, $rs, $ns, $tp, $linkArray; + if (count($linkArray)) + { + + $this->prepIdOpts(); // Prepare the options list for all links + $text = $rs->form_open("post", e_SELF, "myform_{$link_id}", "", ""); + $text .= "
    + + + + + + + + + + + + + + + + + "; + $text .= $this->existing(0); + + $text .= " + + "; + $text .= "
    ".LCLAN_89."".LCLAN_15."".LAN_OPTIONS."".LCLAN_95."".LCLAN_91."".LAN_ORDER."
    "; + $text .= $rs->form_close(); + } else { + $text .= "
    ".LCLAN_61."
    "; + } + $ns->tablerender(LCLAN_8, $text); + } + + function prepIdOpts() { + for($a = 1; $a <= $this->link_total; $a++) { + $sTxt = "".$a; + $this->aIdOptData[] = array('val'=>'|||.'.$a, 'txt'=>$sTxt); // Later, ||| becomes Id + $this->aIdOptTest[] = $sTxt; + } + $this->aIdOptPrep = $this->prepOpts($this->aIdOptData); + } + + function display_row($row2, $indent = FALSE) { + global $sql, $rs, $ns, $tp, $linkArray,$previous_cat; + extract($row2); + + // + if($link_category > 1 && $link_category != $previous_cat) + { + $text .= " + + ".LCLAN_89." + ".LCLAN_15." (".LCLAN_12.": ".$link_category.") + ".LAN_OPTIONS." + ".LCLAN_95." + ".LCLAN_91." + ".LAN_ORDER." + "; + $previous_cat = $link_category; + } + + if(strpos($link_name, "submenu.") !== FALSE || $link_parent !=0) // 'submenu' for upgrade compatibility only. + { + $link_name = $this->linkName( $link_name ); + } + + if ($indent) { + $subimage = ""; + $subspacer = ($indent > 1) ? " style='padding-left: ".(($indent - 1) * 16)."px'" : ""; + $subindent = "".$subimage.""; + } + + $text .= ""; + $text .= $link_button ? " ": + ""; + $text .= " + + + ".$subindent." + + +
    ".$link_name."
    + "; + $text .= ""; + $text .= "".LINKLAN_10." "; + $text .= "".ADMIN_EDIT_ICON." "; + $text .= "toJS(LCLAN_58." [ $link_name ]")."') \" />"; + $text .= ""; + $text .= "".r_userclass("link_class[".$link_id."]", $link_class, "off", "public,guest,nobody,member,admin,classes").""; + $text .= ""; + $text .= ""; + $text .= ""; + $text .= ""; + $text .= ""; + $text .= ""; + $text .= ""; + $text .= ""; + + return $text; + + } + + + function show_message($message) { + global $ns; + $ns->tablerender(LAN_UPDATE, "
    ".$message."
    "); + } + + + + function create_link($sub_action, $id) { + global $sql, $rs, $ns, $pst,$tp; + $preset = $pst->read_preset("admin_links"); + extract($preset); + + if ($sub_action == "edit" && !$_POST['submit']) + { + if ($sql->db_Select("links", "*", "link_id='$id' ")) + { + $row = $sql->db_Fetch(); + extract($row); + } + } + + if("sub" == $sub_action) + { + $link_parent = $id; + } + + if(strpos($link_name, "submenu.") !== FALSE){ // 'submenu' for upgrade compatibility only. + $link_name = $this->linkName( $link_name ); + } + + require_once(e_HANDLER."file_class.php"); + $fl = new e_file; + + if($iconlist = $fl->get_files(e_IMAGE."icons/", ".jpg|.gif|.png|.JPG|.GIF|.PNG")){ + sort($iconlist); + } + + $text = "
    +
    + "; + + $text .= " + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ".LINKLAN_2.": +
    ".LCLAN_15.": + +
    ".LCLAN_16.": + "; + if(e_MENU == "debug") + { + $text .= $link_url; + } + $text .= " +
    ".LCLAN_17.": + +
    ".LCLAN_18.": + + + +
    ".LCLAN_19.": + +
    ".LCLAN_12.": + ".LCLAN_96." {SITELINKS=flat:[rendertype number]} +
    ".LCLAN_25.":
    (".LCLAN_26.")
    ".r_userclass("link_class", $link_class, "off", "public,guest,nobody,member,admin,classes")." +
    "; + if ($id && $sub_action == "edit") { + $text .= "\n + "; + } else { + $text .= ""; + } + $text .= "
    +
    +
    "; + $ns->tablerender(LCLAN_29, $text); + } + + + function submit_link($sub_action, $id) { + global $sql, $e107cache, $tp; + if(!is_object($tp)) { + $tp=new e_parse; + } + + $parent_id = ($_POST['link_parent']) ? intval($_POST['link_parent']) : 0; + + $link_name = $tp->toDB($_POST['link_name']); + $link_url = $tp->createConstants($_POST['link_url']); + $link_url = str_replace("&","&",$link_url); // xhtml compliant links. + + $link_description = $tp->toDB($_POST['link_description']); + $link_button = $tp->toDB($_POST['link_button']); + + $link_t = $sql->db_Count("links", "(*)"); + if ($id) { + $sql->db_Update("links", "link_parent='$parent_id', link_name='$link_name', link_url='$link_url', link_description='$link_description', link_button= '$link_button', link_category='".$_POST['linkrender']."', link_open='".$_POST['linkopentype']."', link_class='".$_POST['link_class']."' WHERE link_id='$id'"); + //rename all sublinks to eliminate old embedded 'submenu' etc hierarchy. + // this is for upgrade compatibility only. Current hierarchy uses link_parent. + + $e107cache->clear("sitelinks"); + $this->show_message(LCLAN_3); + } else { + $sql->db_Insert("links", "0, '$link_name', '$link_url', '$link_description', '$link_button', ".$_POST['linkrender'].", ".($link_t+1).", ".$parent_id.", ".$_POST['linkopentype'].", ".$_POST['link_class']); + $e107cache->clear("sitelinks"); + $this->show_message(LCLAN_2); + } + } + + function show_pref_options() { + global $pref, $ns; + $text = "
    +
    \n + + + + + + + + + + + + + + + + + +
    + ".LCLAN_78."
    + ".LCLAN_79." +
    ". ($pref['linkpage_screentip'] ? "" : "")." +
    + ".LCLAN_80."
    + ".LCLAN_81." +
    ". ($pref['sitelinks_expandsub'] ? "" : "")." +
    + +
    +
    +
    "; + $ns->tablerender(LCLAN_88, $text); + } + + function delete_link($linkInfo) { + global $sql; + + if ($sql->db_Select("links", "link_id", "link_order > '{$linkInfo['link_order']}'")){ + $linkList = $sql->db_getList(); + foreach($linkList as $l){ + $sql->db_Update("links", "link_order = link_order -1 WHERE link_id = '{$l['link_id']}'"); + } + } + + + if ($sql->db_Delete("links", "link_id='".$linkInfo['link_id']."'")){ + // Update ophaned sublinks. + $sql->db_Update("links", "link_name = SUBSTRING_INDEX(link_name, '.', -1) , link_parent = '0', link_class='255' WHERE link_parent= '".$linkInfo['link_id']."'"); + + return LCLAN_53." #".$linkInfo['link_id']." ".LCLAN_54."
    "; + }else{ + return DELETED_FAILED; + } + + + } + +// -------------------------- Sub links generator -------------> + +function show_sublink_generator() { + global $ns,$sql; + + $sublinks = $this->sublink_list(); + + $text = "
    +
    \n + + + + + + + + + + + + + + + + +
    + ".LINKLAN_6."
    +
    + \n +
    + ".LINKLAN_7."
    +
    + \n +
    + +
    +
    +
    "; + $ns->tablerender("Sublinks Generator", $text); +} + + + +function sublink_list($name=""){ + global $sql,$PLUGINS_DIRECTORY; + $sublink_type['news']['title'] = LINKLAN_8; // "News Categories"; + $sublink_type['news']['table'] = "news_category"; + $sublink_type['news']['query'] = "category_id !='-2' ORDER BY category_name ASC"; + $sublink_type['news']['url'] = "news.php?cat.#"; + $sublink_type['news']['fieldid'] = "category_id"; + $sublink_type['news']['fieldname'] = "category_name"; + $sublink_type['news']['fieldicon'] = "category_icon"; + + $sublink_type['downloads']['title'] = LINKLAN_9; //"Download Categories"; + $sublink_type['downloads']['table'] = "download_category"; + $sublink_type['downloads']['query'] = "download_category_parent ='0' ORDER BY download_category_name ASC"; + $sublink_type['downloads']['url'] = "download.php?list.#"; + $sublink_type['downloads']['fieldid'] = "download_category_id"; + $sublink_type['downloads']['fieldname'] = "download_category_name"; + $sublink_type['downloads']['fieldicon'] = "download_category_icon"; + + + if ($sql -> db_Select("plugin", "plugin_path", "plugin_installflag = '1'")) { + while ($row = $sql -> db_Fetch()) { + $sublink_plugs[] = $row['plugin_path']; + } + } + + foreach ($sublink_plugs as $plugin_id) { + if (is_readable(e_PLUGIN.$plugin_id.'/e_linkgen.php')) { + require_once(e_PLUGIN.$plugin_id.'/e_linkgen.php'); + } + } + if($name){ + return $sublink_type[$name]; + } + + return $sublink_type; + +} + +function prepOpts($aData) +{ +// +// Prepare an array that can rapidly (no looping) +// generate an HTML option string, with one item possibly selected. +// prepOpts returns a prepared array containing the possible values in this form: +// +// +// +// $aData is an array containing value/text pairs: +// each entry is array( 'val'=>value, 'txt'=>text ) +// + +$i=0; + foreach($aData as $aVal) + { + $sVal = $aVal['val']; + $sTxt = $aVal['txt']; + $sOut=""; + + if ($i) $sOut = '>'.$sTxtPrev.''; + $sOut .= '"; + } + + function form_hidden($form_name, $form_value) { + return "\n"; + } + + function form_close() { + return "\n"; + } +} + +/* +Usage +echo $rs->form_open("post", e_SELF, "_blank"); +echo $rs->form_text("testname", 100, "this is the value", 100, 0, "tooltip"); +echo $rs->form_button("submit", "testsubmit", "SUBMIT!", "", "Click to submit"); +echo $rs->form_button("reset", "testreset", "RESET!", "", "Click to reset"); +echo $rs->form_textarea("textareaname", 10, 10, "Value", "overflow:hidden"); +echo $rs->form_checkbox("testcheckbox", 1, 1); +echo $rs->form_checkbox("testcheckbox2", 2); +echo $rs->form_hidden("hiddenname", "hiddenvalue"); +echo $rs->form_radio("testcheckbox", 1, 1); +echo $rs->form_radio("testcheckbox", 1); +echo $rs->form_file("testfile", "20"); +echo $rs->form_select_open("testselect"); +echo $rs->form_option("Option 1"); +echo $rs->form_option("Option 2"); +echo $rs->form_option("Option 3", 1, "defaultvalue"); +echo $rs->form_option("Option 4"); +echo $rs->form_select_close(); +echo $rs->form_close(); +*/ + + +?> \ No newline at end of file diff --git a/e107_handlers/forum.php b/e107_handlers/forum.php new file mode 100644 index 000000000..45d5202d4 --- /dev/null +++ b/e107_handlers/forum.php @@ -0,0 +1,593 @@ + +
    \n + + + + + + + + + +
    + ".FORLAN_106."
    + ".FORLAN_2." +
    + ".FORLAN_3."
    + ".FORLAN_4." +
    + + + +
    +
    + "; + $ns->tablerender(FORLAN_7, $text); + require_once("footer.php"); + } +} + +if (isset($_POST['doprune'])) { + if ($_POST['prune_type'] == "delete") { + $prunedate = time() - ($_POST['prune_days'] * 86400); + if ($sql->db_Select("forum_t", "*", "thread_lastpost < {$prunedate} AND thread_parent=0 AND thread_s!=1")) { + while ($row = $sql->db_Fetch()) { + extract($row); + $sql2->db_Delete("forum_t", "thread_parent = '{$thread_id}' "); + // delete replies + $sql2->db_Delete("forum_t", "thread_id = '{$thread_id}' "); + // delete thread + } + + $sql->db_Select("forum", "*", "forum_parent != 0"); + while ($row = $sql->db_Fetch()) { + extract($row); + $threads = $sql2->db_Count("forum_t", "(*)", "WHERE thread_forum_id = {$forum_id} AND thread_parent = 0"); + $replies = $sql2->db_Count("forum_t", "(*)", "WHERE thread_forum_id = {$forum_id} AND thread_parent != 0"); + $sql2->db_Update("forum", "forum_threads = '{$threads}', forum_replies = '{$replies}' WHERE forum_id = '{$forum_id}'"); + } + $message = FORLAN_8; + } else { + $message = FORLAN_9; + } + } else { + $prunedate = time() - ($_POST['prune_days'] * 86400); + $sql->db_Update("forum_t", "thread_active = 0 WHERE thread_lastpost < {$prunedate} AND thread_parent=0 "); + $message = FORLAN_8; + } +} + +if (isset($_POST['update_order'])) { + extract($_POST); + while (list($key, $id) = each($forum_order_)) { + $tmp = explode(".", $id); + $sql->db_Update("forum", "forum_order = {$tmp[1]} WHERE forum_id = {$tmp[0]}"); + echo "forum_order = {$tmp[1]} WHERE forum_id = {$tmp[0]}
    "; + } + $message = FORLAN_73; +} + + + +$sql->db_Select("forum", "forum_id, forum_order", "forum_parent=0 ORDER BY forum_order ASC"); +$c = 1; +while ($row = $sql->db_Fetch()) { + extract($row); + $sql2->db_Update("forum", "forum_order = '{$c}' WHERE forum_id = '{$forum_id}'"); + $c++; +} +$sql->db_Select("forum", "forum_id, forum_order", "forum_parent != 0 ORDER BY forum_order ASC"); +while ($row = $sql->db_Fetch()) { + extract($row); + $sql2->db_Update("forum", "forum_order = '{$c}' WHERE forum_id = '{$forum_id}' "); + $c++; +} + +if (isset($_POST['updateoptions'])) { + $pref['email_notify'] = $_POST['email_notify']; + $pref['forum_poll'] = $_POST['forum_poll']; + $pref['forum_popular'] = $_POST['forum_popular']; + $pref['forum_track'] = $_POST['forum_track']; + $pref['forum_eprefix'] = $_POST['forum_eprefix']; + $pref['forum_enclose'] = $_POST['forum_enclose']; + $pref['forum_title'] = $_POST['forum_title']; + $pref['forum_postspage'] = $_POST['forum_postspage']; + $pref['forum_levels'] = $_POST['forum_levels']; + $pref['image_post'] = $_POST['image_post']; + $pref['html_post'] = $_POST['html_post']; + $pref['forum_attach'] = $_POST['forum_attach']; + save_prefs(); + $message = FORLAN_10; +} + +If(isset($_POST['submit'])) { + + $c = 0; + while ($_POST['mod'][$c]) { + $mods .= $_POST['mod'][$c].", "; + $c++; + } + $mods = preg_replace("/, $/", ".", $mods); + + $sql->db_Select("forum", "*", "forum_name='".$_POST['parentforum']."' "); + $row = $sql->db_Fetch(); + $forum_parent = $row['forum_id']; + $_POST['forum_name'] = $aj->formtpa($_POST['forum_name'], "admin"); + $_POST['forum_description'] = $aj->formtpa($_POST['forum_description'], "admin"); + + $sql->db_Insert("forum", "0, '".$_POST['forum_name']."', '".$_POST['forum_description']."', '".$forum_parent."', '".time()."', '".$mods."', 0, 0, 0, '".$_POST['forum_class']."', 0 "); + unset($forum_name, $forum_description, $forum_parent); + $message = FORLAN_11; +} + +If(isset($_POST['update'])) { + + $c = 0; + while ($_POST['mod'][$c]) { + $mods .= $_POST['mod'][$c].", "; + $c++; + } + $mods = preg_replace("/, $/", ".", $mods); + $sql->db_Select("forum", "*", "forum_name='".$_POST['parentforum']."' "); + $row = $sql->db_Fetch(); + $_POST['forum_name'] = $aj->formtpa($_POST['forum_name'], "admin"); + $_POST['forum_description'] = $aj->formtpa($_POST['forum_description'], "admin"); + $forum_parent = $row['forum_id']; + $sql->db_Update("forum", "forum_name='".$_POST['forum_name']."', forum_description='".$_POST['forum_description']."', forum_parent='".$forum_parent."', forum_moderators='".$mods."', forum_class='".$_POST['forum_class']."' WHERE forum_id='".$_POST['forum_id']."' "); + unset($forum_name, $forum_description, $forum_parent, $forum_active); + $message = FORLAN_12; +} + +If(isset($_POST['psubmit'])) { + $_POST['parent'] = $aj->formtpa($_POST['parent'], "admin"); + $sql->db_Insert("forum", "0, '".$_POST['parent']."', '', '', '".time()."', '0', '0', '0', '', '".$_POST['parent_class']."', 0 "); + unset($parent); + $message = FORLAN_13; +} + +If(isset($_POST['pupdate'])) { + $_POST['parent'] = $aj->formtpa($_POST['parent'], "admin"); + $sql->db_Update("forum", "forum_name='".$_POST['parent']."', forum_class='".$_POST['parent_class']."' WHERE forum_id='".$_POST['existing']."' "); + unset($parent); + $message = FORLAN_14; +} + +If(isset($_POST['pedit'])) { + $sql->db_Select("forum", "*", "forum_id='".$_POST['existing']."' "); + list($forum_id, $parent, $forum_description, $forum_parent, $forum_datestamp, $forum_moderators, $forum_threads, $forum_replies, $forum_lastpost, $parent_class) = $sql->db_Fetch(); + $parent = stripslashes($parent); +} + +If(isset($_POST['edit'])) { + $sql->db_Select("forum", "*", "forum_id='".$_POST['existing']."' "); + list($forum_id, $forum_name, $forum_description, $forum_parent, $forum_datestamp, $forum_moderators, $forum_threads, $forum_replies, $forum_lastpost, $forum_class) = $sql->db_Fetch(); + $parent = stripslashes($parent); +} + +If(isset($_POST['delete'])) { + if ($_POST['confirm']) { + $sql->db_Select("forum", "forum_id, forum_parent", "forum_id='".$_POST['existing']."' "); + $row = $sql->db_Fetch(); + extract($row); + $tt = ($forum_parent ? "" : "parent"); + $sql->db_Delete("forum", "forum_id='".$_POST['existing']."' "); + $message = FORLAN_107.$tt.FORLAN_108; + } else { + $message = FORLAN_15; + } +} + + +if (isset($message)) { + $ns->tablerender("", "
    {$message}
    "); +} + +$ns->tablerender("
    ".FORLAN_16."
    ", $text); + +$text = "
    +
    \n + + + + + + + + + + + + + + +
    "; + +$forum_parent_total = $sql->db_Select("forum", "*", "forum_parent = '0' "); +if ($forum_parent_total == 0) { + $text .= "".FORLAN_17.""; +} else { + $text .= "".FORLAN_18.": + + + + ".FORLAN_21." + "; +} +$text .= " +
    ".FORLAN_22.": + +
    ".FORLAN_23.":
    (".FORLAN_24.")
    ".r_userclass("parent_class", $parent_class); + +$text .= "
    "; + +if (isset($_POST['pedit'])) { + $text .= " + "; +} else { + $text .= ""; +} + +$text .= "
    +
    +
    "; + +$ns->tablerender("Parents", $text); + +if ($forum_parent_total == 0) { + $text = "
    ".FORLAN_27."
    "; + $ns->tablerender(FORLAN_28, $text); + require_once("footer.php"); + exit; +} + + +$forum_total = $sql->db_Select("forum", "*", "forum_parent!='0' "); + +$text = "
    +
    \n + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    "; + +if ($forum_total == "0") { + $text .= "".FORLAN_29.""; +} else { + $text .= "".FORLAN_30.": + + + + ".FORLAN_21." + "; +} + +$text .= " +
    ".FORLAN_22.": + +
    ".FORLAN_31.": + +
    ".FORLAN_32.": + +
    ".FORLAN_23.":
    (".FORLAN_24.")
    ".r_userclass("forum_class", $forum_class, "on")." +
    ".FORLAN_33.":
    (".FORLAN_34.")
    "; +$admin_no = $sql->db_Select("user", "*", "user_admin='1' AND user_perms REGEXP('A.') OR user_perms='0' "); +while ($row = $sql->db_Fetch()) { + extract($row); + $text .= " + "; +} else { + $text .= ""; +} + +$text .= "
    +
    +
    "; +$ns->tablerender("Forums", $text); + + +$text = "
    + + + + + + "; + +if (!$parent_amount = $sql->db_Select("forum", "*", "forum_parent='0' ORDER BY forum_order ASC")) { + $text .= ""; +} else { + $sql2 = new db; + $sql3 = new db; + while ($row = $sql->db_Fetch()) { + extract($row); + if ($forum_class == 255) { + $text .= ""; + } + else if($forum_class == 254) { + $text .= ""; + } + else if($forum_class) { + $text .= ""; + } else { + $text .= ""; + } + + $text .= "\n"; + + $forums = $sql2->db_Select("forum", "*", "forum_parent = '{$forum_id}' ORDER BY forum_order ASC"); + if (!$forums) { + $text .= ""; + } else { + while ($row = $sql2->db_Fetch()) { + extract($row); + + $text .= "\n + \n"; + } + } + } +} + +$text .= " + + + +
    ".FORLAN_28."".FORLAN_37."
    ".FORLAN_29."
    {$forum_name} (".FORLAN_38.")
    {$forum_name} (".FORLAN_39.")
    {$forum_name} (".FORLAN_40.")
    {$forum_name}\n
    ".FORLAN_29."
    ".$forum_name."
    ".$forum_description."
    \n\n
    + +
    "; +$ns->tablerender(FORLAN_43, $text); + + +$text = "
    +
    \n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + ".FORLAN_44."
    + ".FORLAN_45." +
    ". ($pref['forum_enclose'] ? "" : "")." +
    + ".FORLAN_65."
    + ".FORLAN_46." +
    + +
    + ".FORLAN_47."
    + ".FORLAN_48." +
    ". ($pref['email_notify'] ? "" : "")." +
    + ".FORLAN_68."
    + ".FORLAN_69." +
    ". ($pref['html_post'] ? "" : "")." +
    + ".FORLAN_49."
    + ".FORLAN_50." +
    ". ($pref['forum_poll'] ? "" : "")." +
    + ".FORLAN_70."
    + ".FORLAN_71." +
    ". ($pref['forum_attach'] ? "" : "")." +
    + ".FORLAN_51."
    + ".FORLAN_52." +
    ". ($pref['forum_track'] ? "" : "")." +
    + ".FORLAN_53."
    + ".FORLAN_54." +
    + +
    + ".FORLAN_55."
    + ".FORLAN_56." +
    + +
    + ".FORLAN_57."
    + ".FORLAN_58." +
    + +
    + ".FORLAN_63."
    + ".FORLAN_64." +
    + +
    + ".FORLAN_59."
    + ".FORLAN_60." +
    + ".FORLAN_109." + +
    + +
    +
    +
    "; +$ns->tablerender(FORLAN_62, $text); + +require_once("footer.php"); + +?> \ No newline at end of file diff --git a/e107_handlers/forum_include.php b/e107_handlers/forum_include.php new file mode 100644 index 000000000..10d9ced12 --- /dev/null +++ b/e107_handlers/forum_include.php @@ -0,0 +1,61 @@ + \ No newline at end of file diff --git a/e107_handlers/forum_mod.php b/e107_handlers/forum_mod.php new file mode 100644 index 000000000..d79bc3307 --- /dev/null +++ b/e107_handlers/forum_mod.php @@ -0,0 +1,101 @@ + $val) { + if (preg_match("#(.*?)_(\d+)_x#", $key, $matches)) { + $act = $matches[1]; + $id = $matches[2]; + + switch($act) { + case 'lock' : + $sql->db_Update("forum_t", "thread_active='0' WHERE thread_id='".intval($id)."' "); + return FORLAN_CLOSE; + break; + + case 'unlock' : + $sql->db_Update("forum_t", "thread_active='1' WHERE thread_id='".intval($id)."' "); + return FORLAN_OPEN; + break; + + case 'stick' : + $sql->db_Update("forum_t", "thread_s='1' WHERE thread_id='".intval($id)."' "); + return FORLAN_STICK; + break; + + case 'unstick' : + $sql->db_Update("forum_t", "thread_s='0' WHERE thread_id='".intval($id)."' "); + return FORLAN_UNSTICK; + break; + + case 'delete' : + return forum_delete_thread($id); + break; + + } + } + } +} + +function forum_delete_thread($thread_id) { + global $sql; + $sql->db_Select("forum_t", "*", "thread_id='".intval($thread_id)."' "); + $row = $sql->db_Fetch(); + extract($row); + if ($thread_parent) { + // is post a reply? + $sql->db_Delete("forum_t", "thread_id = '".intval($thread_id)."' "); + // delete reply only + $sql->db_Update("forum", "forum_replies=forum_replies-1 WHERE forum_id='{$thread_forum_id}'"); + // dec reply count by 1 + + $sql->db_Select("forum_t", "*", "thread_id = ".intval($thread_id)); + $row = $sql->db_Fetch(); + extract($row); + $replies = $sql->db_Count("forum_t", "(*)", "WHERE thread_parent='".$thread_parent."'"); + $pref['forum_postspage'] = ($pref['forum_postspage'] ? $pref['forum_postspage'] : 10); + + $pages = 0; + if ($replies) { + $pages = ((ceil($replies / $pref['forum_postspage']) -1) * $pref['forum_postspage']); + } + + $url = e_BASE."forum_viewtopic.php?".$forum_id.".".$thread_parent.($pages ? ".$pages" : ""); + // set return url + return FORLAN_26; + } else { + // post is thread + $sql->db_Delete("poll", "poll_datestamp='".intval($thread_id)."'"); + // delete poll if there is one + $count = $sql->db_Delete("forum_t", "thread_parent='".intval($thread_id)."'"); + // delete replies and grab how many there were + $sql->db_Delete("forum_t", "thread_id='".intval($thread_id)."'"); + // delete the post itself + $sql->db_Update("forum", "forum_threads=forum_threads-1, forum_replies = forum_replies - {$count} WHERE forum_id = '{$thread_forum_id}'"); + // update thread/reply counts + $url = e_BASE."forum_viewforum.php?".$forum_id; + // set return url + return FORLAN_6.($count ? ", ".$count." ".FORLAN_7."." : "."); + } +} + \ No newline at end of file diff --git a/e107_handlers/index.html b/e107_handlers/index.html new file mode 100644 index 000000000..e69de29bb diff --git a/e107_handlers/input_class.php b/e107_handlers/input_class.php new file mode 100644 index 000000000..0d99f00e1 --- /dev/null +++ b/e107_handlers/input_class.php @@ -0,0 +1,78 @@ + \ No newline at end of file diff --git a/e107_handlers/language_class.php b/e107_handlers/language_class.php new file mode 100644 index 000000000..b4ae88ec7 --- /dev/null +++ b/e107_handlers/language_class.php @@ -0,0 +1,248 @@ + "Afar", + "ab" => "Abkhazian", + "af" => "Afrikaans", + "am" => "Amharic", + "ar" => "Arabic", + "as" => "Assamese", + "ae" => "Avestan", + "ay" => "Aymara", + "az" => "Azerbaijani", + "ba" => "Bashkir", + "be" => "Belarusian", + "bn" => "Bengali", + "bh" => "Bihari", + "bi" => "Bislama", + "bo" => "Tibetan", + "bs" => "Bosnian", + "br" => "Breton", + "bg" => "Bulgarian", + "ca" => "Catalan", + "cs" => "Czech", + "ch" => "Chamorro", + "ce" => "Chechen", + "cn" => "Chinese-Simp", + + "cv" => "Chuvash", + "kw" => "Cornish", + "co" => "Corsican", + "cy" => "Welsh", + "da" => "Danish", + "de" => "German", + "dz" => "Dzongkha", + "el" => "Greek", + "en" => "English", + "eo" => "Esperanto", + "et" => "Estonian", + "eu" => "Basque", + "fo" => "Faroese", + "fa" => "Persian", + "fj" => "Fijian", + "fi" => "Finnish", + "fr" => "French", + "fy" => "Frisian", + "gd" => "Gaelic", + "ga" => "Irish", + "gl" => "Gallegan", + "gv" => "Manx", + "gn" => "Guarani", + "gu" => "Gujarati", + "ha" => "Hausa", + "he" => "Hebrew", + "hz" => "Herero", + "hi" => "Hindi", + "ho" => "Hiri Motu", + "hr" => "Croatian", + "hu" => "Hungarian", + "hy" => "Armenian", + "iu" => "Inuktitut", + "ie" => "Interlingue", + "id" => "Indonesian", + "ik" => "Inupiaq", + "is" => "Icelandic", + "it" => "Italian", + "jw" => "Javanese", + "ja" => "Japanese", + "kl" => "Kalaallisut", + "kn" => "Kannada", + "ks" => "Kashmiri", + "ka" => "Georgian", + "kk" => "Kazakh", + "km" => "Khmer", + "ki" => "Kikuyu", + "rw" => "Kinyarwanda", + "ky" => "Kirghiz", + "kv" => "Komi", + "ko" => "Korean", + "ku" => "Kurdish", + "lo" => "Lao", + "la" => "Latin", + "lv" => "Latvian", + "ln" => "Lingala", + "lt" => "Lithuanian", + "lb" => "Letzeburgesch", + "mh" => "Marshall", + "ml" => "Malayalam", + "mr" => "Marathi", + "mk" => "Macedonian", + "mg" => "Malagasy", + "mt" => "Maltese", + "mo" => "Moldavian", + "mn" => "Mongolian", + "mi" => "Maori", + "ms" => "Malay", + "my" => "Burmese", + "na" => "Nauru", + "nv" => "Navajo", + + "ng" => "Ndonga", + "ne" => "Nepali", + "nl" => "Dutch", + "nb" => "Norwegian", + + "ny" => "Chichewa", + "or" => "Oriya", + "om" => "Oromo", + "pa" => "Panjabi", + "pi" => "Pali", + "pl" => "Polish", + "pt" => "Portuguese", + "ps" => "Pushto", + "qu" => "Quechua", + "ro" => "Romanian", + "rn" => "Rundi", + "ru" => "Russian", + "sg" => "Sango", + "sa" => "Sanskrit", + "si" => "Sinhalese", + "sk" => "Slovak", + "sl" => "Slovenian", + + "sm" => "Samoan", + "sn" => "Shona", + "sd" => "Sindhi", + "so" => "Somali", + + "es" => "Spanish", + "sq" => "Albanian", + "sc" => "Sardinian", + "sr" => "Serbian", + "ss" => "Swati", + "su" => "Sundanese", + "sw" => "Swahili", + "sv" => "Swedish", + "ty" => "Tahitian", + "ta" => "Tamil", + "tt" => "Tatar", + "te" => "Telugu", + "tg" => "Tajik", + "tl" => "Tagalog", + "th" => "Thai", + "ti" => "Tigrinya", + + "tn" => "Tswana", + "ts" => "Tsonga", + "tk" => "Turkmen", + "tr" => "Turkish", + "tw" => "Chinese-Trad", + "ug" => "Uighur", + "uk" => "Ukrainian", + "ur" => "Urdu", + "uz" => "Uzbek", + "vi" => "Vietnamese", + + "wo" => "Wolof", + "xh" => "Xhosa", + "yi" => "Yiddish", + "yo" => "Yoruba", + "za" => "Zhuang", + "zh" => "Chinese", + "zu" => "Zulu" + ); + + if(strlen($data) > 2) + { + $tmp = array_flip($lang); + return $tmp[$data]; + } + else + { + return $lang[$data]; + } + } + + + + + // ------------------------------------------------------------------- + + function toNative($lang){ + + $name = array( + "Arabic" => "العربية", + "Bulgarian" => "Български", + "Croatian" => "Hrvatski", + "Dutch" => "Nederlands", + "English" => "English", + "Farsi" => "فارسي", + "French" => "Français", + "German" => "Deutsch", + "Greek" => "Ελληνικά", + "Hebrew" => "עִבְרִית", + "Hungarian" => "Magyar", + "Italian" => "Italiano", + "Japanese" => "日本語", + "Korean" => "한국어", + "Mongolian" => "монгол", + "Nepali" => "नेपाली", + "Portuguese" => "Português", + "Polish" => "Polski", + "Romanian" => "Romanesc", + "Russian" => "Pусский", + "Serbian" => "Srpski", + "Spanish" => "Español", + "Slovenian" => "Slovensko", + "Slovakian" => "Slovensky", + "Slovak" => "Slovensky", + "Swedish" => "Svenska", + "Thai" => " าษาไทย", + "Turkish" => "Türkçe" + ); + + return ($name[$lang]) ? $name[$lang] : $lang; + + } + + + function subdomainUrl($language) + { + global $pref; + $codelnk = ($language == $pref['sitelanguage']) ? "www" : $this->convert($language); + $urlval = str_replace($_SERVER['HTTP_HOST'],$codelnk.$pref['multilanguage_subdomain'],e_SELF); + return $urlval; + } + +} + + + + +?> \ No newline at end of file diff --git a/e107_handlers/level_handler.php b/e107_handlers/level_handler.php new file mode 100644 index 000000000..df17ee5ab --- /dev/null +++ b/e107_handlers/level_handler.php @@ -0,0 +1,119 @@ +".IMAGE_rank_moderator_image.""; + $data[0] = "
    ".IMAGE_rank_moderator_image."
    "; + } + if ($user_admin) + { + if ($user_perms == "0") + { + $data['special'] = IMAGE_rank_main_admin_image."
    "; + $data[0] = IMAGE_rank_main_admin_image."
    "; + } + else + { + $data['special'] = IMAGE_rank_admin_image."
    "; + $data[0] = IMAGE_rank_admin_image."
    "; + } + } + $data[0] = "".LAN_195." #".$user_id."
    "; + $data['userid'] = "".LAN_195." #".$user_id."
    "; + + $level_thresholds = ($pref['forum_thresholds'] ? explode(",", $pref['forum_thresholds']) : array(20, 100, 250, 410, 580, 760, 950, 1150, 1370, 1600)); + + $level_images = explode(",", $pref['forum_images']); + $level_names = explode(",", $pref['forum_levels']); + if(!$pref['forum_images']) + { + if(!$level_names[0]) + { + $level_images = array("lev1.png", "lev2.png", "lev3.png", "lev4.png", "lev5.png", "lev6.png", "lev7.png", "lev8.png", "lev9.png", "lev10.png"); + } + } + + $daysregged = max(1, round((time() - $user_join) / 86400))."days"; + $level = ceil((($user_forums * 5) + ($user_comments * 5) + ($user_chats * 2) + $user_visits)/4); + $ltmp = $level; + + if ($level <= $level_thresholds[0]) { + $rank = 0; + } + else if($level >= ($level_thresholds[0]+1) && $level <= $level_thresholds[1]) { + $rank = 1; + } + else if($level >= ($level_thresholds[1]+1) && $level <= $level_thresholds[2]) { + $rank = 2; + } + else if($level >= ($level_thresholds[2]+1) && $level <= $level_thresholds[3]) { + $rank = 3; + } + else if($level >= ($level_thresholds[3]+1) && $level <= $level_thresholds[4]) { + $rank = 4; + } + else if($level >= ($level_thresholds[4]+1) && $level <= $level_thresholds[5]) { + $rank = 5; + } + else if($level >= ($level_thresholds[5]+1) && $level <= $level_thresholds[6]) { + $rank = 6; + } + else if($level >= ($level_thresholds[6]+1) && $level <= $level_thresholds[7]) { + $rank = 7; + } + else if($level >= ($level_thresholds[7]+1) && $level <= $level_thresholds[8]) { + $rank = 8; + } + else if($level >= ($level_thresholds[8]+1)) { + $rank = 9; + } + + $data['pic'] = (file_exists(THEME."forum/".$level_images[$rank]) ? THEME."forum/".$level_images[$rank] : e_IMAGE."rate/".IMODE."/".$level_images[$rank]); + $data['name'] = "[ ".$tp->toHTML($level_names[$rank], FALSE, 'defs')." ]"; + + if($level_names[$rank]) + { + $data[1] = "
    {$data['name']}
    "; + $img_title = "title='{$data['name']}'"; + $data['pic'] = ""; + } + else + { + $data['pic'] = ""; + $data[1] = "
    {$data['pic']}
    "; + } + + if($data['special']) { $data[0] = $data['special'];} + return ($data); +} + + + +?> \ No newline at end of file diff --git a/e107_handlers/login.php b/e107_handlers/login.php new file mode 100644 index 000000000..a8cd288d7 --- /dev/null +++ b/e107_handlers/login.php @@ -0,0 +1,205 @@ +getip(); + if($sql -> db_Select("banlist", "*", "banlist_ip='{$fip}' ")) { + exit; + } + + $autologin = intval($autologin); + + if ($pref['auth_method'] && $pref['auth_method'] != "e107") { + $auth_file = e_PLUGIN."alt_auth/".$pref['auth_method']."_auth.php"; + if (file_exists($auth_file)) { + require_once(e_PLUGIN."alt_auth/alt_auth_login_class.php"); + $result = new alt_login($pref['auth_method'], $username, $userpass); + } + } + + if ($pref['logcode'] && extension_loaded("gd")) { + require_once(e_HANDLER."secure_img_handler.php"); + $sec_img = new secure_image; + if (!$sec_img->verify_code($_POST['rand_num'], $_POST['code_verify'])) { + define("LOGINMESSAGE", LAN_303."

    "); + return FALSE; + } + } + if ($username != "" && $userpass != "") { + $username = preg_replace("/\sOR\s|\=|\#/", "", $username); + $ouserpass = $userpass; + $userpass = md5($ouserpass); + + $username = substr($username, 0, 30); + + // This is only required for upgrades and only for those not using utf-8 to begin with.. + if(isset($pref['utf-compatmode']) && (CHARSET == "utf-8" || CHARSET == "UTF-8")){ + $username = utf8_decode($username); + $userpass = md5(utf8_decode($ouserpass)); + } + + if (!$sql->db_Select("user", "*", "user_loginname = '".$tp -> toDB($username)."'")) { + define("LOGINMESSAGE", LAN_300."

    "); + $sql -> db_Insert("generic", "0, 'failed_login', '".time()."', 0, '{$fip}', 0, '".LAN_LOGIN_14." ::: ".LAN_LOGIN_1.": ".$tp -> toDB($username)."'"); + $this -> checkibr($fip); + return FALSE; + } + else if(!$sql->db_Select("user", "*", "user_loginname = '".$tp -> toDB($username)."' AND user_password = '{$userpass}'")) { + define("LOGINMESSAGE", LAN_300."

    "); + return FALSE; + } + else if(!$sql->db_Select("user", "*", "user_loginname = '".$tp -> toDB($username)."' AND user_password = '{$userpass}' AND user_ban!=2 ")) { + define("LOGINMESSAGE", LAN_302."

    "); + $sql -> db_Insert("generic", "0, 'failed_login', '".time()."', 0, '{$fip}', 0, '".LAN_LOGIN_15." ::: ".LAN_LOGIN_1.": ".$tp -> toDB($username)."'"); + $this -> checkibr($fip); + return FALSE; + } else { + $ret = $e_event->trigger("preuserlogin", $username); + if ($ret!='') { + define("LOGINMESSAGE", $ret."

    "); + return FALSE; + } else { + $lode = $sql -> db_Fetch(); + $user_id = $lode['user_id']; + $user_name = $lode['user_name']; + $user_xup = $lode['user_xup']; + + /* restrict more than one person logging in using same us/pw */ + if($pref['disallowMultiLogin']) { + if($sql -> db_Select("online", "online_ip", "online_user_id='".$user_id.".".$user_name."'")) { + define("LOGINMESSAGE", LAN_304."

    "); + $sql -> db_Insert("generic", "0, 'failed_login', '".time()."', 0, '$fip', '$user_id', '".LAN_LOGIN_16." ::: ".LAN_LOGIN_1.": ".$tp -> toDB($username).", ".LAN_LOGIN_17.": ".md5($ouserpass)."' "); + $this -> checkibr($fip); + return FALSE; + } + } + + $cookieval = $user_id.".".md5($userpass); + if($user_xup) { + $this->update_xup($user_id, $user_xup); + } + + if ($pref['user_tracking'] == "session") { + $_SESSION[$pref['cookie_name']] = $cookieval; + } else { + if ($autologin == 1) { + cookie($pref['cookie_name'], $cookieval, (time() + 3600 * 24 * 30)); + } else { + cookie($pref['cookie_name'], $cookieval); + } + } + $edata_li = array("user_id" => $user_id, "user_name" => $username); + $e_event->trigger("login", $edata_li); + $redir = (e_QUERY ? e_SELF."?".e_QUERY : e_SELF); + if (strstr($_SERVER['SERVER_SOFTWARE'], "Apache")) { + header("Location: ".$redir); + exit; + } else { + echo "\n"; + } + } + } + } else { + define("LOGINMESSAGE", LAN_27."

    "); + return FALSE; + } + } + + function checkibr($fip) { + global $sql, $pref, $tp; + if($pref['autoban'] == 1 || $pref['autoban'] == 3){ // Flood + Login or Login Only. + $fails = $sql -> db_Count("generic", "(*)", "WHERE gen_ip='$fip' AND gen_type='failed_login' "); + if($fails > 10) { + $sql -> db_Insert("banlist", "'$fip', '1', '".LAN_LOGIN_18."' "); + $sql -> db_Insert("generic", "0, 'auto_banned', '".time()."', 0, '$fip', '$user_id', '".LAN_LOGIN_20.": ".$tp -> toDB($username).", ".LAN_LOGIN_17.": ".md5($ouserpass)."' "); + } + } + } + + function update_xup($user_id, $user_xup = "") { + global $sql, $tp; + if($user_xup) { + require_once(e_HANDLER."xml_class.php"); + $xml = new parseXml; + if($rawData = $xml -> getRemoteXmlFile($user_xup)) { + preg_match_all("#\#si", $rawData, $match); + $count = 0; + foreach($match[1] as $value) { + $$value = $tp -> toDB($match[2][$count]); + $count++; + } + + $sql -> db_Update("user", "user_login='{$FN}', user_hideemail='{EMAILHIDE}', user_signature='{$SIG}', user_sess='{$PHOTO}', user_image='{$AV}', user_timezone='{$TZ}' WHERE user_id='".intval($user_id)."'"); + + $ue_fields = ""; + $fields = array("URL" => "homepage", + "ICQ" => "icq", + "AIM" => "aim", + "MSN" => "msn", + "YAHOO" => "yahoo", + "GEO" => "location", + "BDAY" => "birthday"); + include_once(e_HANDLER."user_extended_class.php"); + $usere = new e107_user_extended; + $extList = $usere->user_extended_get_fieldList(); + $extName = array(); + foreach($extList as $ext) + { + $extName[] = $ext['user_extended_struct_name']; + } + foreach($fields as $keyxup => $keydb) + { + if (in_array($keydb, $extName)) + { + $key = "user_".$keydb; + $key = $tp->toDB($key); + $val = $tp->toDB($$keyxup); + $ue_fields .= ($ue_fields) ? ", " : ""; + $ue_fields .= $key."='".$val."'"; + } + } + $sql -> db_Select_gen("INSERT INTO #user_extended (user_extended_id) values ('".intval($user_id)."')"); + $sql -> db_Update("user_extended", $ue_fields." WHERE user_extended_id = '".intval($user_id)."'"); + } + } + } +} + +?> diff --git a/e107_handlers/magpie_rss.php b/e107_handlers/magpie_rss.php new file mode 100644 index 000000000..74d1f4429 --- /dev/null +++ b/e107_handlers/magpie_rss.php @@ -0,0 +1,630 @@ + +* @version 0.7a +* @license GPL +* +*/ + +define('RSS', 'RSS'); +define('ATOM', 'Atom'); + +/** +* Hybrid parser, and object, takes RSS as a string and returns a simple object. +* +* see: rss_fetch.inc for a simpler interface with integrated caching support +* +*/ +class MagpieRSS { + var $parser; + + var $current_item = array(); // item currently being parsed + var $items = array(); // collection of parsed items + var $channel = array(); // hash of channel fields + var $textinput = array(); + var $image = array(); + var $feed_type; + var $feed_version; + var $encoding = ''; // output encoding of parsed rss + + var $_source_encoding = ''; // only set if we have to parse xml prolog + + var $ERROR = ""; + var $WARNING = ""; + + // define some constants + + var $_CONTENT_CONSTRUCTS = array('content', 'summary', 'info', 'title', 'tagline', 'copyright'); + var $_KNOWN_ENCODINGS = array('UTF-8', 'US-ASCII', 'ISO-8859-1'); + + // parser variables, useless if you're not a parser, treat as private + var $stack = array(); // parser stack + var $inchannel = false; + var $initem = false; + var $incontent = false; // if in Atom field + var $intextinput = false; + var $inimage = false; + var $current_field = ''; + var $current_namespace = false; + + + /** + * Set up XML parser, parse source, and return populated RSS object.. + * + * @param string $source string containing the RSS to be parsed + * + * NOTE: Probably a good idea to leave the encoding options alone unless + * you know what you're doing as PHP's character set support is + * a little weird. + * + * NOTE: A lot of this is unnecessary but harmless with PHP5 + * + * + * @param string $output_encoding output the parsed RSS in this character + * set defaults to ISO-8859-1 as this is PHP's + * default. + * + * NOTE: might be changed to UTF-8 in future + * versions. + * + * @param string $input_encoding the character set of the incoming RSS source. + * Leave blank and Magpie will try to figure it + * out. + * + * + * @param bool $detect_encoding if false Magpie won't attempt to detect + * source encoding. (caveat emptor) + * + */ + function MagpieRSS ($source, $output_encoding = CHARSET, + $input_encoding=null, $detect_encoding = true) + { + # if PHP xml isn't compiled in, die + # + if (!function_exists('xml_parser_create')) { + $this->error( "Failed to load PHP's XML Extension. " . + "http://www.php.net/manual/en/ref.xml.php", + E_USER_ERROR ); + } + + list($parser, $source) = $this->create_parser($source, + $output_encoding, $input_encoding, $detect_encoding); + + + if (!is_resource($parser)) { + $this->error( "Failed to create an instance of PHP's XML parser. " . + "http://www.php.net/manual/en/ref.xml.php", + E_USER_ERROR ); + } + + + $this->parser = $parser; + + # pass in parser, and a reference to this object + # setup handlers + # + xml_set_object( $this->parser, $this ); + xml_set_element_handler($this->parser, + 'feed_start_element', 'feed_end_element' ); + + xml_set_character_data_handler( $this->parser, 'feed_cdata' ); + + $status = xml_parse( $this->parser, $source ); + + if (! $status ) { + $errorcode = xml_get_error_code( $this->parser ); + if ( $errorcode != XML_ERROR_NONE ) { + $xml_error = xml_error_string( $errorcode ); + $error_line = xml_get_current_line_number($this->parser); + $error_col = xml_get_current_column_number($this->parser); + $errormsg = "{$xml_error} at line {$error_line}, column {$error_col}"; + + $this->error( $errormsg ); + } + } + + xml_parser_free( $this->parser ); + + $this->normalize(); + } + + function feed_start_element($p, $element, &$attrs) { + $el = $element = strtolower($element); + $attrs = array_change_key_case($attrs, CASE_LOWER); + + // check for a namespace, and split if found + $ns = false; + if ( strpos( $element, ':' ) ) { + list($ns, $el) = split( ':', $element, 2); + } + if ( $ns and $ns != 'rdf' ) { + $this->current_namespace = $ns; + } + + # if feed type isn't set, then this is first element of feed + # identify feed from root element + # + if (!isset($this->feed_type) ) { + if ( $el == 'rdf' ) { + $this->feed_type = RSS; + $this->feed_version = '1.0'; + } + elseif ( $el == 'rss' ) { + $this->feed_type = RSS; + $this->feed_version = $attrs['version']; + } + elseif ( $el == 'feed' ) { + $this->feed_type = ATOM; + $this->feed_version = $attrs['version']; + $this->inchannel = true; + } + return; + } + + if ( $el == 'channel' ) + { + $this->inchannel = true; + } + elseif ($el == 'item' or $el == 'entry' ) + { + $this->initem = true; + if ( isset($attrs['rdf:about']) ) { + $this->current_item['about'] = $attrs['rdf:about']; + } + } + + // if we're in the default namespace of an RSS feed, + // record textinput or image fields + elseif ( + $this->feed_type == RSS and + $this->current_namespace == '' and + $el == 'textinput' ) + { + $this->intextinput = true; + } + + elseif ( + $this->feed_type == RSS and + $this->current_namespace == '' and + $el == 'image' ) + { + $this->inimage = true; + } + + # handle atom content constructs + elseif ( $this->feed_type == ATOM and in_array($el, $this->_CONTENT_CONSTRUCTS) ) + { + // avoid clashing w/ RSS mod_content + if ($el == 'content' ) { + $el = 'atom_content'; + } + + $this->incontent = $el; + + + } + + // if inside an Atom content construct (e.g. content or summary) field treat tags as text + elseif ($this->feed_type == ATOM and $this->incontent ) + { + // if tags are inlined, then flatten + $attrs_str = join(' ', + array_map('map_attrs', + array_keys($attrs), + array_values($attrs) ) ); + + $this->append_content( "<{$element} {$attrs_str}>" ); + + array_unshift( $this->stack, $el ); + } + + // Atom support many links per containging element. + // Magpie treats link elements of type rel='alternate' + // as being equivalent to RSS's simple link element. + // + elseif ($this->feed_type == ATOM and $el == 'link' ) + { + if ( isset($attrs['rel']) and $attrs['rel'] == 'alternate' ) + { + $link_el = 'link'; + } + else { + $link_el = 'link_' . $attrs['rel']; + } + + $this->append($link_el, $attrs['href']); + } + // set stack[0] to current element + else { + array_unshift($this->stack, $el); + } + } + + + + function feed_cdata ($p, $text) { + + if ($this->feed_type == ATOM and $this->incontent) + { + $this->append_content( $text ); + } + else { + $current_el = join('_', array_reverse($this->stack)); + $this->append($current_el, $text); + } + } + + function feed_end_element ($p, $el) { + $el = strtolower($el); + + if ( $el == 'item' or $el == 'entry' ) + { + $this->items[] = $this->current_item; + $this->current_item = array(); + $this->initem = false; + } + elseif ($this->feed_type == RSS and $this->current_namespace == '' and $el == 'textinput' ) + { + $this->intextinput = false; + } + elseif ($this->feed_type == RSS and $this->current_namespace == '' and $el == 'image' ) + { + $this->inimage = false; + } + elseif ($this->feed_type == ATOM and in_array($el, $this->_CONTENT_CONSTRUCTS) ) + { + $this->incontent = false; + } + elseif ($el == 'channel' or $el == 'feed' ) + { + $this->inchannel = false; + } + elseif ($this->feed_type == ATOM and $this->incontent ) { + // balance tags properly + // note: i don't think this is actually neccessary + if ( $this->stack[0] == $el ) + { + $this->append_content(""); + } + else { + $this->append_content("<{$el} />"); + } + + array_shift( $this->stack ); + } + else { + array_shift( $this->stack ); + } + + $this->current_namespace = false; + } + + function concat (&$str1, $str2 = "") { + if (!isset($str1) ) { + $str1 = ""; + } + $str1 .= $str2; + } + + + + function append_content($text) { + if ( $this->initem ) { + $this->concat( $this->current_item[ $this->incontent ], $text ); + } + elseif ( $this->inchannel ) { + $this->concat( $this->channel[ $this->incontent ], $text ); + } + } + + // smart append - field and namespace aware + function append($el, $text) { + if (!$el) { + return; + } + if ( $this->current_namespace ) + { + if ( $this->initem ) { + $this->concat( + $this->current_item[ $this->current_namespace ][ $el ], $text); + } + elseif ($this->inchannel) { + $this->concat( + $this->channel[ $this->current_namespace][ $el ], $text ); + } + elseif ($this->intextinput) { + $this->concat( + $this->textinput[ $this->current_namespace][ $el ], $text ); + } + elseif ($this->inimage) { + $this->concat( + $this->image[ $this->current_namespace ][ $el ], $text ); + } + } + else { + if ( $this->initem ) { + $this->concat( + $this->current_item[ $el ], $text); + } + elseif ($this->intextinput) { + $this->concat( + $this->textinput[ $el ], $text ); + } + elseif ($this->inimage) { + $this->concat( + $this->image[ $el ], $text ); + } + elseif ($this->inchannel) { + $this->concat( + $this->channel[ $el ], $text ); + } + + } + } + + function normalize () { + // if atom populate rss fields + if ( $this->is_atom() ) { + $this->channel['description'] = $this->channel['tagline']; + for ( $i = 0; $i < count($this->items); $i++) { + $item = $this->items[$i]; + if ( isset($item['summary']) ) + $item['description'] = $item['summary']; + if ( isset($item['atom_content'])) + $item['content']['encoded'] = $item['atom_content']; + + $atom_date = (isset($item['issued']) ) ? $item['issued'] : $item['modified']; + if ( $atom_date ) { + $epoch = @parse_w3cdtf($item['modified']); + if ($epoch and $epoch > 0) { + $item['date_timestamp'] = $epoch; + } + } + + $this->items[$i] = $item; + } + } + elseif ( $this->is_rss() ) { + $this->channel['tagline'] = $this->channel['description']; + for ( $i = 0; $i < count($this->items); $i++) { + $item = $this->items[$i]; + if ( isset($item['description'])) + $item['summary'] = $item['description']; + if ( isset($item['content']['encoded'] ) ) + $item['atom_content'] = $item['content']['encoded']; + + if ( $this->is_rss() == '1.0' and isset($item['dc']['date']) ) { + $epoch = @parse_w3cdtf($item['dc']['date']); + if ($epoch and $epoch > 0) { + $item['date_timestamp'] = $epoch; + } + } + elseif ( isset($item['pubdate']) ) { + $epoch = @strtotime($item['pubdate']); + if ($epoch > 0) { + $item['date_timestamp'] = $epoch; + } + } + + $this->items[$i] = $item; + } + } + } + + + function is_rss () { + if ( $this->feed_type == RSS ) { + return $this->feed_version; + } + else { + return false; + } + } + + function is_atom() { + if ( $this->feed_type == ATOM ) { + return $this->feed_version; + } + else { + return false; + } + } + + /** + * return XML parser, and possibly re-encoded source + * + */ + function create_parser($source, $out_enc, $in_enc, $detect) { + if ( substr(phpversion(), 0, 1) == 5) { + $parser = $this->php5_create_parser($in_enc, $detect); + } + else { + list($parser, $source) = $this->php4_create_parser($source, $in_enc, $detect); + } + if ($out_enc) { + $this->encoding = $out_enc; + xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, $out_enc); + } + + return array($parser, $source); + } + + /** + * Instantiate an XML parser under PHP5 + * + * PHP5 will do a fine job of detecting input encoding + * if passed an empty string as the encoding. + * + * All hail libxml2! + * + */ + function php5_create_parser($in_enc, $detect) { + // by default php5 does a fine job of detecting input encodings + if(!$detect && $in_enc) { + return xml_parser_create($in_enc); + } + else { + return xml_parser_create(''); + } + } + + /** + * Instaniate an XML parser under PHP4 + * + * Unfortunately PHP4's support for character encodings + * and especially XML and character encodings sucks. As + * long as the documents you parse only contain characters + * from the ISO-8859-1 character set (a superset of ASCII, + * and a subset of UTF-8) you're fine. However once you + * step out of that comfy little world things get mad, bad, + * and dangerous to know. + * + * The following code is based on SJM's work with FoF + * @see http://minutillo.com/steve/weblog/2004/6/17/php-xml-and-character-encodings-a-tale-of-sadness-rage-and-data-loss + * + */ + function php4_create_parser($source, $in_enc, $detect) { + if ( !$detect ) { + return array(xml_parser_create($in_enc), $source); + } + + if (!$in_enc) { + if (preg_match('//m', $source, $m)) { + $in_enc = strtoupper($m[1]); + $this->source_encoding = $in_enc; + } + else { + $in_enc = 'UTF-8'; + } + } + + if ($this->known_encoding($in_enc)) { + return array(xml_parser_create($in_enc), $source); + } + + // the dectected encoding is not one of the simple encodings PHP knows + + // attempt to use the iconv extension to + // cast the XML to a known encoding + // @see http://php.net/iconv + + if (function_exists('iconv')) { + $encoded_source = iconv($in_enc,'UTF-8', $source); + if ($encoded_source) { + return array(xml_parser_create('UTF-8'), $encoded_source); + } + } + + // iconv didn't work, try mb_convert_encoding + // @see http://php.net/mbstring + if(function_exists('mb_convert_encoding')) { + $encoded_source = mb_convert_encoding($source, 'UTF-8', $in_enc ); + if ($encoded_source) { + return array(xml_parser_create('UTF-8'), $encoded_source); + } + } + + // else + $this->error("Feed is in an unsupported character encoding. ({$in_enc}) " . + "You may see strange artifacts, and mangled characters.", + E_USER_NOTICE); + + return array(xml_parser_create(), $source); + } + + function known_encoding($enc) { + $enc = strtoupper($enc); + if ( in_array($enc, $this->_KNOWN_ENCODINGS) ) { + return $enc; + } + else { + return false; + } + } + + function error ($errormsg, $lvl=E_USER_WARNING) { + // append PHP's error message if track_errors enabled + if ( $php_errormsg ) { + $errormsg .= " ({$php_errormsg})"; + } + if ( MAGPIE_DEBUG ) { + trigger_error( $errormsg, $lvl); + } + else { + error_log( $errormsg, 0); + } + + $notices = E_USER_NOTICE|E_NOTICE; + if ( $lvl&$notices ) { + $this->WARNING = $errormsg; + } else { + $this->ERROR = $errormsg; + } + } + + +} // end class RSS + +function map_attrs($k, $v) { + return "$k=\"$v\""; +} + +function parse_w3cdtf ( $date_str ) { + + # regex to match wc3dtf + $pat = "/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(:(\d{2}))?(?:([-+])(\d{2}):?(\d{2})|(Z))?/"; + + if ( preg_match( $pat, $date_str, $match ) ) { + list( $year, $month, $day, $hours, $minutes, $seconds) = + array( $match[1], $match[2], $match[3], $match[4], $match[5], $match[6]); + + # calc epoch for current date assuming GMT + $epoch = gmmktime( $hours, $minutes, $seconds, $month, $day, $year); + + $offset = 0; + if ( $match[10] == 'Z' ) { + # zulu time, aka GMT + } + else { + list( $tz_mod, $tz_hour, $tz_min ) = + array( $match[8], $match[9], $match[10]); + + # zero out the variables + if ( ! $tz_hour ) { $tz_hour = 0; } + if ( ! $tz_min ) { $tz_min = 0; } + + $offset_secs = (($tz_hour * 60) + $tz_min) * 60; + + # is timezone ahead of GMT? then subtract offset + # + if ( $tz_mod == '+' ) { + $offset_secs = $offset_secs * -1; + } + + $offset = $offset_secs; + } + $epoch = $epoch + $offset; + return $epoch; + } + else { + return -1; + } +} + +?> diff --git a/e107_handlers/mail.php b/e107_handlers/mail.php new file mode 100644 index 000000000..ee73de155 --- /dev/null +++ b/e107_handlers/mail.php @@ -0,0 +1,194 @@ +parseTemplate($EMAIL_HEADER); + $EMAIL_FOOTER = $tp->parseTemplate($EMAIL_FOOTER); + } +/* +Please note that mailed attachments have been found to be corrupted using php 4.3.3 +php 4.3.6 does NOT have this problem. +*/ +// Comment out the line below if you have trouble with some people not receiving emails. +// e107_ini_set(sendmail_path, "/usr/sbin/sendmail -t -f ".$pref['siteadminemail']); + +function sendemail($send_to, $subject, $message, $to_name, $send_from, $from_name, $attachments, $Cc, $Bcc, $returnpath, $returnreceipt,$inline ="") { + global $pref,$mailheader_e107id; + + require_once(e_HANDLER."phpmailer/class.phpmailer.php"); + + $mail = new PHPMailer(); + + if($mailheader_e107id){ + $mail->AddCustomHeader("X-e107-id: {$mailheader_e107id}"); + } + + if ($pref['mailer']== 'smtp') { + + if(isset($pref['smtp_pop3auth']) && $pref['smtp_pop3auth']){ + // http://www.corephp.co.uk/archives/18-POP-before-SMTP-Authentication-for-PHPMailer.html + require_once(e_HANDLER."phpmailer/class.pop3.php"); + $pop = new POP3(); + $pop->Authorise($pref['smtp_server'], 110, 30, $pref['smtp_username'], $pref['smtp_password'], 1); + } + + $mail->Mailer = "smtp"; + $mail->SMTPKeepAlive = FALSE; + $mail->Host = $pref['smtp_server']; + if($pref['smtp_username'] && $pref['smtp_password']){ + $mail->SMTPAuth = (isset($pref['smtp_pop3auth']) && $pref['smtp_pop3auth']) ? FALSE : TRUE; + $mail->Username = $pref['smtp_username']; + $mail->Password = $pref['smtp_password']; + $mail->PluginDir = e_HANDLER."phpmailer/"; + } + + } elseif ($pref['mailer']== 'sendmail'){ + $mail->Mailer = "sendmail"; + $mail->Sendmail = ($pref['sendmail']) ? $pref['sendmail'] : "/usr/sbin/sendmail -t -i -r ".$pref['siteadminemail']; + } else { + $mail->Mailer = "mail"; + } + + $to_name = ($to_name) ? $to_name: $send_to; + + $mail->CharSet = CHARSET; + $mail->From = ($send_from)? $send_from: $pref['siteadminemail']; + $mail->FromName = ($from_name)? $from_name: $pref['siteadmin']; + $mail->Subject = $subject; + $mail->SetLanguage("en",e_HANDLER."phpmailer/language/"); + + $lb = "\n"; + + + // Clean up the HTML. == + + if (preg_match('/<(font|br|a|img|b)/i', $message)) { + $Html = $message; // Assume html if it begins with one of these tags + } else { + $Html = htmlspecialchars($message); + $Html = preg_replace('%(http|ftp|https)(://\S+)%', '\1\2', $Html); + $Html = preg_replace('/([[:space:]()[{}])(www.[-a-zA-Z0-9@:%_\+.~#?&\/\/=]+)/i', '\\1\\2', $Html); + $Html = preg_replace('/([_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3})/i', '\\1', $Html); + $Html = str_replace("\n", "
    \n", $Html); + } + if (strpos($message,"") !== FALSE){ + $text = strstr($message,""); + }else{ + $text = $message; + } + $text = str_replace("
    ", "\n", $text); + $text = strip_tags(str_replace("
    ", "\n", $text)); + + $mail->Body = $Html; //Main message is HTML + $mail->IsHTML(TRUE); + $mail->AltBody = $text; //Include regular plaintext as well + + + $tmp = explode(",",$send_to); + foreach($tmp as $adr){ + $mail->AddAddress($adr, $to_name); + } + + + if ($attachments){ + if (is_array($attachments)) { + foreach($attachments as $attach){ + if(is_readable($attach)){ + $mail->AddAttachment($attach, basename($attach),"base64",mime_content_type($attach)); + } + } + }else{ + if(is_readable($attachments)){ + $mail->AddAttachment($attachments, basename($attachments),"base64",mime_content_type($attachments)); + } + } + } + + if($inline){ + $tmp = explode(",",$inline); + foreach($tmp as $inline_img){ + if(is_readable($inline_img) && !is_dir($inline_img)){ + $mail->AddEmbeddedImage($inline_img, md5($inline_img), basename($inline_img),"base64",mime_content_type($inline_img)); + } + } + } + + + if($Cc){ + if($mail->Mailer == "mail"){ + $mail->AddCustomHeader("Cc: {$Cc}"); + }else{ + $tmp = explode(",",$Cc); + foreach($tmp as $addc){ + $mail->AddCC($addc); + } + } + } + + if($Bcc){ + if($mail->Mailer == "mail"){ + $mail->AddCustomHeader("Bcc: {$Bcc}"); + }else{ + $tmp = explode(",",$Bcc); + foreach($tmp as $addbc){ + $mail->AddBCC($addbc); + } + } + } + + if($pref['mail_bounce_email'] !=''){ + $mail->Sender = $pref['mail_bounce_email']; + } + + if (!$mail->Send()) { + // echo "There has been a mail error sending to " . $row["email"] . "
    "; + return FALSE; + // Clear all addresses and attachments for next loop + $mail->ClearAddresses(); + $mail->ClearAttachments(); + } else { + // Clear all addresses and attachments for next loop + $mail->ClearAddresses(); + $mail->ClearAttachments(); + return TRUE; + } + +} + +/* Deprecated. + Use mail_validation_class.php instead. +function validatemail($Email) { + +} +*/ + + + +?> \ No newline at end of file diff --git a/e107_handlers/mail_validation_class.php b/e107_handlers/mail_validation_class.php new file mode 100644 index 000000000..bb70795e0 --- /dev/null +++ b/e107_handlers/mail_validation_class.php @@ -0,0 +1,232 @@ +next_token; + } + for($character=0;$characternext_token=substr($string,$found+1); + return(substr($string,0,$found)); + } + else + { + $this->next_token=""; + return($string); + } + } + + Function OutputDebug($message) + { + $message.="\n"; + if($this->html_debug) + $message=str_replace("\n","
    \n",HtmlEntities($message)); + echo $message; + flush(); + } + + Function GetLine($connection) + { + for($line="";;) + { + if(feof($connection)) + return(0); + $line.=fgets($connection,100); + $length=strlen($line); + if($length>=2 + && substr($line,$length-2,2)=="\r\n") + { + $line=substr($line,0,$length-2); + if($this->debug) + $this->OutputDebug("S $line"); + return($line); + } + } + } + + Function PutLine($connection,$line) + { + if($this->debug) + $this->OutputDebug("C $line"); + return(fputs($connection,"$line\r\n")); + } + + Function ValidateEmailAddress($email) + { + if(IsSet($this->preg)) + { + if(strlen($this->preg)) + return(preg_match($this->preg,$email)); + } + else + { + $this->preg=(function_exists("preg_match") ? "/".str_replace("/", "\\/", $this->email_regular_expression)."/" : ""); + return($this->ValidateEmailAddress($email)); + } + return(eregi($this->email_regular_expression,$email)!=0); + } + + Function ValidateEmailHost($email,&$hosts) + { + if(!$this->ValidateEmailAddress($email)) + return(0); + $user=$this->Tokenize($email,"@"); + $domain=$this->Tokenize(""); + $hosts=$weights=array(); + $getmxrr=$this->getmxrr; + if(function_exists($getmxrr) + && $getmxrr($domain,$hosts,$weights)) + { + $mxhosts=array(); + for($host=0;$hostexclude_address)==0 + || strcmp(@gethostbyname($this->exclude_address),$ip))) + $hosts[]=$domain; + } + return(count($hosts)!=0); + } + + Function VerifyResultLines($connection,$code) + { + while(($line=$this->GetLine($connection))) + { + $this->last_code=$this->Tokenize($line," -"); + if(strcmp($this->last_code,$code)) + return(0); + if(!strcmp(substr($line, strlen($this->last_code), 1)," ")) + return(1); + } + return(-1); + } + + Function ValidateEmailBox($email) + { + if(!$this->ValidateEmailHost($email,$hosts)) + return(0); + if(!strcmp($localhost=$this->localhost,"") + && !strcmp($localhost=getenv("SERVER_NAME"),"") + && !strcmp($localhost=getenv("HOST"),"")) + $localhost="localhost"; + if(!strcmp($localuser=$this->localuser,"") + && !strcmp($localuser=getenv("USERNAME"),"") + && !strcmp($localuser=getenv("USER"),"")) + $localuser="root"; + for($host=0;$hostdebug) + $this->OutputDebug("Resolving host name \"".$hosts[$host]."\"..."); + if(!strcmp($ip=@gethostbyname($domain),$domain)) + { + if($this->debug) + $this->OutputDebug("Could not resolve host name \"".$hosts[$host]."\"."); + continue; + } + } + if(strlen($this->exclude_address) + && !strcmp(@gethostbyname($this->exclude_address),$ip)) + { + if($this->debug) + $this->OutputDebug("Host address of \"".$hosts[$host]."\" is the exclude address"); + continue; + } + if($this->debug) + $this->OutputDebug("Connecting to host address \"".$ip."\"..."); + if(($connection=($this->timeout ? @fsockopen($ip,25,$errno,$error,$this->timeout) : @fsockopen($ip,25)))) + { + $timeout=($this->data_timeout ? $this->data_timeout : $this->timeout); + if($timeout + && function_exists("socket_set_timeout")) + socket_set_timeout($connection,$timeout,0); + if($this->debug) + $this->OutputDebug("Connected."); + if($this->VerifyResultLines($connection,"220")>0 + && $this->PutLine($connection,"HELO $localhost") + && $this->VerifyResultLines($connection,"250")>0 + && $this->PutLine($connection,"MAIL FROM: <$localuser@$localhost>") + && $this->VerifyResultLines($connection,"250")>0 + && $this->PutLine($connection,"RCPT TO: <$email>") + && ($result=$this->VerifyResultLines($connection,"250"))>=0) + { + if($result) + { + if($this->PutLine($connection,"DATA")) + $result=($this->VerifyResultLines($connection,"354")!=0); + } + else + { + if(strlen($this->last_code) + && !strcmp($this->last_code[0],"4")) + $result=-1; + } + if($this->debug) + $this->OutputDebug("This host states that the address is ".($result ? ($result>0 ? "valid" : "undetermined") : "not valid")."."); + $this->PutLine($connection,"QUIT"); + fclose($connection); + if($this->debug) + $this->OutputDebug("Disconnected."); + return($result); + } + if($this->debug) + $this->OutputDebug("Unable to validate the address with this host."); + fclose($connection); + if($this->debug) + $this->OutputDebug("Disconnected."); + } + else + { + if($this->debug) + $this->OutputDebug("Failed."); + } + } + return(-1); + } +}; + +?> \ No newline at end of file diff --git a/e107_handlers/message_handler.php b/e107_handlers/message_handler.php new file mode 100644 index 000000000..b58297ecb --- /dev/null +++ b/e107_handlers/message_handler.php @@ -0,0 +1,95 @@ +".LAN_ERROR_25.""; + $emessage[2] = "".LAN_ERROR_26.""; + $emessage[3] = "".LAN_ERROR_27.""; + $emessage[4] = "".LAN_ERROR_28.""; + $emessage[5] = LAN_ERROR_29; + $emessage[6] = "".LAN_ERROR_30.""; + $emessage[7] = "".LAN_ERROR_31.""; + $emessage[8] = " +
    ".LAN_ERROR_32."

    + ".chr(36)."ADMIN_DIRECTORY = \"e107_admin/\";
    + ".chr(36)."FILES_DIRECTORY = \"e107_files/\";
    + ".chr(36)."IMAGES_DIRECTORY = \"e107_images/\";
    + ".chr(36)."THEMES_DIRECTORY = \"e107_themes/\";
    + ".chr(36)."PLUGINS_DIRECTORY = \"e107_plugins/\";
    + ".chr(36)."HANDLERS_DIRECTORY = \"e107_handlers/\";
    + ".chr(36)."LANGUAGES_DIRECTORY = \"e107_languages/\";
    + ".chr(36)."HELP_DIRECTORY = \"e107_docs/help/\";
    + ".chr(36)."DOWNLOADS_DIRECTORY = \"e107_files/downloads/\";\n +
    "; + + if (class_exists('e107table')) { + $ns = new e107table; + } + switch($mode) { + case "CRITICAL_ERROR": + $message = $emessage[$message] ? $emessage[$message] : $message; + echo "
    CRITICAL_ERROR:
    Line $line $file

    Error reported as: ".$message."
    "; + break; + + case "MESSAGE": + if(strstr(e_SELF, "forum_post.php")) + { + return; + } + $ns->tablerender("", "
    {$message}
    "); + break; + + case "ADMIN_MESSAGE": + $ns->tablerender("Admin Message", "
    {$message}
    "); + break; + + case "ALERT": + $message = $emessage[$message] ? $emessage[$message] : $message; + echo "\n"; exit; + break; + + case "P_ALERT": + echo "\n"; + break; + + case "POPUP": + + $mtext = "Message
    --- Message ---

    ".$message."

    "; + + echo " + "; + + break; + + } +} + +?> diff --git a/e107_handlers/mysql_class.php b/e107_handlers/mysql_class.php new file mode 100644 index 000000000..3a27b3e42 --- /dev/null +++ b/e107_handlers/mysql_class.php @@ -0,0 +1,734 @@ +BumpWho('Create db object', 1); + $langid = 'e107language_'.$pref['cookie_name']; + if ($pref['user_tracking'] == 'session') { + if (!isset($_SESSION[$langid])) { return; } + $this->mySQLlanguage = $_SESSION[$langid]; + } else { + if (!isset($_COOKIE[$langid])) { return; } + $this->mySQLlanguage = $_COOKIE[$langid]; + } + } + + /** + * @return null or string error code + * @param string $mySQLserver IP Or hostname of the MySQL server + * @param string $mySQLuser MySQL username + * @param string $mySQLpassword MySQL Password + * @param string $mySQLdefaultdb The database schema to connect to + * @desc Connects to mySQL server and selects database - generally not required if your table is in the main DB.
    + *
    + * Example using e107 database with variables defined in config.php:
    + * $sql = new db; + * $sql->db_Connect($mySQLserver, $mySQLuser, $mySQLpassword, $mySQLdefaultdb); + *
    + * OR to connect an other database:
    + * $sql = new db; + * $sql->db_Connect('url_server_database', 'user_database', 'password_database', 'name_of_database'); + * + * @access public + */ + function db_Connect($mySQLserver, $mySQLuser, $mySQLpassword, $mySQLdefaultdb) { + global $eTraffic; + $eTraffic->BumpWho('db Connect', 1); + + $this->mySQLserver = $mySQLserver; + $this->mySQLuser = $mySQLuser; + $this->mySQLpassword = $mySQLpassword; + $this->mySQLdefaultdb = $mySQLdefaultdb; + + $temp = $this->mySQLerror; + $this->mySQLerror = FALSE; + if(defined("USE_PERSISTANT_DB") && USE_PERSISTANT_DB == true){ + if (!$this->mySQLaccess = @mysql_pconnect($this->mySQLserver, $this->mySQLuser, $this->mySQLpassword)) { + return 'e1'; + } else { + if (!@mysql_select_db($this->mySQLdefaultdb)) { + return 'e2'; + } else { + $this->dbError('dbConnect/SelectDB'); + } + } + } else { + if (!$this->mySQLaccess = @mysql_connect($this->mySQLserver, $this->mySQLuser, $this->mySQLpassword)) { + return 'e1'; + } else { + if (!@mysql_select_db($this->mySQLdefaultdb)) { + return 'e2'; + } else { + $this->dbError('dbConnect/SelectDB'); + } + } + } + } + + /** + * @return void + * @param unknown $sMarker + * @desc Enter description here... + * @access private + */ + function db_Mark_Time($sMarker) { + if (E107_DEBUG_LEVEL > 0) { + global $db_debug; + $db_debug->Mark_Time($sMarker); + } + } + + /** + * @return void + * @desc Enter description here... + * @access private + */ + function db_Show_Performance() { + return $db_debug->Show_Performance(); + } + + /** + * @return void + * @desc add query to dblog table + * @access private + */ + function db_Write_log($log_type = '', $log_remark = '', $log_query = '') { + global $tp, $e107; + $d = time(); + $uid = (USER) ? USERID : '0'; + $ip = $e107->getip(); + $qry = $tp->toDB($log_query); + $this->db_Insert('dblog', "0, '{$log_type}', {$d}, {$uid}, '{$ip}', '{$qry}', '{$log_remark}'"); + } + + /** + * @return unknown + * @param unknown $query + * @param unknown $rli + * @desc Enter description here... + * @access private + */ + function db_Query($query, $rli = NULL, $qry_from = '', $debug = FALSE, $log_type = '', $log_remark = '') { + global $db_time,$db_mySQLQueryCount,$queryinfo, $eTraffic; + $db_mySQLQueryCount++; + + if ($debug == 'now') { + echo "** $query"; + } + if ($debug !== FALSE || strstr(e_QUERY, 'showsql')) + { + $queryinfo[] = "{$qry_from}: $query"; + } + if ($log_type != '') { + $this->db_Write_log($log_type, $log_remark, $query); + } + + $b = microtime(); + $sQryRes = is_null($rli) ? @mysql_query($query) : @mysql_query($query, $rli); + $e = microtime(); + + $eTraffic->Bump('db_Query', $b, $e); + $mytime = $eTraffic->TimeDelta($b,$e); + $db_time += $mytime; + $this->mySQLresult = $sQryRes; + if (E107_DEBUG_LEVEL) { + global $db_debug; + $aTrace = debug_backtrace(); + $pTable = $this->mySQLcurTable; + if (!strlen($pTable)) { + $pTable = '(complex query)'; + } else { + $this->mySQLcurTable = ''; // clear before next query + } + if(is_object($db_debug)) { + $nFields = $db_debug->Mark_Query($query, $rli, $sQryRes, $aTrace, $mytime, $pTable); + } else { + echo "what happened to db_debug??!!
    "; + } + } + return $sQryRes; + } + + /** + * @return int Number of rows or false on error + * + * @param string $table Table name to select data from + * @param string $fields Table fields to be retrieved, default * (all in table) + * @param string $arg Query arguments, default null + * @param string $mode Argument has WHERE or not, default=default (WHERE) + * + * @param bool $debug Debug mode on or off + * + * @desc Perform a mysql_query() using the arguments suplied by calling db::db_Query()
    + *
    + * If you need more requests think to call the class.
    + *
    + * Example using a unique connection to database:
    + * $sql->db_Select("comments", "*", "comment_item_id = '$id' AND comment_type = '1' ORDER BY comment_datestamp");
    + *
    + * OR as second connection:
    + * $sql2 = new db; + * $sql2->db_Select("chatbox", "*", "ORDER BY cb_datestamp DESC LIMIT $from, ".$view, 'no_where'); + * + * @access public + */ + function db_Select($table, $fields = '*', $arg = '', $mode = 'default', $debug = FALSE, $log_type = '', $log_remark = '') { + global $db_mySQLQueryCount; + $table = $this->db_IsLang($table); + $this->mySQLcurTable = $table; + if ($arg != '' && $mode == 'default') + { + if ($this->mySQLresult = $this->db_Query('SELECT '.$fields.' FROM '.MPREFIX.$table.' WHERE '.$arg, NULL, 'db_Select', $debug, $log_type, $log_remark)) { + $this->dbError('dbQuery'); + return $this->db_Rows(); + } else { + $this->dbError("db_Select (SELECT $fields FROM ".MPREFIX."{$table} WHERE {$arg})"); + return FALSE; + } + } elseif ($arg != '' && $mode != 'default') { + if ($this->mySQLresult = $this->db_Query('SELECT '.$fields.' FROM '.MPREFIX.$table.' '.$arg, NULL, 'db_Select', $debug, $log_type, $log_remark)) { + $this->dbError('dbQuery'); + return $this->db_Rows(); + } else { + $this->dbError("db_Select (SELECT {$fields} FROM ".MPREFIX."{$table} {$arg})"); + return FALSE; + } + } else { + if ($this->mySQLresult = $this->db_Query('SELECT '.$fields.' FROM '.MPREFIX.$table, NULL, 'db_Select', $debug, $log_type, $log_remark)) { + $this->dbError('dbQuery'); + return $this->db_Rows(); + } else { + $this->dbError("db_Select (SELECT {$fields} FROM ".MPREFIX."{$table})"); + return FALSE; + } + } + } + + /** + * @return int Last insert ID or false on error + * @param string $table + * @param string $arg + * @param string $debug + * @desc Insert a row into the table
    + *
    + * Example:
    + * $sql->db_Insert("links", "0, 'News', 'news.php', '', '', 1, 0, 0, 0"); + * + * @access public + */ + function db_Insert($table, $arg, $debug = FALSE, $log_type = '', $log_remark = '') { + $table = $this->db_IsLang($table); + $this->mySQLcurTable = $table; + if(is_array($arg)) + { + foreach($arg as $k => $v) + { + $keyList .= ($keyList ? ",`{$k}`" : "`{$k}`"); + $valList .= ($valList ? ",'{$v}'" : "'{$v}'"); + } + $query = "INSERT INTO `".MPREFIX."{$table}` ({$keyList}) VALUES ({$valList})"; + } + else + { + $query = 'INSERT INTO '.MPREFIX."{$table} VALUES ({$arg})"; + } + + if ($result = $this->mySQLresult = $this->db_Query($query, NULL, 'db_Insert', $debug, $log_type, $log_remark )) { + $tmp = mysql_insert_id(); + return $tmp; + } else { + $this->dbError("db_Insert ($query)"); + return FALSE; + } + } + + /** + * @return int number of affected rows, or false on error + * @param string $table + * @param string $arg + * @param bool $debug + * @desc Update fields in ONE table of the database corresponding to your $arg variable
    + *
    + * Think to call it if you need to do an update while retrieving data.
    + *
    + * Example using a unique connection to database:
    + * $sql->db_Update("user", "user_viewed='$u_new' WHERE user_id='".USERID."' "); + *
    + * OR as second connection
    + * $sql2 = new db; + * $sql2->db_Update("user", "user_viewed = '$u_new' WHERE user_id = '".USERID."' ");
    + * + * @access public + */ + function db_Update($table, $arg, $debug = FALSE, $log_type = '', $log_remark = '') { + $table = $this->db_IsLang($table); + $this->mySQLcurTable = $table; + if ($result = $this->mySQLresult = $this->db_Query('UPDATE '.MPREFIX.$table.' SET '.$arg, NULL, 'db_Update', $debug, $log_type, $log_remark)) { + $result = mysql_affected_rows(); + return $result; + } else { + $this->dbError("db_Update ($query)"); + return FALSE; + } + } + + /** + * @return array MySQL row + * @param string $mode + * @desc Fetch an array containing row data (see PHP's mysql_fetch_array() docs)
    + *
    + * Example :
    + * while($row = $sql->db_Fetch()){ + * $text .= $row['username']; + * } + * + * @access public + */ + function db_Fetch() { + global $eTraffic; + $b = microtime(); + $row = @mysql_fetch_array($this->mySQLresult); + $eTraffic->Bump('db_Fetch', $b); + if ($row) { + $this->dbError('db_Fetch'); + return $row; + } else { + $this->dbError('db_Fetch'); + return FALSE; + + } + } + + /** + * @return int number of affected rows or false on error + * @param string $table + * @param string $fields + * @param string $arg + * @desc Count the number of rows in a select
    + *
    + * Example:
    + * $topics = $sql->db_Count("forum_t", "(*)", " WHERE thread_forum_id='".$forum_id."' AND thread_parent='0' "); + * + * @access public + */ + function db_Count($table, $fields = '(*)', $arg = '', $debug = FALSE, $log_type = '', $log_remark = '') { + $table = $this->db_IsLang($table); + + if ($fields == 'generic') { + $query=$table; + if ($this->mySQLresult = $this->db_Query($query, NULL, 'db_Count', $debug, $log_type, $log_remark)) { + $rows = $this->mySQLrows = @mysql_fetch_array($this->mySQLresult); + return $rows['COUNT(*)']; + } else { + $this->dbError("dbCount ($query)"); + return FALSE; + } + } + + $this->mySQLcurTable = $table; + $query='SELECT COUNT'.$fields.' FROM '.MPREFIX.$table.' '.$arg; + if ($this->mySQLresult = $this->db_Query($query, NULL, 'db_Count', $debug, $log_type, $log_remark)) { + $rows = $this->mySQLrows = @mysql_fetch_array($this->mySQLresult); + return $rows[0]; + } else { + $this->dbError("dbCount ($query)"); + return FALSE; + } + } + + /** + * @return void + * @desc Closes the mySQL server connection.
    + *
    + * Only required if you open a second connection.
    + * Native e107 connection is closed in the footer.php file
    + *
    + * Example :
    + * $sql->db_Close(); + * + * @access public + */ + function db_Close() { + global $eTraffic; + $eTraffic->BumpWho('db Close', 1); + mysql_close(); + $this->dbError('dbClose'); + } + + /** + * @return int number of affected rows, or false on error + * @param string $table + * @param string $arg + * @desc Delete rows from a table
    + *
    + * Example: + * $sql->db_Delete("tmp", "tmp_ip='$ip'");
    + *
    + * @access public + */ + function db_Delete($table, $arg = '', $debug = FALSE, $log_type = '', $log_remark = '') { + $table = $this->db_IsLang($table); + $this->mySQLcurTable = $table; + if (!$arg) { + if ($result = $this->mySQLresult = $this->db_Query('DELETE FROM '.MPREFIX.$table, NULL, 'db_Delete', $debug, $log_type, $log_remark)) { + return $result; + } else { + $this->dbError("db_Delete ($arg)"); + return FALSE; + } + } else { + if ($result = $this->mySQLresult = $this->db_Query('DELETE FROM '.MPREFIX.$table.' WHERE '.$arg, NULL, 'db_Delete', $debug, $log_type, $log_remark)) { + $tmp = mysql_affected_rows(); + return $tmp; + } else { + $this->dbError('db_Delete ('.$arg.')'); + return FALSE; + } + } + } + + /** + * @return unknown + * @desc Enter description here... + * @access private + */ + function db_Rows() { + $rows = $this->mySQLrows = @mysql_num_rows($this->mySQLresult); + return $rows; + $this->dbError('db_Rows'); + } + + /** + * @return unknown + * @param unknown $from + * @desc Enter description here... + * @access private + */ + function dbError($from) { + if ($error_message = @mysql_error()) { + if ($this->mySQLerror == TRUE) { + message_handler('ADMIN_MESSAGE', 'mySQL Error! Function: '.$from.'. ['.@mysql_errno().' - '.$error_message.']', __LINE__, __FILE__); + return $error_message; + } + } + } + + /** + * @return void + * @param unknown $mode + * @desc Enter description here... + * @access private + */ + function db_SetErrorReporting($mode) { + $this->mySQLerror = $mode; + } + + + /** + * @return unknown + * @param unknown $arg + * @desc Enter description here... + * @access private + */ + function db_Select_gen($query, $debug = FALSE, $log_type = '', $log_remark = '') { + + /* + changes by jalist 19/01/05: + added string replace on table prefix to tidy up long database queries + usage: instead of sending "SELECT * FROM ".MPREFIX."table", do "SELECT * FROM #table" + */ + + $this->tabset = FALSE; + if(strpos($query,'#') !== FALSE) { + $query = preg_replace_callback("/\s#([\w]*?)\W/", array($this, 'ml_check'), $query); + } + if ($this->mySQLresult = $this->db_Query($query, NULL, 'db_Select_gen', $debug, $log_type, $log_remark)) { + $this->dbError('db_Select_gen'); + return $this->db_Rows(); + } else { + $this->dbError('dbQuery ('.$query.')'); + return FALSE; + } + } + + function ml_check($matches) { + $table = $this->db_IsLang($matches[1]); + if($this->tabset == false) { + $this->mySQLcurTable = $table; + $this->tabset = true; + } + return " ".MPREFIX.$table.substr($matches[0],-1); + } + + /** + * @return unknown + * @param unknown $offset + * @desc Enter description here... + * @access private + */ + function db_Fieldname($offset) { + $result = @mysql_field_name($this->mySQLresult, $offset); + return $result; + } + + /** + * @return unknown + * @desc Enter description here... + * @access private + */ + function db_Field_info() { + $result = @mysql_fetch_field($this->mySQLresult); + return $result; + } + + /** + * @return unknown + * @desc Enter description here... + * @access private + */ + function db_Num_fields() { + $result = @mysql_num_fields($this->mySQLresult); + return $result; + } + + /** + * @return unknown + * @param unknown $table + * @desc Enter description here... + * @access private + */ + function db_IsLang($table,$multiple=FALSE) { + global $pref, $mySQLtablelist; + if ((!$this->mySQLlanguage || !$pref['multilanguage']) && $multiple==FALSE) { + return $table; + } + + if (!$mySQLtablelist) { + $tablist = mysql_list_tables($this->mySQLdefaultdb); + while (list($temp) = mysql_fetch_array($tablist)) { + $mySQLtablelist[] = $temp; + } + } + + $mltable = "lan_".strtolower($this->mySQLlanguage.'_'.$table); + + // ---- Find all multi-language tables. + + if($multiple == TRUE){ // return an array of all matching language tables. eg [french]->e107_lan_news + if(!is_array($table)){ + $table = array($table); + } + + foreach($mySQLtablelist as $tab){ + if(stristr($tab, MPREFIX."lan_") !== FALSE){ + $tmp = explode("_",str_replace(MPREFIX."lan_","",$tab)); + $lng = $tmp[0]; + foreach($table as $t){ + if(eregi($t."$",$tab)){ + $lanlist[$lng][MPREFIX.$t] = $tab; + } + } + } + } + return ($lanlist) ? $lanlist : FALSE; + } + // ------------------------- + + if (in_array(MPREFIX.$mltable, $mySQLtablelist)) { + return $mltable; + } + return $table; + } + + /** + * @return array + * @param string fields to retrieve + * @desc returns fields as structured array + * @access public + */ + function db_getList($fields = 'ALL', $amount = FALSE, $maximum = FALSE, $ordermode=FALSE) { + $list = array(); + $counter = 1; + while ($row = $this->db_Fetch()) { + foreach($row as $key => $value) { + if (is_string($key)) { + if (strtoupper($fields) == 'ALL' || in_array ($key, $fields)) { + + if(!$ordermode) + { + $list[$counter][$key] = $value; + } + else + { + $list[$row[$ordermode]][$key] = $value; + } + } + } + } + if ($amount && $amount == $counter || ($maximum && $counter > $maximum)) { + break; + } + $counter++; + } + return $list; + } + + /** + * @return integer + * @desc returns total number of queries made so far + * @access public + */ + function db_QueryCount() { + global $db_mySQLQueryCount; + return $db_mySQLQueryCount; + } + + + /* + Multi-language Query Function. + */ + + + function db_Query_all($query,$debug=""){ + $error = ""; + + $query = str_replace("#",MPREFIX,$query); + + if(!$this->db_Query($query)){ // run query on the default language first. + $error .= $query. " failed"; + } + + $tmp = explode(" ",$query); + foreach($tmp as $val){ + if(strpos($val,MPREFIX) !== FALSE){ + $table[] = str_replace(MPREFIX,"",$val); + $search[] = $val; + } + } + + // Loop thru relevant language tables and replace each tablename within the query. + if($tablist = $this->db_IsLang($table,TRUE)){ + foreach($tablist as $key=>$tab){ + $querylan = $query; + foreach($search as $find){ + $lang = $key; + $replace = ($tab[$find] !="") ? $tab[$find] : $find; + $querylan = str_replace($find,$replace,$querylan); + } + + if(!$this->db_Query($querylan)){ // run query on other language tables. + $error .= $querylan." failed for language"; + } + if($debug){ echo "
    ** lang= ".$querylan; } + } + } + + + return ($error)? FALSE : TRUE; + } + + // Determines if a plugin field (and key) exist. OR if fieldid is numeric - return the field name in that position. + function db_Field($table,$fieldid="",$key=""){ + if(!$this->mySQLdefaultdb){ + global $mySQLdefaultdb; + $this->mySQLdefaultdb = $mySQLdefaultdb; + } + $convert = array("PRIMARY"=>"PRI","INDEX"=>"MUL","UNIQUE"=>"UNI"); + $key = ($convert[$key]) ? $convert[$key] : "OFF"; + + $result = mysql_query("SHOW COLUMNS FROM ".MPREFIX.$table); + if (mysql_num_rows($result) > 0) { + $c=0; + while ($row = mysql_fetch_assoc($result)) { + if(is_numeric($fieldid)) + { + if($c == $fieldid) + { + return $row['Field']; // field number matches. + } + } + else + { + if(($key == "") && ($fieldid == $row['Field'])) + { + return TRUE; // key not in use, but field matches. + } + elseif(($fieldid == $row['Field']) && $key == $row['Key']) + { + return TRUE; + } + + } + $c++; + } + } + + return FALSE; + + } + + /** + * A pointer to mysql_real_escape_string() - see http://www.php.net/mysql_real_escape_string + * + * @param string $data + * @return string + */ + function escape($data, $strip = true) { + if ($strip) { + $data = strip_if_magic($data); + } + return mysql_real_escape_string($data); + } +} + +?> \ No newline at end of file diff --git a/e107_handlers/news_class.php b/e107_handlers/news_class.php new file mode 100644 index 000000000..5b762374d --- /dev/null +++ b/e107_handlers/news_class.php @@ -0,0 +1,203 @@ +toDB($news['news_title']); + $news['news_body'] = $tp->toDB($news['data']); + $news['news_extended'] = $tp->toDB($news['news_extended']); + $news['news_summary'] = $tp->toDB($news['news_summary']); + $news['news_userid'] = ($news['news_userid']) ? $news['news_userid'] : USERID; + if(!isset($news['news_sticky'])) {$news['news_sticky'] = 0;} + $author_insert = ($news['news_author'] == 0) ? "news_author = '".USERID."'," : ""; + $news['news_author'] = ($news['news_author']) ? $news['news_author'] : USERID; + + if ($news['news_id']) { + $vals = "news_datestamp = '".intval($news['news_datestamp'])."', ".$author_insert." news_title='".$news['news_title']."', news_body='".$news['news_body']."', news_extended='".$news['news_extended']."', news_category='".intval($news['cat_id'])."', news_allow_comments='".intval($news['news_allow_comments'])."', news_start='".intval($news['news_start'])."', news_end='".intval($news['news_end'])."', news_class='".$tp->toDB($news['news_class'])."', news_render_type='".intval($news['news_rendertype'])."' , news_summary='".$news['news_summary']."', news_thumbnail='".$tp->toDB($news['news_thumbnail'])."', news_sticky='".intval($news['news_sticky'])."' WHERE news_id='".intval($news['news_id'])."' "; + if ($sql -> db_Update('news', $vals)) { + $e_event -> trigger('newsupd', $news); + $message = LAN_NEWS_21; + $e107cache -> clear('news.php'); + } else { + $message = "".(!mysql_errno() ? LAN_NEWS_46 : LAN_NEWS_5).""; + } + } else { + if ($sql ->db_Insert('news', "0, '".$news['news_title']."', '".$news['news_body']."', '".$news['news_extended']."', ".intval($news['news_datestamp']).", ".intval($news['news_author']).", '".intval($news['cat_id'])."', '".intval($news['news_allow_comments'])."', '".intval($news['news_start'])."', '".intval($news['news_end'])."', '".$tp->toDB($news['news_class'])."', '".intval($news['news_rendertype'])."', '0' , '".$news['news_summary']."', '".$tp->toDB($news['news_thumbnail'])."', '".intval($news['news_sticky'])."' ")) { + $e_event -> trigger('newspost', $news); + $message = LAN_NEWS_6; + $e107cache -> clear('news.php'); + } else { + $message = "".LAN_NEWS_7.""; + } + } + + /* trackback */ + if($pref['trackbackEnabled']) + { + $excerpt = substr($news['news_body'], 0, 100)."..."; + $id=mysql_insert_id(); + $permLink = $e107->base_path."comment.php?comment.news.{$id}"; + + require_once(e_PLUGIN."trackback/trackbackClass.php"); + $trackback = new trackbackClass(); + + if($_POST['trackback_urls']) + { + $urlArray = explode("\n", $_POST['trackback_urls']); + foreach($urlArray as $pingurl) { + if(!$error = $trackback -> sendTrackback($permLink, $pingurl, $news['news_title'], $excerpt)) + { + $message .= "
    successfully pinged {$pingurl}."; + } else { + $message .= "
    was unable to ping {$pingurl}
    [ Error message returned was : '{$error}'. ]"; + } + } + } + + if(isset($_POST['pingback_urls'])) + { + if ($urlArray = $trackback -> getPingUrls($news['news_body'])) + { + foreach($urlArray as $pingurl) + { + + if ($trackback -> sendTrackback($permLink, $pingurl, $news['news_title'], $excerpt)) + { + $message .= "
    successfully pinged {$pingurl}."; + } + else + { + $message .= "Pingback to {$pingurl} failed ..."; + } + } + } + else + { + $message .= "
    No pingback addresses were discovered"; + } + } + } + + /* end trackback */ + + return $message; + } + + function render_newsitem($news, $mode = 'default', $n_restrict = '', $NEWS_TEMPLATE = '', $param='') { + global $tp, $sql, $override, $pref, $ns, $NEWSSTYLE, $NEWSLISTSTYLE, $news_shortcodes, $loop_uid; + if ($override_newsitem = $override -> override_check('render_newsitem')) { + $result = call_user_func($override_newsitem, $news, $mode, $n_restrict, $NEWS_TEMPLATE, $param); + if ($result == 'return') { + return; + } + } + if (!is_object($tp)) $tp = new e_parse; + + if ($n_restrict == 'userclass') { + $news['news_id'] = 0; + $news['news_title'] = LAN_NEWS_1; + $news['data'] = LAN_NEWS_2; + $news['news_extended'] = ""; + $news['news_allow_comments'] = 1; + $news['news_start'] = 0; + $news['news_end'] = 0; + $news['news_render_type'] = 0; + $news['comment_total'] = 0; + } + + if (!$param) { + if (!defined("IMAGE_nonew_small")){ + define("IMAGE_nonew_small", (file_exists(THEME."images/nonew_comments.png") ? " " : "")); + } + if (!defined("IMAGE_new_small")) { + define("IMAGE_new_small", (file_exists(THEME."images/new_comments.png") ? " " : " ")); + } + if (!defined("IMAGE_sticky")){ + define("IMAGE_sticky", (file_exists(THEME."images/sticky.png") ? " " : " ")); + } + + $param['image_nonew_small'] = IMAGE_nonew_small; + $param['image_new_small'] = IMAGE_new_small; + $param['image_sticky'] = IMAGE_sticky; + $param['caticon'] = ICONSTYLE; + $param['commentoffstring'] = COMMENTOFFSTRING; + $param['commentlink'] = COMMENTLINK; + $param['trackbackstring'] = (defined("TRACKBACKSTRING") ? TRACKBACKSTRING : ""); + $param['trackbackbeforestring'] = (defined("TRACKBACKBEFORESTRING") ? TRACKBACKBEFORESTRING : ""); + $param['trackbackafterstring'] = (defined("TRACKBACKAFTERSTRING") ? TRACKBACKAFTERSTRING : ""); + $param['itemlink'] = (defined("NEWSLIST_ITEMLINK")) ? NEWSLIST_ITEMLINK : ""; + $param['thumbnail'] =(defined("NEWSLIST_THUMB")) ? NEWSLIST_THUMB : "border:0px"; + $param['catlink'] = (defined("NEWSLIST_CATLINK")) ? NEWSLIST_CATLINK : ""; + $param['caticon'] = (defined("NEWSLIST_CATICON")) ? NEWSLIST_CATICON : ICONSTYLE; + } + + cachevars('current_news_item', $news); + cachevars('current_news_param', $param); + + if ($news['news_render_type'] == 1 && $mode != "extend") { + if (function_exists("news_list")) { + $NEWS_PARSE = news_list($news); + } else if ($NEWSLISTSTYLE) { + $NEWS_PARSE = $NEWSLISTSTYLE; + } else { + $NEWS_PARSE = "{NEWSICON} {NEWSTITLELINK}
    {NEWSAUTHOR} ".LAN_NEWS_100." {NEWSDATE} | {NEWSCOMMENTS}
    "; + } + } else { + if ($NEWS_TEMPLATE) { + $NEWS_PARSE = $NEWS_TEMPLATE; + } else { + if (function_exists("news_style")) { + $NEWS_PARSE = news_style($news); + } else { + $NEWS_PARSE = $NEWSSTYLE; + } + } + } + $loop_uid = $news['news_author']; + + require_once(e_FILE.'shortcode/batch/news_shortcodes.php'); + $text = $tp -> parseTemplate($NEWS_PARSE, TRUE, $news_shortcodes); + + if ($mode == 'return') { + return $text; + } else { + echo $text; + return TRUE; + } + } + + function make_xml_compatible($original) { + global $tp, $ml; + if (!is_object($tp)) $tp = new e_parse; + $original = $tp->toHTML($original, TRUE); + $original = str_replace('£', '&#163;', $original); + $original = str_replace('©', '(c)', $original); + return htmlspecialchars($original); + } +} + +?> diff --git a/e107_handlers/notify_class.php b/e107_handlers/notify_class.php new file mode 100644 index 000000000..fcc6ca831 --- /dev/null +++ b/e107_handlers/notify_class.php @@ -0,0 +1,158 @@ + notify_prefs = $sysprefs -> get('notify_prefs'); + $this -> notify_prefs = $eArrayStorage -> ReadArray($this -> notify_prefs); + foreach ($this -> notify_prefs['event'] as $id => $status) { + if ($status['type'] != 'off') { + $e_event -> register($id, 'notify_'.$id); + } + } + + if(defined("e_LANGUAGE") && is_readable(e_LANGUAGEDIR.e_LANGUAGE.'/lan_notify.php')) { + include_once(e_LANGUAGEDIR.e_LANGUAGE.'/lan_notify.php'); + } else { + include_once(e_LANGUAGEDIR.'English/lan_notify.php'); + } + } + + function send($id, $subject, $message) { + global $sql,$tp; + e107_require_once(e_HANDLER.'mail.php'); + $subject = SITENAME.': '.$subject; + if ($this -> notify_prefs['event'][$id]['type'] == 'main') { + sendemail(SITEADMINEMAIL, $tp->toEmail($subject), $tp->toEmail($message)); + } else if ($this -> notify_prefs['event'][$id]['type'] == 'class') { + if ($this -> notify_prefs['event'][$id]['class'] == '254') { + $sql -> db_Select('user', 'user_email', "user_admin = 1"); + } else if ($this -> notify_prefs['event'][$id]['class'] == '253') { + $sql -> db_Select('user', 'user_email'); + } else { + $sql -> db_Select('user', 'user_email', "user_class REGEXP '(^|,)(".$this -> notify_prefs['event'][$id]['class'].")(,|$)'"); + } + while ($email = $sql -> db_Fetch()) { + sendemail($email['user_email'], $tp->toEmail($subject), $tp->toEmail($message)); + } + } else if ($this -> notify_prefs['event'][$id]['type'] == 'email') { + sendemail($this -> notify_prefs['event'][$id]['email'], $tp->toEmail($subject), $tp->toEmail($message)); + } + } +} + +global $nt; +$nt = new notify; + +function notify_usersup($data) { + global $nt; + foreach ($data as $key => $value) + { + if($key != "password1" && $key != "password2" && $key != "email_confirm" && $key != "register") + { + if(is_array($value)) // show user-extended values. + { + foreach($value as $k => $v) + { + $message .= str_replace("user_","",$k).': '.$v.'
    '; + } + } + else + { + $message .= $key.': '.$value.'
    '; + } + } + } + $nt -> send('usersup', NT_LAN_US_1, $message); +} + +function notify_userveri($data) { + global $nt, $e107; + $msgtext = NT_LAN_UV_2.$data['user_id']."\n"; + $msgtext .= NT_LAN_UV_3.$data['user_loginname']."\n"; + $msgtext .= NT_LAN_UV_2.$e107->getip(); + $nt -> send('userveri', NT_LAN_UV_1, $msgtext); +} + +function notify_login($data) { + global $nt; + foreach ($data as $key => $value) { + $message .= $key.': '.$value.'
    '; + } + $nt -> send('login', NT_LAN_LI_1, $message); +} + +function notify_logout() { + global $nt; + $nt -> send('logout', NT_LAN_LO_1, USERID.'. '.USERNAME.' '.NT_LAN_LO_2); +} + +function notify_flood($data) { + global $nt; + $nt -> send('flood', NT_LAN_FL_1, NT_LAN_FL_2.': '.$data); +} + +function notify_subnews($data) { + global $nt,$tp; + foreach ($data as $key => $value) { + $message .= $key.': '.$value.'
    '; + } + $nt -> send('subnews', NT_LAN_SN_1, $message); +} + +function notify_newspost($data) { + global $nt; + $message = ''.$data['news_title'].'

    '.$data['news_summary'].'

    '.$data['data'].'

    '.$data['news_extended']; + $nt -> send('newspost', $data['news_title'], $message); +} + +function notify_newsupd($data) { + global $nt; + $message = ''.$data['news_title'].'

    '.$data['news_summary'].'

    '.$data['data'].'

    '.$data['news_extended']; + $nt -> send('newsupd', NT_LAN_NU_1.': '.$data['news_title'], $message); +} + +function notify_newsdel($data) { + global $nt; + $nt -> send('newsdel', NT_LAN_ND_1, NT_LAN_ND_2.': '.$data); +} + + +function notify_fileupload($data) { + global $nt; + $message = ''.$data['upload_name'].'

    '.$data['upload_description'].'

    '.$data['upload_size'].'

    '.$data['upload_user']; + $nt -> send('fileupload', $data['upload_name'], $message); +} + +if (isset($nt -> notify_prefs['plugins'])) { + foreach ($nt -> notify_prefs['plugins'] as $plugin_id => $plugin_settings) { + if(is_readable(e_PLUGIN.$plugin_id.'/e_notify.php')) + { + require_once(e_PLUGIN.$plugin_id.'/e_notify.php'); + } + } +} + +?> diff --git a/e107_handlers/np_class.php b/e107_handlers/np_class.php new file mode 100644 index 000000000..aea81114c --- /dev/null +++ b/e107_handlers/np_class.php @@ -0,0 +1,99 @@ + $view) { + $pages = ceil($total / $view); + } else { + $pages = FALSE; + } + + if ($pages) { + $nppage = NP_3." "; + if ($pages > 10) { + $current = ($from/$view)+1; + + for($c = 0; $c <= 2; $c++) { + $nppage .= ($view * $c == $from ? "[".($c + 1)."] " : "".($c + 1)." "); + } + + if ($current >= 3 && $current <= 5) { + for($c = 3; $c <= $current; $c++) { + $nppage .= ($view * $c == $from ? "[".($c+1)."] " : "".($c + 1)." "); + } + } + else if($current >= 6 && $current <= ($pages-5)) { + $nppage .= " ... "; + for($c = ($current-2); $c <= $current; $c++) { + $nppage .= ($view * $c == $from ? "[".($c+1)."] " : "".($c + 1)." "); + } + } + $nppage .= " ... "; + + + if (($current + 5) > $pages && $current != $pages) { + $tmp = ($current-2); + } else { + $tmp = $pages-3; + } + + for($c = $tmp; $c <= ($pages-1); $c++) { + $nppage .= ($view * $c == $from ? "[".($c + 1)."] " : "".($c + 1)." "); + } + + } else { + for($c = 0; $c < $pages; $c++) { + if ($view * $c == $from ? $nppage .= "[".($c + 1)."] " : $nppage .= "".($c + 1)." "); + } + } + $text = "
    {$nppage}
    \n

    \n"; + if($return == true){ + return $text; + } else { + echo $text; + return null; + } + } + } +} + +?> \ No newline at end of file diff --git a/e107_handlers/override_class.php b/e107_handlers/override_class.php new file mode 100644 index 000000000..266489621 --- /dev/null +++ b/e107_handlers/override_class.php @@ -0,0 +1,65 @@ +override_function('original_func_name','mynew_function_name',['optional_include_file_from_root']); + * + * In e107 code... + * if ($over_func_name = $override->override_check('original_func_name')) { + * $result=call_user_func($over_func_name, params...); + * } + * + */ + +class override { + var $functions = array(); + var $includes = array(); + + function override_function($override, $function, $include) { + if ($include) { + $this->includes[$override] = $include; + } + else if (isset($this->includes[$override])) { + unset($this->includes[$override]); + } + $this->functions[$override] = $function; + } + + function override_check($override) { + if (isset($this->includes[$override])) { + if (file_exists($this->includes[$override])) { + include_once($this->includes[$override]); + } + if (function_exists($this->functions[$override])) { + return $this->functions[$override]; + } else { + return false; + } + } else { + return false; + } + } +} + +?> \ No newline at end of file diff --git a/e107_handlers/parser_functions.php b/e107_handlers/parser_functions.php new file mode 100644 index 000000000..f6d9d477f --- /dev/null +++ b/e107_handlers/parser_functions.php @@ -0,0 +1,28 @@ + \ No newline at end of file diff --git a/e107_handlers/parser_handler.php b/e107_handlers/parser_handler.php new file mode 100644 index 000000000..c9622fb70 --- /dev/null +++ b/e107_handlers/parser_handler.php @@ -0,0 +1,69 @@ +db_Select("parser", "*", "parser_pluginname = '{$plugin_name}' AND parser_regexp = '{$regexp}'"); + if ($row = $oursql->db_Fetch()) { + // Already exists, handle error if needed. + } else { + $regexp = str_replace("\\" , "\\\\", $regexp); + $oursql->db_Insert("parser", "0, '{$plugin_name}', '{$regexp}'"); + return 1; + } + } else { + // handle error if wanted to - not a valid regexp + } + } else { + // handle error if wanted to - function does not exist + } + } else { + // handle error if wanted to - Unable to include file + } + } else { + // handle error if wanted to - plugin name or regexp value empty + } +} + +function IsRegExp($sREGEXP) { + $sPREVIOUSHANDLER = Set_Error_Handler("TrapError"); + Preg_Match ($sREGEXP, ""); + Restore_Error_Handler ($sPREVIOUSHANDLER); + Return !TrapError (); +} + +function TrapError () { + Static $iERRORES; + if (!Func_Num_Args()) { + $iRETORNO = $iERRORES; + $iERRORES = 0; + return $iRETORNO; + } else { + $iERRORES++; + } +} + +?> \ No newline at end of file diff --git a/e107_handlers/pclerror.lib.php b/e107_handlers/pclerror.lib.php new file mode 100644 index 000000000..0c19d642d --- /dev/null +++ b/e107_handlers/pclerror.lib.php @@ -0,0 +1,134 @@ +"; + $v_message .= "

    PclError Library has detected a fatal error on file '{$p_file}', line {$p_line}

    "; + $v_message .= "

    {$p_error_string}

    "; + $v_message .= ""; + die($v_message); + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclErrorReset() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function PclErrorReset() + { + global $g_pcl_error_string; + global $g_pcl_error_code; + + $g_pcl_error_code = 1; + $g_pcl_error_string = ""; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclErrorCode() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function PclErrorCode() + { + global $g_pcl_error_string; + global $g_pcl_error_code; + + return($g_pcl_error_code); + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclErrorString() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function PclErrorString() + { + global $g_pcl_error_string; + global $g_pcl_error_code; + + return($g_pcl_error_string." [code {$g_pcl_error_code}]"); + } + // -------------------------------------------------------------------------------- + + +// ----- End of double include look +} +?> diff --git a/e107_handlers/pcltar.lib.php b/e107_handlers/pcltar.lib.php new file mode 100644 index 000000000..899950992 --- /dev/null +++ b/e107_handlers/pcltar.lib.php @@ -0,0 +1,3559 @@ +"; + // -------------------------------------------------------------------------------- + function PclTarList($p_tarname, $p_mode="") + { + TrFctStart(__FILE__, __LINE__, "PclTarList", "tar={$p_tarname}, mode='{$p_mode}'"); + $v_result=1; + + // ----- Extract the tar format from the extension + if (($p_mode == "") || (($p_mode != "tar") && ($p_mode != "tgz"))) + { + if (($p_mode = PclTarHandleExtension($p_tarname)) == "") + { + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return 0; + } + } + + // ----- Call the extracting fct + $p_list = array(); + if (($v_result = PclTarHandleExtract($p_tarname, 0, $p_list, "list", "", $p_mode, "")) != 1) + { + unset($p_list); + TrFctEnd(__FILE__, __LINE__, 0, PclErrorString()); + return(0); + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $p_list); + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclTarExtract() + // Description : + // Extract all the files present in the archive $p_tarname, in the directory + // $p_path. The relative path of the archived files are keep and become + // relative to $p_path. + // If a file with the same name already exists it will be replaced. + // If the path to the file does not exist, it will be created. + // Depending on the $p_tarname extension (.tar, .tar.gz or .tgz) the + // function will determine the type of the archive. + // Parameters : + // $p_tarname : Name of an existing tar file. + // $p_path : Path where the files will be extracted. The files will use + // their memorized path from $p_path. + // If $p_path is "", files will be extracted in "./". + // $p_remove_path : Path to remove (from the file memorized path) while writing the + // extracted files. If the path does not match the file path, + // the file is extracted with its memorized path. + // $p_path and $p_remove_path are commulative. + // $p_mode : 'tar' or 'tgz', if not set, will be determined by $p_tarname extension + // Return Values : + // Same as PclTarList() + // -------------------------------------------------------------------------------- + function PclTarExtract($p_tarname, $p_path="./", $p_remove_path="", $p_mode="") + { + TrFctStart(__FILE__, __LINE__, "PclTarExtract", "tar='{$p_tarname}', path='{$p_path}', remove_path='{$p_remove_path}', mode='{$p_mode}'"); + $v_result=1; + + // ----- Extract the tar format from the extension + if (($p_mode == "") || (($p_mode!="tar") && ($p_mode!="tgz"))) + { + if (($p_mode = PclTarHandleExtension($p_tarname)) == "") + { + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return 0; + } + } + + // ----- Call the extracting fct + if (($v_result = PclTarHandleExtract($p_tarname, 0, &$p_list, "complete", $p_path, $v_tar_mode, $p_remove_path)) != 1) + { + TrFctEnd(__FILE__, __LINE__, 0, PclErrorString()); + return(0); + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $p_list); + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclTarExtractList() + // Description : + // Extract the files present in the archive $p_tarname and specified in + // $p_filelist, in the directory + // $p_path. The relative path of the archived files are keep and become + // relative to $p_path. + // If a directory is spcified in the list, all the files from this directory + // will be extracted. + // If a file with the same name already exists it will be replaced. + // If the path to the file does not exist, it will be created. + // Depending on the $p_tarname extension (.tar, .tar.gz or .tgz) the + // function will determine the type of the archive. + // Parameters : + // $p_tarname : Name of an existing tar file + // $p_filelist : An array containing file or directory names, or + // a string containing one filename or directory name, or + // a string containing a list of filenames and/or directory + // names separated by spaces. + // $p_path : Path where the files will be extracted. The files will use + // their memorized path from $p_path. + // If $p_path is "", files will be extracted in "./". + // $p_remove_path : Path to remove (from the file memorized path) while writing the + // extracted files. If the path does not match the file path, + // the file is extracted with its memorized path. + // $p_path and $p_remove_path are commulative. + // $p_mode : 'tar' or 'tgz', if not set, will be determined by $p_tarname extension + // Return Values : + // Same as PclTarList() + // -------------------------------------------------------------------------------- + function PclTarExtractList($p_tarname, $p_filelist, $p_path="./", $p_remove_path="", $p_mode="") + { + TrFctStart(__FILE__, __LINE__, "PclTarExtractList", "tar={$p_tarname}, list, path={$p_path}, remove_path='{$p_remove_path}', mode='{$p_mode}'"); + $v_result=1; + + // ----- Extract the tar format from the extension + if (($p_mode == "") || (($p_mode!="tar") && ($p_mode!="tgz"))) + { + if (($p_mode = PclTarHandleExtension($p_tarname)) == "") + { + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return 0; + } + } + + // ----- Look if the $p_filelist is really an array + if (is_array($p_filelist)) + { + // ----- Call the extracting fct + if (($v_result = PclTarHandleExtract($p_tarname, $p_filelist, &$p_list, "partial", $p_path, $v_tar_mode, $p_remove_path)) != 1) + { + TrFctEnd(__FILE__, __LINE__, 0, PclErrorString()); + return(0); + } + } + + // ----- Look if the $p_filelist is a string + else if (is_string($p_filelist)) + { + // ----- Create a list with the elements from the string + $v_list = explode(" ", $p_filelist); + + // ----- Call the extracting fct + if (($v_result = PclTarHandleExtract($p_tarname, $v_list, &$p_list, "partial", $p_path, $v_tar_mode, $p_remove_path)) != 1) + { + TrFctEnd(__FILE__, __LINE__, 0, PclErrorString()); + return(0); + } + } + + // ----- Invalid variable + else + { + // ----- Error log + PclErrorLog(-3, "Invalid variable type p_filelist"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return 0; + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $p_list); + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclTarExtractIndex() + // Description : + // Extract the files present in the archive $p_tarname and specified at + // the indexes in $p_index, in the directory + // $p_path. The relative path of the archived files are keep and become + // relative to $p_path. + // If a directory is specified in the list, the directory only is created. All + // the file stored in this archive for this directory + // are not extracted. + // If a file with the same name already exists it will be replaced. + // If the path to the file does not exist, it will be created. + // Depending on the $p_tarname extension (.tar, .tar.gz or .tgz) the + // function will determine the type of the archive. + // Parameters : + // $p_tarname : Name of an existing tar file + // $p_index : A single index (integer) or a string of indexes of files to + // extract. The form of the string is "0,4-6,8-12" with only numbers + // and '-' for range or ',' to separate ranges. No spaces or ';' + // are allowed. + // $p_path : Path where the files will be extracted. The files will use + // their memorized path from $p_path. + // If $p_path is "", files will be extracted in "./". + // $p_remove_path : Path to remove (from the file memorized path) while writing the + // extracted files. If the path does not match the file path, + // the file is extracted with its memorized path. + // $p_path and $p_remove_path are commulative. + // $p_mode : 'tar' or 'tgz', if not set, will be determined by $p_tarname extension + // Return Values : + // Same as PclTarList() + // -------------------------------------------------------------------------------- + function PclTarExtractIndex($p_tarname, $p_index, $p_path="./", $p_remove_path="", $p_mode="") + { + TrFctStart(__FILE__, __LINE__, "PclTarExtractIndex", "tar={$p_tarname}, index='{$p_index}', path={$p_path}, remove_path='{$p_remove_path}', mode='{$p_mode}'"); + $v_result=1; + + // ----- Extract the tar format from the extension + if (($p_mode == "") || (($p_mode!="tar") && ($p_mode!="tgz"))) + { + if (($p_mode = PclTarHandleExtension($p_tarname)) == "") + { + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return 0; + } + } + + // ----- Look if the $p_index is really an integer + if (is_integer($p_index)) + { + // ----- Call the extracting fct + if (($v_result = PclTarHandleExtractByIndexList($p_tarname, $p_index, &$p_list, $p_path, $p_remove_path, $v_tar_mode)) != 1) + { + TrFctEnd(__FILE__, __LINE__, 0, PclErrorString()); + return(0); + } + } + + // ----- Look if the $p_filelist is a string + else if (is_string($p_index)) + { + // ----- Call the extracting fct + if (($v_result = PclTarHandleExtractByIndexList($p_tarname, $p_index, &$p_list, $p_path, $p_remove_path, $v_tar_mode)) != 1) + { + TrFctEnd(__FILE__, __LINE__, 0, PclErrorString()); + return(0); + } + } + + // ----- Invalid variable + else + { + // ----- Error log + PclErrorLog(-3, "Invalid variable type {$p_index}"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return 0; + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $p_list); + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclTarDelete() + // Description : + // This function deletes from the archive $p_tarname the files which are listed + // in $p_filelist. $p_filelist can be a string with file names separated by + // spaces, or an array containing the file names. + // Parameters : + // $p_tarname : Name of an existing tar file + // $p_filelist : An array or a string containing file names to remove from the + // archive. + // $p_mode : 'tar' or 'tgz', if not set, will be determined by $p_tarname extension + // Return Values : + // List of the files which are kept in the archive (same format as PclTarList()) + // -------------------------------------------------------------------------------- + function PclTarDelete($p_tarname, $p_filelist, $p_mode="") + { + TrFctStart(__FILE__, __LINE__, "PclTarDelete", "tar='{$p_tarname}', list='{$p_filelist}', mode='{$p_mode}'"); + $v_result=1; + + // ----- Extract the tar format from the extension + if (($p_mode == "") || (($p_mode!="tar") && ($p_mode!="tgz"))) + { + if (($p_mode = PclTarHandleExtension($p_tarname)) == "") + { + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return 0; + } + } + + // ----- Look if the $p_filelist is really an array + if (is_array($p_filelist)) + { + // ----- Call the extracting fct + if (($v_result = PclTarHandleDelete($p_tarname, $p_filelist, &$p_list, $p_mode)) != 1) + { + TrFctEnd(__FILE__, __LINE__, 0, PclErrorString()); + return(0); + } + } + + // ----- Look if the $p_filelist is a string + else if (is_string($p_filelist)) + { + // ----- Create a list with the elements from the string + $v_list = explode(" ", $p_filelist); + + // ----- Call the extracting fct + if (($v_result = PclTarHandleDelete($p_tarname, $v_list, &$p_list, $p_mode)) != 1) + { + TrFctEnd(__FILE__, __LINE__, 0, PclErrorString()); + return(0); + } + } + + // ----- Invalid variable + else + { + // ----- Error log + PclErrorLog(-3, "Invalid variable type p_filelist"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return 0; + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $p_list); + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclTarUpdate() + // Description : + // This function updates the files in $p_filelist which are already in the + // $p_tarname archive with an older last modified date. If the file does not + // exist, it is added at the end of the archive. + // Parameters : + // $p_tarname : Name of an existing tar file + // $p_filelist : An array or a string containing file names to update from the + // archive. + // $p_mode : 'tar' or 'tgz', if not set, will be determined by $p_tarname extension + // Return Values : + // List of the files contained in the archive. The field status contains + // "updated", "not_updated", "added" or "ok" for the files not concerned. + // -------------------------------------------------------------------------------- + function PclTarUpdate($p_tarname, $p_filelist, $p_mode="", $p_add_dir="", $p_remove_dir="") + { + TrFctStart(__FILE__, __LINE__, "PclTarUpdate", "tar='{$p_tarname}', list='{$p_filelist}', mode='{$p_mode}'"); + $v_result=1; + + // ----- Extract the tar format from the extension + if (($p_mode == "") || (($p_mode!="tar") && ($p_mode!="tgz"))) + { + if (($p_mode = PclTarHandleExtension($p_tarname)) == "") + { + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return 0; + } + } + + // ----- Look if the $p_filelist is really an array + if (is_array($p_filelist)) + { + // ----- Call the extracting fct + if (($v_result = PclTarHandleUpdate($p_tarname, $p_filelist, &$p_list, $p_mode, $p_add_dir, $p_remove_dir)) != 1) + { + TrFctEnd(__FILE__, __LINE__, 0, PclErrorString()); + return(0); + } + } + + // ----- Look if the $p_filelist is a string + else if (is_string($p_filelist)) + { + // ----- Create a list with the elements from the string + $v_list = explode(" ", $p_filelist); + + // ----- Call the extracting fct + if (($v_result = PclTarHandleUpdate($p_tarname, $v_list, &$p_list, $p_mode, $p_add_dir, $p_remove_dir)) != 1) + { + TrFctEnd(__FILE__, __LINE__, 0, PclErrorString()); + return(0); + } + } + + // ----- Invalid variable + else + { + // ----- Error log + PclErrorLog(-3, "Invalid variable type p_filelist"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return 0; + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $p_list); + return $p_list; + } + // -------------------------------------------------------------------------------- + + + // -------------------------------------------------------------------------------- + // Function : PclTarMerge() + // Description : + // This function add the content of $p_tarname_add at the end of $p_tarname. + // Parameters : + // $p_tarname : Name of an existing tar file + // $p_tarname_add : Name of an existing tar file taht will be added at the end + // of $p_tarname. + // $p_mode : 'tar' or 'tgz', if not set, will be determined by $p_tarname extension + // $p_mode_add : 'tar' or 'tgz', if not set, will be determined by $p_tarname_add + // extension + // Return Values : + // List of the files contained in the archive. The field status contains + // "updated", "not_updated", "added" or "ok" for the files not concerned. + // -------------------------------------------------------------------------------- + function PclTarMerge($p_tarname, $p_tarname_add, $p_mode="", $p_mode_add="") + { + TrFctStart(__FILE__, __LINE__, "PclTarMerge", "tar='{$p_tarname}', tar_add='{$p_tarname_add}', mode='{$p_mode}', mode_add='{$p_mode_add}'"); + $v_result=1; + + // ----- Check the parameters + if (($p_tarname == "") || ($p_tarname_add == "")) + { + // ----- Error log + PclErrorLog(-3, "Invalid empty archive name"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + + // ----- Extract the tar format from the extension + if (($p_mode == "") || (($p_mode!="tar") && ($p_mode!="tgz"))) + { + if (($p_mode = PclTarHandleExtension($p_tarname)) == "") + { + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return 0; + } + } + if (($p_mode_add == "") || (($p_mode_add!="tar") && ($p_mode_add!="tgz"))) + { + if (($p_mode_add = PclTarHandleExtension($p_tarname_add)) == "") + { + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return 0; + } + } + + // ----- Clear filecache + clearstatcache(); + + // ----- Check the file size + if ((!is_file($p_tarname)) || + (((($v_size = filesize($p_tarname)) % 512) != 0) && ($p_mode=="tar"))) + { + // ----- Error log + if (!is_file($p_tarname)) + PclErrorLog(-4, "Archive '$p_tarname' does not exist"); + else + PclErrorLog(-6, "Archive '$p_tarname' has invalid size ".filesize($p_tarname)."(not a 512 block multiple)"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + if ((!is_file($p_tarname_add)) || + (((($v_size_add = filesize($p_tarname_add)) % 512) != 0) && ($p_mode_add=="tar"))) + { + // ----- Error log + if (!is_file($p_tarname_add)) + PclErrorLog(-4, "Archive '$p_tarname_add' does not exist"); + else + PclErrorLog(-6, "Archive '$p_tarname_add' has invalid size ".filesize($p_tarname_add)."(not a 512 block multiple)"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + + // ----- Look for compressed archive + if ($p_mode == "tgz") + { + // ----- Open the file in read mode + if (($p_tar = @gzopen($p_tarname, "rb")) == 0) + { + // ----- Error log + PclErrorLog(-2, "Unable to open file '$p_tarname' in binary read mode"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + + // ----- Open a temporary file in write mode + $v_temp_tarname = uniqid("pcltar-").".tmp"; + TrFctMessage(__FILE__, __LINE__, 2, "Creating temporary archive file $v_temp_tarname"); + if (($v_temp_tar = @gzopen($v_temp_tarname, "wb")) == 0) + { + // ----- Close tar file + gzclose($p_tar); + + // ----- Error log + PclErrorLog(-1, "Unable to open file '$v_temp_tarname' in binary write mode"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + + // ----- Read the first 512 bytes block + $v_buffer = gzread($p_tar, 512); + + // ----- Read the following blocks but not the last one + if (!gzeof($p_tar)) + { + TrFctMessage(__FILE__, __LINE__, 3, "More than one 512 block file"); + $i=1; + + // ----- Read new 512 block and write the already read + do{ + // ----- Write the already read block + $v_binary_data = pack("a512", "$v_buffer"); + gzputs($v_temp_tar, $v_binary_data); + + $i++; + TrFctMessage(__FILE__, __LINE__, 3, "Reading block $i"); + + // ----- Read next block + $v_buffer = gzread($p_tar, 512); + + } while (!gzeof($p_tar)); + + TrFctMessage(__FILE__, __LINE__, 3, "$i 512 bytes blocks"); + } + } + + // ----- Look for uncompressed tar file + else if ($p_mode=="tar") + { + // ----- Open the tar file + if (($p_tar = fopen($p_tarname, "r+b")) == 0) + { + // ----- Error log + PclErrorLog(-1, "Unable to open file '$p_tarname' in binary write mode"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + + // ----- Go to the beginning of last block + TrFctMessage(__FILE__, __LINE__, 4, "Position before :".($p_mode=="tar"?ftell($p_tar):gztell($p_tar))); + fseek($p_tar, $v_size-512); + TrFctMessage(__FILE__, __LINE__, 4, "Position after :".($p_mode=="tar"?ftell($p_tar):gztell($p_tar))); + } + + // ----- Look for unknown type + else + { + // ----- Error log + PclErrorLog(-3, "Invalid tar mode $p_mode"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + + // ----- Look for type of archive to add + if ($p_mode_add == "tgz") + { + TrFctMessage(__FILE__, __LINE__, 4, "Opening file $p_tarname_add"); + + // ----- Open the file in read mode + if (($p_tar_add = @gzopen($p_tarname_add, "rb")) == 0) + { + // ----- Error log + PclErrorLog(-2, "Unable to open file '$p_tarname_add' in binary read mode"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + + // ----- Read the first 512 bytes block + $v_buffer = gzread($p_tar_add, 512); + + // ----- Read the following blocks but not the last one + if (!gzeof($p_tar_add)) + { + TrFctMessage(__FILE__, __LINE__, 3, "More than one 512 block file"); + $i=1; + + // ----- Read new 512 block and write the already read + do{ + // ----- Write the already read block + $v_binary_data = pack("a512", "$v_buffer"); + if ($p_mode=="tar") + fputs($p_tar, $v_binary_data); + else + gzputs($v_temp_tar, $v_binary_data); + + $i++; + TrFctMessage(__FILE__, __LINE__, 3, "Reading block $i"); + + // ----- Read next block + $v_buffer = gzread($p_tar_add, 512); + + } while (!gzeof($p_tar_add)); + + TrFctMessage(__FILE__, __LINE__, 3, "$i 512 bytes blocks"); + } + + // ----- Close the files + gzclose($p_tar_add); + } + + // ----- Look for uncompressed tar file + else if ($p_mode=="tar") + { + // ----- Open the file in read mode + if (($p_tar_add = @fopen($p_tarname_add, "rb")) == 0) + { + // ----- Error log + PclErrorLog(-2, "Unable to open file '$p_tarname_add' in binary read mode"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + + // ----- Read the first 512 bytes block + $v_buffer = fread($p_tar_add, 512); + + // ----- Read the following blocks but not the last one + if (!feof($p_tar_add)) + { + TrFctMessage(__FILE__, __LINE__, 3, "More than one 512 block file"); + $i=1; + + // ----- Read new 512 block and write the already read + do{ + // ----- Write the already read block + $v_binary_data = pack("a512", "$v_buffer"); + if ($p_mode=="tar") + fputs($p_tar, $v_binary_data); + else + gzputs($v_temp_tar, $v_binary_data); + + $i++; + TrFctMessage(__FILE__, __LINE__, 3, "Reading block $i"); + + // ----- Read next block + $v_buffer = fread($p_tar_add, 512); + + } while (!feof($p_tar_add)); + + TrFctMessage(__FILE__, __LINE__, 3, "$i 512 bytes blocks"); + } + + // ----- Close the files + fclose($p_tar_add); + } + + // ----- Call the footer of the tar archive + $v_result = PclTarHandleFooter($p_tar, $p_mode); + + // ----- Look for closing compressed archive + if ($p_mode == "tgz") + { + // ----- Close the files + gzclose($p_tar); + gzclose($v_temp_tar); + + // ----- Unlink tar file + if (!@unlink($p_tarname)) + { + // ----- Error log + PclErrorLog(-11, "Error while deleting archive name $p_tarname"); + } + + // ----- Rename tar file + if (!@rename($v_temp_tarname, $p_tarname)) + { + // ----- Error log + PclErrorLog(-12, "Error while renaming temporary file $v_temp_tarname to archive name $p_tarname"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Look for closing uncompressed tar file + else if ($p_mode=="tar") + { + // ----- Close the tarfile + fclose($p_tar); + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + +// -------------------------------------------------------------------------------- +// ***** UNDER THIS LINE ARE DEFINED PRIVATE INTERNAL FUNCTIONS ***** +// ***** ***** +// ***** THESES FUNCTIONS MUST NOT BE USED DIRECTLY ***** +// -------------------------------------------------------------------------------- + + + + // -------------------------------------------------------------------------------- + // Function : PclTarHandleCreate() + // Description : + // Parameters : + // $p_tarname : Name of the tar file + // $p_list : An array containing the file or directory names to add in the tar + // $p_mode : "tar" for normal tar archive, "tgz" for gzipped tar archive + // Return Values : + // -------------------------------------------------------------------------------- + function PclTarHandleCreate($p_tarname, $p_list, $p_mode, $p_add_dir="", $p_remove_dir="") + { + TrFctStart(__FILE__, __LINE__, "PclTarHandleCreate", "tar=$p_tarname, list, mode=$p_mode, add_dir='$p_add_dir', remove_dir='$p_remove_dir'"); + $v_result=1; + $v_list_detail = array(); + + // ----- Check the parameters + if (($p_tarname == "") || (($p_mode != "tar") && ($p_mode != "tgz"))) + { + // ----- Error log + if ($p_tarname == "") + PclErrorLog(-3, "Invalid empty archive name"); + else + PclErrorLog(-3, "Unknown mode '$p_mode'"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + + // ----- Look for tar file + if ($p_mode == "tar") + { + // ----- Open the tar file + if (($p_tar = fopen($p_tarname, "wb")) == 0) + { + // ----- Error log + PclErrorLog(-1, "Unable to open file [$p_tarname] in binary write mode"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + + // ----- Call the adding fct inside the tar + if (($v_result = PclTarHandleAddList($p_tar, $p_list, $p_mode, $v_list_detail, $p_add_dir, $p_remove_dir)) == 1) + { + // ----- Call the footer of the tar archive + $v_result = PclTarHandleFooter($p_tar, $p_mode); + } + + // ----- Close the tarfile + fclose($p_tar); + } + // ----- Look for tgz file + else + { + // ----- Open the tar file + if (($p_tar = @gzopen($p_tarname, "wb")) == 0) + { + // ----- Error log + PclErrorLog(-1, "Unable to open file [$p_tarname] in binary write mode"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + + // ----- Call the adding fct inside the tar + if (($v_result = PclTarHandleAddList($p_tar, $p_list, $p_mode, $v_list_detail, $p_add_dir, $p_remove_dir)) == 1) + { + // ----- Call the footer of the tar archive + $v_result = PclTarHandleFooter($p_tar, $p_mode); + } + + // ----- Close the tarfile + gzclose($p_tar); + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclTarHandleAppend() + // Description : + // Parameters : + // $p_tarname : Name of the tar file + // $p_list : An array containing the file or directory names to add in the tar + // $p_mode : "tar" for normal tar archive, "tgz" for gzipped tar archive + // Return Values : + // -------------------------------------------------------------------------------- + function PclTarHandleAppend($p_tarname, $p_list, $p_mode, &$p_list_detail, $p_add_dir, $p_remove_dir) + { + TrFctStart(__FILE__, __LINE__, "PclTarHandleAppend", "tar=$p_tarname, list, mode=$p_mode"); + $v_result=1; + + // ----- Check the parameters + if ($p_tarname == "") + { + // ----- Error log + PclErrorLog(-3, "Invalid empty archive name"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + + clearstatcache(); + + // ----- Check the file size + if ((!is_file($p_tarname)) || + (((($v_size = filesize($p_tarname)) % 512) != 0) && ($p_mode=="tar"))) + { + // ----- Error log + if (!is_file($p_tarname)) + PclErrorLog(-4, "Archive '$p_tarname' does not exist"); + else + PclErrorLog(-6, "Archive '$p_tarname' has invalid size ".filesize($p_tarname)."(not a 512 block multiple)"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + + // ----- Look for compressed archive + if ($p_mode == "tgz") + { + // ----- Open the file in read mode + if (($p_tar = @gzopen($p_tarname, "rb")) == 0) + { + // ----- Error log + PclErrorLog(-2, "Unable to open file '$p_tarname' in binary read mode"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + + // ----- Open a temporary file in write mode + $v_temp_tarname = uniqid("pcltar-").".tmp"; + TrFctMessage(__FILE__, __LINE__, 2, "Creating temporary archive file $v_temp_tarname"); + if (($v_temp_tar = @gzopen($v_temp_tarname, "wb")) == 0) + { + // ----- Close tar file + gzclose($p_tar); + + // ----- Error log + PclErrorLog(-1, "Unable to open file '$v_temp_tarname' in binary write mode"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + + // ----- Read the first 512 bytes block + $v_buffer = gzread($p_tar, 512); + + // ----- Read the following blocks but not the last one + if (!gzeof($p_tar)) + { + TrFctMessage(__FILE__, __LINE__, 3, "More than one 512 block file"); + $i=1; + + // ----- Read new 512 block and write the already read + do{ + // ----- Write the already read block + $v_binary_data = pack("a512", "$v_buffer"); + gzputs($v_temp_tar, $v_binary_data); + + $i++; + TrFctMessage(__FILE__, __LINE__, 3, "Reading block $i"); + + // ----- Read next block + $v_buffer = gzread($p_tar, 512); + + } while (!gzeof($p_tar)); + + TrFctMessage(__FILE__, __LINE__, 3, "$i 512 bytes blocks"); + } + + // ----- Call the adding fct inside the tar + if (($v_result = PclTarHandleAddList($v_temp_tar, $p_list, $p_mode, $p_list_detail, $p_add_dir, $p_remove_dir)) == 1) + { + // ----- Call the footer of the tar archive + $v_result = PclTarHandleFooter($v_temp_tar, $p_mode); + } + + // ----- Close the files + gzclose($p_tar); + gzclose($v_temp_tar); + + // ----- Unlink tar file + if (!@unlink($p_tarname)) + { + // ----- Error log + PclErrorLog(-11, "Error while deleting archive name $p_tarname"); + } + + // ----- Rename tar file + if (!@rename($v_temp_tarname, $p_tarname)) + { + // ----- Error log + PclErrorLog(-12, "Error while renaming temporary file $v_temp_tarname to archive name $p_tarname"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Look for uncompressed tar file + else if ($p_mode=="tar") + { + // ----- Open the tar file + if (($p_tar = fopen($p_tarname, "r+b")) == 0) + { + // ----- Error log + PclErrorLog(-1, "Unable to open file '$p_tarname' in binary write mode"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + + // ----- Go to the beginning of last block + TrFctMessage(__FILE__, __LINE__, 4, "Position before :".($p_mode=="tar"?ftell($p_tar):gztell($p_tar))); + fseek($p_tar, $v_size-512); + TrFctMessage(__FILE__, __LINE__, 4, "Position after :".($p_mode=="tar"?ftell($p_tar):gztell($p_tar))); + + // ----- Call the adding fct inside the tar + if (($v_result = PclTarHandleAddList($p_tar, $p_list, $p_mode, $p_list_detail, $p_add_dir, $p_remove_dir)) == 1) + { + // ----- Call the footer of the tar archive + $v_result = PclTarHandleFooter($p_tar, $p_mode); + } + + // ----- Close the tarfile + fclose($p_tar); + } + + // ----- Look for unknown type + else + { + // ----- Error log + PclErrorLog(-3, "Invalid tar mode $p_mode"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclTarHandleAddList() + // Description : + // $p_add_dir and $p_remove_dir will give the ability to memorize a path which is + // different from the real path of the file. This is usefull if you want to have PclTar + // running in any directory, and memorize relative path from an other directory. + // Parameters : + // $p_tar : File descriptor of the tar archive + // $p_list : An array containing the file or directory names to add in the tar + // $p_mode : "tar" for normal tar archive, "tgz" for gzipped tar archive + // $p_list_detail : list of added files with their properties (specially the status field) + // $p_add_dir : Path to add in the filename path archived + // $p_remove_dir : Path to remove in the filename path archived + // Return Values : + // -------------------------------------------------------------------------------- + function PclTarHandleAddList($p_tar, $p_list, $p_mode, &$p_list_detail, $p_add_dir, $p_remove_dir) + { + TrFctStart(__FILE__, __LINE__, "PclTarHandleAddList", "tar='$p_tar', list, mode='$p_mode', add_dir='$p_add_dir', remove_dir='$p_remove_dir'"); + $v_result=1; + $v_header = array(); + + // ----- Recuperate the current number of elt in list + $v_nb = sizeof($p_list_detail); + + // ----- Check the parameters + if ($p_tar == 0) + { + // ----- Error log + PclErrorLog(-3, "Invalid file descriptor in file ".__FILE__.", line ".__LINE__); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + + // ----- Check the arguments + if (sizeof($p_list) == 0) + { + // ----- Error log + PclErrorLog(-3, "Invalid file list parameter (invalid or empty list)"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + + // ----- Loop on the files + for ($j=0; ($j 99) + { + // ----- Error log + PclErrorLog(-5, "File name is too long (max. 99) : '$p_filename'"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + + TrFctMessage(__FILE__, __LINE__, 4, "File position before header =".($p_mode=="tar"?ftell($p_tar):gztell($p_tar))); + + // ----- Add the file + if (($v_result = PclTarHandleAddFile($p_tar, $p_filename, $p_mode, $v_header, $p_add_dir, $p_remove_dir)) != 1) + { + // ----- Return status + TrFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Store the file infos + $p_list_detail[$v_nb++] = $v_header; + + // ----- Look for directory + if (is_dir($p_filename)) + { + TrFctMessage(__FILE__, __LINE__, 2, "$p_filename is a directory"); + + // ----- Look for path + if ($p_filename != ".") + $v_path = $p_filename."/"; + else + $v_path = ""; + + // ----- Read the directory for files and sub-directories + $p_hdir = opendir($p_filename); + $p_hitem = readdir($p_hdir); // '.' directory + $p_hitem = readdir($p_hdir); // '..' directory + while ($p_hitem = readdir($p_hdir)) + { + // ----- Look for a file + if (is_file($v_path.$p_hitem)) + { + TrFctMessage(__FILE__, __LINE__, 4, "Add the file '".$v_path.$p_hitem."'"); + + // ----- Add the file + if (($v_result = PclTarHandleAddFile($p_tar, $v_path.$p_hitem, $p_mode, $v_header, $p_add_dir, $p_remove_dir)) != 1) + { + // ----- Return status + TrFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Store the file infos + $p_list_detail[$v_nb++] = $v_header; + } + + // ----- Recursive call to PclTarHandleAddFile() + else + { + TrFctMessage(__FILE__, __LINE__, 4, "'".$v_path.$p_hitem."' is a directory"); + + // ----- Need an array as parameter + $p_temp_list[0] = $v_path.$p_hitem; + $v_result = PclTarHandleAddList($p_tar, $p_temp_list, $p_mode, $p_list_detail, $p_add_dir, $p_remove_dir); + } + } + + // ----- Free memory for the recursive loop + unset($p_temp_list); + unset($p_hdir); + unset($p_hitem); + } + else + { + TrFctMessage(__FILE__, __LINE__, 4, "File position after blocks =".($p_mode=="tar"?ftell($p_tar):gztell($p_tar))); + } + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclTarHandleAddFile() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function PclTarHandleAddFile($p_tar, $p_filename, $p_mode, &$p_header, $p_add_dir, $p_remove_dir) + { + TrFctStart(__FILE__, __LINE__, "PclTarHandleAddFile", "tar='$p_tar', filename='$p_filename', p_mode='$p_mode', add_dir='$p_add_dir', remove_dir='$p_remove_dir'"); + $v_result=1; + + // ----- Check the parameters + if ($p_tar == 0) + { + // ----- Error log + PclErrorLog(-3, "Invalid file descriptor in file ".__FILE__.", line ".__LINE__); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + + // ----- Skip empty file names + if ($p_filename == "") + { + // ----- Error log + PclErrorLog(-3, "Invalid file list parameter (invalid or empty list)"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + + // ----- Calculate the stored filename + $v_stored_filename = $p_filename; + if ($p_remove_dir != "") + { + if (substr($p_remove_dir, -1) != '/') + $p_remove_dir .= "/"; + + if ((substr($p_filename, 0, 2) == "./") || (substr($p_remove_dir, 0, 2) == "./")) + { + if ((substr($p_filename, 0, 2) == "./") && (substr($p_remove_dir, 0, 2) != "./")) + $p_remove_dir = "./".$p_remove_dir; + if ((substr($p_filename, 0, 2) != "./") && (substr($p_remove_dir, 0, 2) == "./")) + $p_remove_dir = substr($p_remove_dir, 2); + } + + if (substr($p_filename, 0, strlen($p_remove_dir)) == $p_remove_dir) + { + $v_stored_filename = substr($p_filename, strlen($p_remove_dir)); + TrFctMessage(__FILE__, __LINE__, 3, "Remove path '$p_remove_dir' in file '$p_filename' = '$v_stored_filename'"); + } + } + if ($p_add_dir != "") + { + if (substr($p_add_dir, -1) == "/") + $v_stored_filename = $p_add_dir.$v_stored_filename; + else + $v_stored_filename = $p_add_dir."/".$v_stored_filename; + TrFctMessage(__FILE__, __LINE__, 3, "Add path '$p_add_dir' in file '$p_filename' = '$v_stored_filename'"); + } + + // ----- Check the path length + if (strlen($v_stored_filename) > 99) + { + // ----- Error log + PclErrorLog(-5, "Stored file name is too long (max. 99) : '$v_stored_filename'"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + + // ----- Look for a file + if (is_file($p_filename)) + { + // ----- Open the source file + if (($v_file = fopen($p_filename, "rb")) == 0) + { + // ----- Error log + PclErrorLog(-2, "Unable to open file '$p_filename' in binary read mode"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + + // ----- Call the header generation + if (($v_result = PclTarHandleHeader($p_tar, $p_filename, $p_mode, $p_header, $v_stored_filename)) != 1) + { + // ----- Return status + TrFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + TrFctMessage(__FILE__, __LINE__, 4, "File position after header =".($p_mode=="tar"?ftell($p_tar):gztell($p_tar))); + + // ----- Read the file by 512 octets blocks + $i=0; + while (($v_buffer = fread($v_file, 512)) != "") + { + $v_binary_data = pack("a512", "$v_buffer"); + if ($p_mode == "tar") + fputs($p_tar, $v_binary_data); + else + gzputs($p_tar, $v_binary_data); + $i++; + } + TrFctMessage(__FILE__, __LINE__, 2, "$i 512 bytes blocks"); + + // ----- Close the file + fclose($v_file); + + TrFctMessage(__FILE__, __LINE__, 4, "File position after blocks =".($p_mode=="tar"?ftell($p_tar):gztell($p_tar))); + } + + // ----- Look for a directory + else + { + // ----- Call the header generation + if (($v_result = PclTarHandleHeader($p_tar, $p_filename, $p_mode, $p_header, $v_stored_filename)) != 1) + { + // ----- Return status + TrFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + TrFctMessage(__FILE__, __LINE__, 4, "File position after header =".($p_mode=="tar"?ftell($p_tar):gztell($p_tar))); + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclTarHandleHeader() + // Description : + // This function creates in the TAR $p_tar, the TAR header for the file + // $p_filename. + // + // 1. The informations needed to compose the header are recuperated and formatted + // 2. Two binary strings are composed for the first part of the header, before + // and after checksum field. + // 3. The checksum is calculated from the two binary strings + // 4. The header is write in the tar file (first binary string, binary string + // for checksum and last binary string). + // Parameters : + // $p_tar : a valid file descriptor, opened in write mode, + // $p_filename : The name of the file the header is for, + // $p_mode : The mode of the archive ("tar" or "tgz"). + // $p_header : A pointer to a array where will be set the file properties + // Return Values : + // -------------------------------------------------------------------------------- + function PclTarHandleHeader($p_tar, $p_filename, $p_mode, &$p_header, $p_stored_filename) + { + TrFctStart(__FILE__, __LINE__, "PclTarHandleHeader", "tar=$p_tar, file='$p_filename', mode='$p_mode', stored_filename='$p_stored_filename'"); + $v_result=1; + + // ----- Check the parameters + if (($p_tar == 0) || ($p_filename == "")) + { + // ----- Error log + PclErrorLog(-3, "Invalid file descriptor in file ".__FILE__.", line ".__LINE__); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + + // ----- Filename (reduce the path of stored name) + if ($p_stored_filename == "") + $p_stored_filename = $p_filename; + $v_reduce_filename = PclTarHandlePathReduction($p_stored_filename); + TrFctMessage(__FILE__, __LINE__, 2, "Filename (reduced) '$v_reduce_filename', strlen ".strlen($v_reduce_filename)); + + // ----- Get file info + $v_info = stat($p_filename); + $v_uid = sprintf("%6s ", DecOct($v_info[4])); + $v_gid = sprintf("%6s ", DecOct($v_info[5])); + TrFctMessage(__FILE__, __LINE__, 3, "uid=$v_uid, gid=$v_gid"); + $v_perms = sprintf("%6s ", DecOct(fileperms($p_filename))); + TrFctMessage(__FILE__, __LINE__, 3, "file permissions $v_perms"); + + // ----- File mtime + $v_mtime_data = filemtime($p_filename); + TrFctMessage(__FILE__, __LINE__, 2, "File mtime : $v_mtime_data"); + $v_mtime = sprintf("%11s", DecOct($v_mtime_data)); + + // ----- File typeflag + // '0' or '\0' is the code for regular file + // '5' is directory + if (is_dir($p_filename)) + { + $v_typeflag = "5"; + $v_size = 0; + } + else + { + $v_typeflag = ""; + + // ----- Get the file size + clearstatcache(); + $v_size = filesize($p_filename); + } + + TrFctMessage(__FILE__, __LINE__, 2, "File size : $v_size"); + $v_size = sprintf("%11s ", DecOct($v_size)); + + TrFctMessage(__FILE__, __LINE__, 2, "File typeflag : $v_typeflag"); + + // ----- Linkname + $v_linkname = ""; + + // ----- Magic + $v_magic = ""; + + // ----- Version + $v_version = ""; + + // ----- uname + $v_uname = ""; + + // ----- gname + $v_gname = ""; + + // ----- devmajor + $v_devmajor = ""; + + // ----- devminor + $v_devminor = ""; + + // ----- prefix + $v_prefix = ""; + + // ----- Compose the binary string of the header in two parts arround the checksum position + $v_binary_data_first = pack("a100a8a8a8a12A12", $v_reduce_filename, $v_perms, $v_uid, $v_gid, $v_size, $v_mtime); + $v_binary_data_last = pack("a1a100a6a2a32a32a8a8a155a12", $v_typeflag, $v_linkname, $v_magic, $v_version, $v_uname, $v_gname, $v_devmajor, $v_devminor, $v_prefix, ""); + + // ----- Calculate the checksum + $v_checksum = 0; + // ..... First part of the header + for ($i=0; $i<148; $i++) + { + $v_checksum += ord(substr($v_binary_data_first,$i,1)); + } + // ..... Ignore the checksum value and replace it by ' ' (space) + for ($i=148; $i<156; $i++) + { + $v_checksum += ord(' '); + } + // ..... Last part of the header + for ($i=156, $j=0; $i<512; $i++, $j++) + { + $v_checksum += ord(substr($v_binary_data_last,$j,1)); + } + TrFctMessage(__FILE__, __LINE__, 3, "Calculated checksum : $v_checksum"); + + // ----- Write the first 148 bytes of the header in the archive + if ($p_mode == "tar") + fputs($p_tar, $v_binary_data_first, 148); + else + gzputs($p_tar, $v_binary_data_first, 148); + + // ----- Write the calculated checksum + $v_checksum = sprintf("%6s ", DecOct($v_checksum)); + $v_binary_data = pack("a8", $v_checksum); + if ($p_mode == "tar") + fputs($p_tar, $v_binary_data, 8); + else + gzputs($p_tar, $v_binary_data, 8); + + // ----- Write the last 356 bytes of the header in the archive + if ($p_mode == "tar") + fputs($p_tar, $v_binary_data_last, 356); + else + gzputs($p_tar, $v_binary_data_last, 356); + + // ----- Set the properties in the header "structure" + $p_header[filename] = $v_reduce_filename; + $p_header[mode] = $v_perms; + $p_header[uid] = $v_uid; + $p_header[gid] = $v_gid; + $p_header[size] = $v_size; + $p_header[mtime] = $v_mtime; + $p_header[typeflag] = $v_typeflag; + $p_header[status] = "added"; + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclTarHandleFooter() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function PclTarHandleFooter($p_tar, $p_mode) + { + TrFctStart(__FILE__, __LINE__, "PclTarHandleFooter", "tar='$p_tar', p_mode=$p_mode"); + $v_result=1; + + // ----- Write the last 0 filled block for end of archive + $v_binary_data = pack("a512", ""); + if ($p_mode == "tar") + fputs($p_tar, $v_binary_data); + else + gzputs($p_tar, $v_binary_data); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclTarHandleExtract() + // Description : + // Parameters : + // $p_tarname : Filename of the tar (or tgz) archive + // $p_file_list : An array which contains the list of files to extract, this + // array may be empty when $p_mode is 'complete' + // $p_list_detail : An array where will be placed the properties of each extracted/listed file + // $p_mode : 'complete' will extract all files from the archive, + // 'partial' will look for files in $p_file_list + // 'list' will only list the files from the archive without any extract + // $p_path : Path to add while writing the extracted files + // $p_tar_mode : 'tar' for GNU TAR archive, 'tgz' for compressed archive + // $p_remove_path : Path to remove (from the file memorized path) while writing the + // extracted files. If the path does not match the file path, + // the file is extracted with its memorized path. + // $p_remove_path does not apply to 'list' mode. + // $p_path and $p_remove_path are commulative. + // Return Values : + // -------------------------------------------------------------------------------- + function PclTarHandleExtract($p_tarname, $p_file_list, &$p_list_detail, $p_mode, $p_path, $p_tar_mode, $p_remove_path) + { + TrFctStart(__FILE__, __LINE__, "PclTarHandleExtract", "archive='$p_tarname', list, mode=$p_mode, path=$p_path, tar_mode=$p_tar_mode, remove_path='$p_remove_path'"); + $v_result=1; + $v_nb = 0; + $v_extract_all = TRUE; + $v_listing = FALSE; + + // ----- Check the path + if (($p_path == "") || ((substr($p_path, 0, 1) != "/") && (substr($p_path, 0, 3) != "../"))) + $p_path = "./".$p_path; + + // ----- Look for path to remove format (should end by /) + if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/')) + { + $p_remove_path .= '/'; + } + $p_remove_path_size = strlen($p_remove_path); + + // ----- Study the mode + switch ($p_mode) { + case "complete" : + // ----- Flag extract of all files + $v_extract_all = TRUE; + $v_listing = FALSE; + break; + case "partial" : + // ----- Flag extract of specific files + $v_extract_all = FALSE; + $v_listing = FALSE; + break; + case "list" : + // ----- Flag list of all files + $v_extract_all = FALSE; + $v_listing = TRUE; + break; + default : + // ----- Error log + PclErrorLog(-3, "Invalid extract mode ($p_mode)"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + + // ----- Open the tar file + if ($p_tar_mode == "tar") + { + TrFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode"); + $v_tar = fopen($p_tarname, "rb"); + } + else + { + TrFctMessage(__FILE__, __LINE__, 3, "Open file in gzip binary read mode"); + $v_tar = @gzopen($p_tarname, "rb"); + } + + // ----- Check that the archive is open + if ($v_tar == 0) + { + // ----- Error log + PclErrorLog(-2, "Unable to open archive '$p_tarname' in binary read mode"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + + // ----- Read the blocks + While (!($v_end_of_file = ($p_tar_mode == "tar"?feof($v_tar):gzeof($v_tar)))) + { + TrFctMessage(__FILE__, __LINE__, 3, "Looking for next header ..."); + + // ----- Clear cache of file infos + clearstatcache(); + + // ----- Reset extract tag + $v_extract_file = FALSE; + $v_extraction_stopped = 0; + + // ----- Read the 512 bytes header + if ($p_tar_mode == "tar") + $v_binary_data = fread($v_tar, 512); + else + $v_binary_data = gzread($v_tar, 512); + + // ----- Read the header properties + if (($v_result = PclTarHandleReadHeader($v_binary_data, $v_header)) != 1) + { + // ----- Close the archive file + if ($p_tar_mode == "tar") + fclose($v_tar); + else + gzclose($v_tar); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Look for empty blocks to skip + if ($v_header[filename] == "") + { + TrFctMessage(__FILE__, __LINE__, 2, "Empty block found. End of archive ?"); + continue; + } + + TrFctMessage(__FILE__, __LINE__, 2, "Found file '$v_header[filename]', size '$v_header[size]'"); + + // ----- Look for partial extract + if ((!$v_extract_all) && (is_array($p_file_list))) + { + TrFctMessage(__FILE__, __LINE__, 2, "Look if the file '$v_header[filename]' need to be extracted"); + + // ----- By default no unzip if the file is not found + $v_extract_file = FALSE; + + // ----- Look into the file list + for ($i=0; $i strlen($p_file_list[$i])) && (substr($v_header[filename], 0, strlen($p_file_list[$i])) == $p_file_list[$i])) + { + // ----- The file is in the directory, so extract it + TrFctMessage(__FILE__, __LINE__, 2, "File '$v_header[filename]' is in directory '$p_file_list[$i]' : extract it"); + $v_extract_file = TRUE; + + // ----- End of loop + break; + } + } + + // ----- It is a file, so compare the file names + else if ($p_file_list[$i] == $v_header[filename]) + { + // ----- File found + TrFctMessage(__FILE__, __LINE__, 2, "File '$v_header[filename]' should be extracted"); + $v_extract_file = TRUE; + + // ----- End of loop + break; + } + } + + // ----- Trace + if (!$v_extract_file) + { + TrFctMessage(__FILE__, __LINE__, 2, "File '$v_header[filename]' should not be extracted"); + } + } + else + { + // ----- All files need to be extracted + $v_extract_file = TRUE; + } + + // ----- Look if this file need to be extracted + if (($v_extract_file) && (!$v_listing)) + { + // ----- Look for path to remove + if (($p_remove_path != "") + && (substr($v_header[filename], 0, $p_remove_path_size) == $p_remove_path)) + { + TrFctMessage(__FILE__, __LINE__, 3, "Found path '$p_remove_path' to remove in file '$v_header[filename]'"); + // ----- Remove the path + $v_header[filename] = substr($v_header[filename], $p_remove_path_size); + TrFctMessage(__FILE__, __LINE__, 3, "Reslting file is '$v_header[filename]'"); + } + + // ----- Add the path to the file + if (($p_path != "./") && ($p_path != "/")) + { + // ----- Look for the path end '/' + while (substr($p_path, -1) == "/") + { + TrFctMessage(__FILE__, __LINE__, 3, "Destination path [$p_path] ends by '/'"); + $p_path = substr($p_path, 0, strlen($p_path)-1); + TrFctMessage(__FILE__, __LINE__, 3, "Modified to [$p_path]"); + } + + // ----- Add the path + if (substr($v_header[filename], 0, 1) == "/") + $v_header[filename] = $p_path.$v_header[filename]; + else + $v_header[filename] = $p_path."/".$v_header[filename]; + } + + // ----- Trace + TrFctMessage(__FILE__, __LINE__, 2, "Extracting file (with path) '$v_header[filename]', size '$v_header[size]'"); + + // ----- Check that the file does not exists + if (file_exists($v_header[filename])) + { + TrFctMessage(__FILE__, __LINE__, 2, "File '$v_header[filename]' already exists"); + + // ----- Look if file is a directory + if (is_dir($v_header[filename])) + { + TrFctMessage(__FILE__, __LINE__, 2, "Existing file '$v_header[filename]' is a directory"); + + // ----- Change the file status + $v_header[status] = "already_a_directory"; + + // ----- Skip the extract + $v_extraction_stopped = 1; + $v_extract_file = 0; + } + // ----- Look if file is write protected + else if (!is_writeable($v_header[filename])) + { + TrFctMessage(__FILE__, __LINE__, 2, "Existing file '$v_header[filename]' is write protected"); + + // ----- Change the file status + $v_header[status] = "write_protected"; + + // ----- Skip the extract + $v_extraction_stopped = 1; + $v_extract_file = 0; + } + // ----- Look if the extracted file is older + else if (filemtime($v_header[filename]) > $v_header[mtime]) + { + TrFctMessage(__FILE__, __LINE__, 2, "Existing file '$v_header[filename]' is newer (".date("l dS of F Y h:i:s A", filemtime($v_header[filename])).") than the extracted file (".date("l dS of F Y h:i:s A", $v_header[mtime]).")"); + + // ----- Change the file status + $v_header[status] = "newer_exist"; + + // ----- Skip the extract + $v_extraction_stopped = 1; + $v_extract_file = 0; + } + } + + // ----- Check the directory availability and create it if necessary + else + { + if ($v_header[typeflag]=="5") + $v_dir_to_check = $v_header[filename]; + else if (!strstr($v_header[filename], "/")) + $v_dir_to_check = ""; + else + $v_dir_to_check = dirname($v_header[filename]); + + if (($v_result = PclTarHandlerDirCheck($v_dir_to_check)) != 1) + { + TrFctMessage(__FILE__, __LINE__, 2, "Unable to create path for '$v_header[filename]'"); + + // ----- Change the file status + $v_header[status] = "path_creation_fail"; + + // ----- Skip the extract + $v_extraction_stopped = 1; + $v_extract_file = 0; + } + } + + // ----- Do the extraction + if (($v_extract_file) && ($v_header[typeflag]!="5")) + { + // ----- Open the destination file in write mode + if (($v_dest_file = @fopen($v_header[filename], "wb")) == 0) + { + TrFctMessage(__FILE__, __LINE__, 2, "Error while opening '$v_header[filename]' in write binary mode"); + + // ----- Change the file status + $v_header[status] = "write_error"; + + // ----- Jump to next file + TrFctMessage(__FILE__, __LINE__, 2, "Jump to next file"); + if ($p_tar_mode == "tar") + fseek($v_tar, ftell($v_tar)+(ceil(($v_header[size]/512))*512)); + else + gzseek($v_tar, gztell($v_tar)+(ceil(($v_header[size]/512))*512)); + } + else + { + TrFctMessage(__FILE__, __LINE__, 2, "Start extraction of '$v_header[filename]'"); + + // ----- Read data + $n = floor($v_header[size]/512); + for ($i=0; $i<$n; $i++) + { + TrFctMessage(__FILE__, __LINE__, 3, "Read complete 512 bytes block number ".($i+1)); + if ($p_tar_mode == "tar") + $v_content = fread($v_tar, 512); + else + $v_content = gzread($v_tar, 512); + fwrite($v_dest_file, $v_content, 512); + } + if (($v_header[size] % 512) != 0) + { + TrFctMessage(__FILE__, __LINE__, 3, "Read last ".($v_header[size] % 512)." bytes in a 512 block"); + if ($p_tar_mode == "tar") + $v_content = fread($v_tar, 512); + else + $v_content = gzread($v_tar, 512); + fwrite($v_dest_file, $v_content, ($v_header[size] % 512)); + } + + // ----- Close the destination file + fclose($v_dest_file); + + // ----- Change the file mode, mtime + touch($v_header[filename], $v_header[mtime]); + //chmod($v_header[filename], DecOct($v_header[mode])); + } + + // ----- Check the file size + clearstatcache(); + if (filesize($v_header[filename]) != $v_header[size]) + { + // ----- Close the archive file + if ($p_tar_mode == "tar") + fclose($v_tar); + else + gzclose($v_tar); + + // ----- Error log + PclErrorLog(-7, "Extracted file '$v_header[filename]' does not have the correct file size '".filesize($v_filename)."' ('$v_header[size]' expected). Archive may be corrupted."); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + + // ----- Trace + TrFctMessage(__FILE__, __LINE__, 2, "Extraction done"); + } + + else + { + TrFctMessage(__FILE__, __LINE__, 2, "Extraction of file '$v_header[filename]' skipped."); + + // ----- Jump to next file + TrFctMessage(__FILE__, __LINE__, 2, "Jump to next file"); + if ($p_tar_mode == "tar") + fseek($v_tar, ftell($v_tar)+(ceil(($v_header[size]/512))*512)); + else + gzseek($v_tar, gztell($v_tar)+(ceil(($v_header[size]/512))*512)); + } + } + + // ----- Look for file that is not to be unzipped + else + { + // ----- Trace + TrFctMessage(__FILE__, __LINE__, 2, "Jump file '$v_header[filename]'"); + TrFctMessage(__FILE__, __LINE__, 4, "Position avant jump [".($p_tar_mode=="tar"?ftell($v_tar):gztell($v_tar))."]"); + + // ----- Jump to next file + if ($p_tar_mode == "tar") + fseek($v_tar, ($p_tar_mode=="tar"?ftell($v_tar):gztell($v_tar))+(ceil(($v_header[size]/512))*512)); + else + gzseek($v_tar, gztell($v_tar)+(ceil(($v_header[size]/512))*512)); + + TrFctMessage(__FILE__, __LINE__, 4, "Position aprs jump [".($p_tar_mode=="tar"?ftell($v_tar):gztell($v_tar))."]"); + } + + if ($p_tar_mode == "tar") + $v_end_of_file = feof($v_tar); + else + $v_end_of_file = gzeof($v_tar); + + // ----- File name and properties are logged if listing mode or file is extracted + if ($v_listing || $v_extract_file || $v_extraction_stopped) + { + TrFctMessage(__FILE__, __LINE__, 2, "Memorize info about file '$v_header[filename]'"); + + // ----- Log extracted files + if (($v_file_dir = dirname($v_header[filename])) == $v_header[filename]) + $v_file_dir = ""; + if ((substr($v_header[filename], 0, 1) == "/") && ($v_file_dir == "")) + $v_file_dir = "/"; + + // ----- Add the array describing the file into the list + $p_list_detail[$v_nb] = $v_header; + + // ----- Increment + $v_nb++; + } + } + + // ----- Close the tarfile + if ($p_tar_mode == "tar") + fclose($v_tar); + else + gzclose($v_tar); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclTarHandleExtractByIndexList() + // Description : + // Extract the files which are at the indexes specified. If the 'file' at the + // index is a directory, the directory only is created, not all the files stored + // for that directory. + // Parameters : + // $p_index_string : String of indexes of files to extract. The form of the + // string is "0,4-6,8-12" with only numbers and '-' for + // for range, and ',' to separate ranges. No spaces or ';' + // are allowed. + // Return Values : + // -------------------------------------------------------------------------------- + function PclTarHandleExtractByIndexList($p_tarname, $p_index_string, &$p_list_detail, $p_path, $p_remove_path, $p_tar_mode) + { + TrFctStart(__FILE__, __LINE__, "PclTarHandleExtractByIndexList", "archive='$p_tarname', index_string='$p_index_string', list, path=$p_path, remove_path='$p_remove_path', tar_mode=$p_tar_mode"); + $v_result=1; + $v_nb = 0; + + // ----- TBC : I should check the string by a regexp + + // ----- Check the path + if (($p_path == "") || ((substr($p_path, 0, 1) != "/") && (substr($p_path, 0, 3) != "../") && (substr($p_path, 0, 2) != "./"))) + $p_path = "./".$p_path; + + // ----- Look for path to remove format (should end by /) + if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/')) + { + $p_remove_path .= '/'; + } + $p_remove_path_size = strlen($p_remove_path); + + // ----- Open the tar file + if ($p_tar_mode == "tar") + { + TrFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode"); + $v_tar = @fopen($p_tarname, "rb"); + } + else + { + TrFctMessage(__FILE__, __LINE__, 3, "Open file in gzip binary read mode"); + $v_tar = @gzopen($p_tarname, "rb"); + } + + // ----- Check that the archive is open + if ($v_tar == 0) + { + // ----- Error log + PclErrorLog(-2, "Unable to open archive '$p_tarname' in binary read mode"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + + // ----- Manipulate the index list + $v_list = explode(",", $p_index_string); + sort($v_list); + + // ----- Loop on the index list + $v_index=0; + for ($i=0; ($i $p_index_stop) + { + TrFctMessage(__FILE__, __LINE__, 2, "Stop extraction, past stop index"); + break; + } + + // ----- Clear cache of file infos + clearstatcache(); + + // ----- Reset extract tag + $v_extract_file = FALSE; + $v_extraction_stopped = 0; + + // ----- Read the 512 bytes header + if ($p_tar_mode == "tar") + $v_binary_data = fread($v_tar, 512); + else + $v_binary_data = gzread($v_tar, 512); + + // ----- Read the header properties + if (($v_result = PclTarHandleReadHeader($v_binary_data, $v_header)) != 1) + { + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Look for empty blocks to skip + if ($v_header[filename] == "") + { + TrFctMessage(__FILE__, __LINE__, 2, "Empty block found. End of archive ?"); + continue; + } + + TrFctMessage(__FILE__, __LINE__, 2, "Found file '$v_header[filename]', size '$v_header[size]'"); + + // ----- Look if file is in the range to be extracted + if (($p_index_current >= $p_index_start) && ($p_index_current <= $p_index_stop)) + { + TrFctMessage(__FILE__, __LINE__, 2, "File '$v_header[filename]' is in the range to be extracted"); + $v_extract_file = TRUE; + } + else + { + TrFctMessage(__FILE__, __LINE__, 2, "File '$v_header[filename]' is out of the range"); + $v_extract_file = FALSE; + } + + // ----- Look if this file need to be extracted + if ($v_extract_file) + { + if (($v_result = PclTarHandleExtractFile($v_tar, $v_header, $p_path, $p_remove_path, $p_tar_mode)) != 1) + { + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + } + + // ----- Look for file that is not to be extracted + else + { + // ----- Trace + TrFctMessage(__FILE__, __LINE__, 2, "Jump file '$v_header[filename]'"); + TrFctMessage(__FILE__, __LINE__, 4, "Position avant jump [".($p_tar_mode=="tar"?ftell($v_tar):gztell($v_tar))."]"); + + // ----- Jump to next file + if ($p_tar_mode == "tar") + fseek($v_tar, ($p_tar_mode=="tar"?ftell($v_tar):gztell($v_tar))+(ceil(($v_header[size]/512))*512)); + else + gzseek($v_tar, gztell($v_tar)+(ceil(($v_header[size]/512))*512)); + + TrFctMessage(__FILE__, __LINE__, 4, "Position aprs jump [".($p_tar_mode=="tar"?ftell($v_tar):gztell($v_tar))."]"); + } + + if ($p_tar_mode == "tar") + $v_end_of_file = feof($v_tar); + else + $v_end_of_file = gzeof($v_tar); + + // ----- File name and properties are logged if listing mode or file is extracted + if ($v_extract_file) + { + TrFctMessage(__FILE__, __LINE__, 2, "Memorize info about file '$v_header[filename]'"); + + // ----- Log extracted files + if (($v_file_dir = dirname($v_header[filename])) == $v_header[filename]) + $v_file_dir = ""; + if ((substr($v_header[filename], 0, 1) == "/") && ($v_file_dir == "")) + $v_file_dir = "/"; + + // ----- Add the array describing the file into the list + $p_list_detail[$v_nb] = $v_header; + + // ----- Increment + $v_nb++; + } + + // ----- Increment the current file index + $p_index_current++; + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclTarHandleExtractFile() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function PclTarHandleExtractFile($p_tar, &$v_header, $p_path, $p_remove_path, $p_tar_mode) + { + TrFctStart(__FILE__, __LINE__, "PclTarHandleExtractFile", "archive_descr='$p_tar', path=$p_path, remove_path='$p_remove_path', tar_mode=$p_tar_mode"); + $v_result=1; + + // TBC : I should replace all $v_tar by $p_tar in this function .... + $v_tar = $p_tar; + $v_extract_file = 1; + + $p_remove_path_size = strlen($p_remove_path); + + // ----- Look for path to remove + if (($p_remove_path != "") + && (substr($v_header[filename], 0, $p_remove_path_size) == $p_remove_path)) + { + TrFctMessage(__FILE__, __LINE__, 3, "Found path '$p_remove_path' to remove in file '$v_header[filename]'"); + // ----- Remove the path + $v_header[filename] = substr($v_header[filename], $p_remove_path_size); + TrFctMessage(__FILE__, __LINE__, 3, "Resulting file is '$v_header[filename]'"); + } + + // ----- Add the path to the file + if (($p_path != "./") && ($p_path != "/")) + { + // ----- Look for the path end '/' + while (substr($p_path, -1) == "/") + { + TrFctMessage(__FILE__, __LINE__, 3, "Destination path [$p_path] ends by '/'"); + $p_path = substr($p_path, 0, strlen($p_path)-1); + TrFctMessage(__FILE__, __LINE__, 3, "Modified to [$p_path]"); + } + + // ----- Add the path + if (substr($v_header[filename], 0, 1) == "/") + $v_header[filename] = $p_path.$v_header[filename]; + else + $v_header[filename] = $p_path."/".$v_header[filename]; + } + + // ----- Trace + TrFctMessage(__FILE__, __LINE__, 2, "Extracting file (with path) '$v_header[filename]', size '$v_header[size]'"); + + // ----- Check that the file does not exists + if (file_exists($v_header[filename])) + { + TrFctMessage(__FILE__, __LINE__, 2, "File '$v_header[filename]' already exists"); + + // ----- Look if file is a directory + if (is_dir($v_header[filename])) + { + TrFctMessage(__FILE__, __LINE__, 2, "Existing file '$v_header[filename]' is a directory"); + + // ----- Change the file status + $v_header[status] = "already_a_directory"; + + // ----- Skip the extract + $v_extraction_stopped = 1; + $v_extract_file = 0; + } + // ----- Look if file is write protected + else if (!is_writeable($v_header[filename])) + { + TrFctMessage(__FILE__, __LINE__, 2, "Existing file '$v_header[filename]' is write protected"); + + // ----- Change the file status + $v_header[status] = "write_protected"; + + // ----- Skip the extract + $v_extraction_stopped = 1; + $v_extract_file = 0; + } + // ----- Look if the extracted file is older + else if (filemtime($v_header[filename]) > $v_header[mtime]) + { + TrFctMessage(__FILE__, __LINE__, 2, "Existing file '$v_header[filename]' is newer (".date("l dS of F Y h:i:s A", filemtime($v_header[filename])).") than the extracted file (".date("l dS of F Y h:i:s A", $v_header[mtime]).")"); + + // ----- Change the file status + $v_header[status] = "newer_exist"; + + // ----- Skip the extract + $v_extraction_stopped = 1; + $v_extract_file = 0; + } + } + + // ----- Check the directory availability and create it if necessary + else + { + if ($v_header[typeflag]=="5") + $v_dir_to_check = $v_header[filename]; + else if (!strstr($v_header[filename], "/")) + $v_dir_to_check = ""; + else + $v_dir_to_check = dirname($v_header[filename]); + + if (($v_result = PclTarHandlerDirCheck($v_dir_to_check)) != 1) + { + TrFctMessage(__FILE__, __LINE__, 2, "Unable to create path for '$v_header[filename]'"); + + // ----- Change the file status + $v_header[status] = "path_creation_fail"; + + // ----- Skip the extract + $v_extraction_stopped = 1; + $v_extract_file = 0; + } + } + + // ----- Do the real bytes extraction (if not a directory) + if (($v_extract_file) && ($v_header[typeflag]!="5")) + { + // ----- Open the destination file in write mode + if (($v_dest_file = @fopen($v_header[filename], "wb")) == 0) + { + TrFctMessage(__FILE__, __LINE__, 2, "Error while opening '$v_header[filename]' in write binary mode"); + + // ----- Change the file status + $v_header[status] = "write_error"; + + // ----- Jump to next file + TrFctMessage(__FILE__, __LINE__, 2, "Jump to next file"); + if ($p_tar_mode == "tar") + fseek($v_tar, ftell($v_tar)+(ceil(($v_header[size]/512))*512)); + else + gzseek($v_tar, gztell($v_tar)+(ceil(($v_header[size]/512))*512)); + } + else + { + TrFctMessage(__FILE__, __LINE__, 2, "Start extraction of '$v_header[filename]'"); + + // ----- Read data + $n = floor($v_header[size]/512); + for ($i=0; $i<$n; $i++) + { + TrFctMessage(__FILE__, __LINE__, 3, "Read complete 512 bytes block number ".($i+1)); + if ($p_tar_mode == "tar") + $v_content = fread($v_tar, 512); + else + $v_content = gzread($v_tar, 512); + fwrite($v_dest_file, $v_content, 512); + } + if (($v_header[size] % 512) != 0) + { + TrFctMessage(__FILE__, __LINE__, 3, "Read last ".($v_header[size] % 512)." bytes in a 512 block"); + if ($p_tar_mode == "tar") + $v_content = fread($v_tar, 512); + else + $v_content = gzread($v_tar, 512); + fwrite($v_dest_file, $v_content, ($v_header[size] % 512)); + } + + // ----- Close the destination file + fclose($v_dest_file); + + // ----- Change the file mode, mtime + touch($v_header[filename], $v_header[mtime]); + //chmod($v_header[filename], DecOct($v_header[mode])); + } + + // ----- Check the file size + clearstatcache(); + if (filesize($v_header[filename]) != $v_header[size]) + { + // ----- Error log + PclErrorLog(-7, "Extracted file '$v_header[filename]' does not have the correct file size '".filesize($v_filename)."' ('$v_header[size]' expected). Archive may be corrupted."); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + + // ----- Trace + TrFctMessage(__FILE__, __LINE__, 2, "Extraction done"); + } + else + { + TrFctMessage(__FILE__, __LINE__, 2, "Extraction of file '$v_header[filename]' skipped."); + + // ----- Jump to next file + TrFctMessage(__FILE__, __LINE__, 2, "Jump to next file"); + if ($p_tar_mode == "tar") + fseek($v_tar, ftell($v_tar)+(ceil(($v_header[size]/512))*512)); + else + gzseek($v_tar, gztell($v_tar)+(ceil(($v_header[size]/512))*512)); + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclTarHandleDelete() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function PclTarHandleDelete($p_tarname, $p_file_list, &$p_list_detail, $p_tar_mode) + { + TrFctStart(__FILE__, __LINE__, "PclTarHandleDelete", "archive='$p_tarname', list, tar_mode=$p_tar_mode"); + $v_result=1; + $v_nb=0; + + // ----- Look for regular tar file + if ($p_tar_mode == "tar") + { + // ----- Open file + TrFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode"); + if (($v_tar = @fopen($p_tarname, "rb")) == 0) + { + // ----- Error log + PclErrorLog(-2, "Unable to open file '$p_tarname' in binary read mode"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + + // ----- Open a temporary file in write mode + $v_temp_tarname = uniqid("pcltar-").".tmp"; + TrFctMessage(__FILE__, __LINE__, 2, "Creating temporary archive file $v_temp_tarname"); + if (($v_temp_tar = @fopen($v_temp_tarname, "wb")) == 0) + { + // ----- Close tar file + fclose($v_tar); + + // ----- Error log + PclErrorLog(-1, "Unable to open file '$v_temp_tarname' in binary write mode"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + } + + // ----- Look for compressed tar file + else + { + // ----- Open the file in read mode + TrFctMessage(__FILE__, __LINE__, 3, "Open file in gzip binary read mode"); + if (($v_tar = @gzopen($p_tarname, "rb")) == 0) + { + // ----- Error log + PclErrorLog(-2, "Unable to open file '$p_tarname' in binary read mode"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + + // ----- Open a temporary file in write mode + $v_temp_tarname = uniqid("pcltar-").".tmp"; + TrFctMessage(__FILE__, __LINE__, 2, "Creating temporary archive file $v_temp_tarname"); + if (($v_temp_tar = @gzopen($v_temp_tarname, "wb")) == 0) + { + // ----- Close tar file + gzclose($v_tar); + + // ----- Error log + PclErrorLog(-1, "Unable to open file '$v_temp_tarname' in binary write mode"); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, PclErrorCode(), PclErrorString()); + return PclErrorCode(); + } + } + + // ----- Read the blocks + While (!($v_end_of_file = ($p_tar_mode == "tar"?feof($v_tar):gzeof($v_tar)))) + { + TrFctMessage(__FILE__, __LINE__, 3, "Looking for next header ..."); + + // ----- Clear cache of file infos + clearstatcache(); + + // ----- Reset delete tag + $v_delete_file = FALSE; + + // ----- Read the first 512 block header + if ($p_tar_mode == "tar") + $v_binary_data = fread($v_tar, 512); + else + $v_binary_data = gzread($v_tar, 512); + + // ----- Read the header properties + if (($v_result = PclTarHandleReadHeader($v_binary_data, &$v_header)) != 1) + { + // ----- Close the archive file + if ($p_tar_mode == "tar") + { + fclose($v_tar); + fclose($v_temp_tar); + } + else + { + gzclose($v_tar); + gzclose($v_temp_tar); + } + @unlink($v_temp_tarname); + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Look for empty blocks to skip + if ($v_header[filename] == "") + { + TrFctMessage(__FILE__, __LINE__, 2, "Empty block found. End of archive ?"); + continue; + } + + TrFctMessage(__FILE__, __LINE__, 2, "Found file '$v_header[filename]', size '$v_header[size]'"); + + // ----- Look for filenames to delete + for ($i=0, $v_delete_file=FALSE; ($i $v_header[mtime]) + { + TrFctMessage(__FILE__, __LINE__, 3, "File '$p_file_list[$i]' need to be updated"); + $v_update_file = TRUE; + } + else + { + TrFctMessage(__FILE__, __LINE__, 3, "File '$p_file_list[$i]' does not need to be updated"); + $v_update_file = FALSE; + } + + // ----- Flag the name in order not to add the file at the end + $v_found_list[$i] = 1; + } + else + { + TrFctMessage(__FILE__, __LINE__, 4, "File '$p_file_list[$i]' is not '$v_header[filename]'"); + } + } + + // ----- Copy files that do not need to be updated + if (!$v_update_file) + { + TrFctMessage(__FILE__, __LINE__, 2, "Keep file '$v_header[filename]'"); + + // ----- Write the file header + if ($p_tar_mode == "tar") + { + fputs($v_temp_tar, $v_binary_data, 512); + } + else + { + gzputs($v_temp_tar, $v_binary_data, 512); + } + + // ----- Write the file data + $n = ceil($v_header[size]/512); + for ($j=0; $j<$n; $j++) + { + TrFctMessage(__FILE__, __LINE__, 3, "Read complete 512 bytes block number ".($j+1)); + if ($p_tar_mode == "tar") + { + $v_content = fread($v_tar, 512); + fwrite($v_temp_tar, $v_content, 512); + } + else + { + $v_content = gzread($v_tar, 512); + gzwrite($v_temp_tar, $v_content, 512); + } + } + + // ----- File name and properties are logged if listing mode or file is extracted + TrFctMessage(__FILE__, __LINE__, 2, "Memorize info about file '$v_header[filename]'"); + + // ----- Add the array describing the file into the list + $p_list_detail[$v_nb] = $v_header; + $p_list_detail[$v_nb][status] = ($v_found_file?"not_updated":"ok"); + + // ----- Increment + $v_nb++; + } + + // ----- Look for file that need to be updated + else + { + // ----- Trace + TrFctMessage(__FILE__, __LINE__, 2, "Start update of file '$v_current_filename'"); + + // ----- Store the old file size + $v_old_size = $v_header[size]; + + // ----- Add the file + if (($v_result = PclTarHandleAddFile($v_temp_tar, $v_current_filename, $p_tar_mode, $v_header, $p_add_dir, $p_remove_dir)) != 1) + { + // ----- Close the tarfile + if ($p_tar_mode == "tar") + { + fclose($v_tar); + fclose($v_temp_tar); + } + else + { + gzclose($v_tar); + gzclose($v_temp_tar); + } + @unlink($p_temp_tarname); + + // ----- Return status + TrFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Trace + TrFctMessage(__FILE__, __LINE__, 2, "Skip old file '$v_header[filename]'"); + + // ----- Jump to next file + if ($p_tar_mode == "tar") + fseek($v_tar, ftell($v_tar)+(ceil(($v_old_size/512))*512)); + else + gzseek($v_tar, gztell($v_tar)+(ceil(($v_old_size/512))*512)); + + // ----- Add the array describing the file into the list + $p_list_detail[$v_nb] = $v_header; + $p_list_detail[$v_nb][status] = "updated"; + + // ----- Increment + $v_nb++; + } + + // ----- Look for end of file + if ($p_tar_mode == "tar") + $v_end_of_file = feof($v_tar); + else + $v_end_of_file = gzeof($v_tar); + } + + // ----- Look for files that does not exists in the archive and need to be added + for ($i=0; $i=0; $i--) + { + // ----- Look for current path + if ($v_list[$i] == ".") + { + // ----- Ignore this directory + // Should be the first $i=0, but no check is done + } + else if ($v_list[$i] == "..") + { + // ----- Ignore it and ignore the $i-1 + $i--; + } + else if (($v_list[$i] == "") && ($i!=(sizeof($v_list)-1)) && ($i!=0)) + { + // ----- Ignore only the double '//' in path, + // but not the first and last '/' + } + else + { + $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?"/".$v_result:""); + } + } + } + + // ----- Return + TrFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + +// ----- End of double include look +} +?> \ No newline at end of file diff --git a/e107_handlers/pcltrace.lib.php b/e107_handlers/pcltrace.lib.php new file mode 100644 index 000000000..cc9824cc2 --- /dev/null +++ b/e107_handlers/pcltrace.lib.php @@ -0,0 +1,456 @@ +"; + echo ""; + echo ""; + echo ""; + echo "
    Trace
    "; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + + // ----- Content header + echo ""; + + // ----- Display + $v_again=0; + for ($i=0; $i"; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + } + + // ----- Content footer + echo "
    "; + $n = ($g_pcl_trace_entries[$i][index]+1)*10; + echo ""; + + echo ""; + switch ($g_pcl_trace_entries[$i][type]) { + case 1: + echo ""; + break; + case 2: + echo ""; + break; + case 3: + case 4: + echo ""; + break; + default: + echo ""; + } + echo "
    "; + + for ($j=0; $j<=$g_pcl_trace_entries[$i][index]; $j++) + { + if ($j==$g_pcl_trace_entries[$i][index]) + { + if (($g_pcl_trace_entries[$i][type] == 1) || ($g_pcl_trace_entries[$i][type] == 2)) + echo ""; + } + else + echo ""; + } + //echo ""; + echo "
    +
    |
     
    ".$g_pcl_trace_entries[$i][name]."(".$g_pcl_trace_entries[$i][param].")".$g_pcl_trace_entries[$i][name]."()=".$g_pcl_trace_entries[$i][param]."
    "; + echo "".$g_pcl_trace_entries[$i][message].""; + echo "
    ".$g_pcl_trace_entries[$i][name]."(".$g_pcl_trace_entries[$i][param].")
    ".basename($g_pcl_trace_entries[$i][file])."".$g_pcl_trace_entries[$i][line]."
    "; + + // ----- Trace footer + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + echo "
     
    "; + echo ""; + echo ""; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclTraceAction() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function PclTraceAction($p_entry) + { + global $g_pcl_trace_level; + global $g_pcl_trace_mode; + global $g_pcl_trace_filename; + global $g_pcl_trace_name; + global $g_pcl_trace_index; + global $g_pcl_trace_entries; + + if ($g_pcl_trace_mode == "normal") + { + for ($i=0; $i<$p_entry[index]; $i++) + echo "---"; + if ($p_entry[type] == 1) + echo "".$p_entry[name]."(".$p_entry[param].") : ".$p_entry[message]." [".$p_entry[file].", ".$p_entry[line]."]
    "; + else if ($p_entry[type] == 2) + echo "".$p_entry[name]."()=".$p_entry[param]." : ".$p_entry[message]." [".$p_entry[file].", ".$p_entry[line]."]
    "; + else + echo $p_entry[message]." [".$p_entry[file].", ".$p_entry[line]."]
    "; + } + } + // -------------------------------------------------------------------------------- + +// ----- End of double include look +} +?> \ No newline at end of file diff --git a/e107_handlers/pclzip.lib.php b/e107_handlers/pclzip.lib.php new file mode 100644 index 000000000..679c05c7b --- /dev/null +++ b/e107_handlers/pclzip.lib.php @@ -0,0 +1,5209 @@ +zipname = $p_zipname; + $this->zip_fd = 0; + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 1); + return; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // create($p_filelist, $p_add_dir="", $p_remove_dir="") + // create($p_filelist, $p_option, $p_option_value, ...) + // Description : + // This method supports two different synopsis. The first one is historical. + // This method creates a Zip Archive. The Zip file is created in the + // filesystem. The files and directories indicated in $p_filelist + // are added in the archive. See the parameters description for the + // supported format of $p_filelist. + // When a directory is in the list, the directory and its content is added + // in the archive. + // In this synopsis, the function takes an optional variable list of + // options. See bellow the supported options. + // Parameters : + // $p_filelist : An array containing file or directory names, or + // a string containing one filename or one directory name, or + // a string containing a list of filenames and/or directory + // names separated by spaces. + // $p_add_dir : A path to add before the real path of the archived file, + // in order to have it memorized in the archive. + // $p_remove_dir : A path to remove from the real path of the file to archive, + // in order to have a shorter path memorized in the archive. + // When $p_add_dir and $p_remove_dir are set, $p_remove_dir + // is removed first, before $p_add_dir is added. + // Options : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_OPT_COMMENT : + // PCLZIP_CB_PRE_ADD : + // PCLZIP_CB_POST_ADD : + // Return Values : + // 0 on failure, + // The list of the added files, with a status of the add action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- +// function create($p_filelist, $p_add_dir="", $p_remove_dir="") + function create($p_filelist /*, options */) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::create', "filelist='$p_filelist', ..."); + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Set default values + $v_options = array(); + $v_add_path = ""; + $v_remove_path = ""; + $v_remove_all_path = false; + $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method"); + + // ----- Look for arguments + if ($v_size > 1) { + // ----- Get the arguments + $v_arg_list = &func_get_args(); + + // ----- Remove form the options list the first argument + array_shift($v_arg_list); + $v_size--; + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Variable list of options detected"); + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_ADD => 'optional', + PCLZIP_CB_POST_ADD => 'optional', + PCLZIP_OPT_NO_COMPRESSION => 'optional', + PCLZIP_OPT_COMMENT => 'optional' + //, PCLZIP_OPT_CRYPT => 'optional' + )); + if ($v_result != 1) { + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0); + return 0; + } + + // ----- Set the arguments + if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { + $v_add_path = $v_options[PCLZIP_OPT_ADD_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { + $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { + $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Static synopsis"); + + // ----- Get the first argument + $v_add_path = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_remove_path = $v_arg_list[1]; + } + else if ($v_size > 2) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, + "Invalid number / type of arguments"); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return 0; + } + } + } + + // ----- Trace + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "add_path='$v_add_path', remove_path='$v_remove_path', remove_all_path='".($v_remove_all_path?'true':'false')."'"); + + // ----- Look if the $p_filelist is really an array + $p_result_list = array(); + if (is_array($p_filelist)) + { + // ----- Call the create fct + $v_result = $this->privCreate($p_filelist, $p_result_list, $v_add_path, $v_remove_path, $v_remove_all_path, $v_options); + } + + // ----- Look if the $p_filelist is a string + else if (is_string($p_filelist)) + { + // ----- Create a list with the elements from the string + $v_list = explode(PCLZIP_SEPARATOR, $p_filelist); + + // ----- Call the create fct + $v_result = $this->privCreate($v_list, $p_result_list, $v_add_path, $v_remove_path, $v_remove_all_path, $v_options); + } + + // ----- Invalid variable + else + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist"); + $v_result = PCLZIP_ERR_INVALID_PARAMETER; + } + + if ($v_result != 1) + { + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0); + return 0; + } + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_result_list); + return $p_result_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // add($p_filelist, $p_add_dir="", $p_remove_dir="") + // add($p_filelist, $p_option, $p_option_value, ...) + // Description : + // This method supports two synopsis. The first one is historical. + // This methods add the list of files in an existing archive. + // If a file with the same name already exists, it is added at the end of the + // archive, the first one is still present. + // If the archive does not exist, it is created. + // Parameters : + // $p_filelist : An array containing file or directory names, or + // a string containing one filename or one directory name, or + // a string containing a list of filenames and/or directory + // names separated by spaces. + // $p_add_dir : A path to add before the real path of the archived file, + // in order to have it memorized in the archive. + // $p_remove_dir : A path to remove from the real path of the file to archive, + // in order to have a shorter path memorized in the archive. + // When $p_add_dir and $p_remove_dir are set, $p_remove_dir + // is removed first, before $p_add_dir is added. + // Options : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_OPT_COMMENT : + // PCLZIP_OPT_ADD_COMMENT : + // PCLZIP_OPT_PREPEND_COMMENT : + // PCLZIP_CB_PRE_ADD : + // PCLZIP_CB_POST_ADD : + // Return Values : + // 0 on failure, + // The list of the added files, with a status of the add action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- +// function add($p_filelist, $p_add_dir="", $p_remove_dir="") + function add($p_filelist /* options */) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::add', "filelist='$p_filelist', ..."); + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Set default values + $v_options = array(); + $v_add_path = ""; + $v_remove_path = ""; + $v_remove_all_path = false; + $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method"); + + // ----- Look for arguments + if ($v_size > 1) { + // ----- Get the arguments + $v_arg_list = &func_get_args(); + + // ----- Remove form the options list the first argument + array_shift($v_arg_list); + $v_size--; + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Variable list of options detected"); + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_ADD => 'optional', + PCLZIP_CB_POST_ADD => 'optional', + PCLZIP_OPT_NO_COMPRESSION => 'optional', + PCLZIP_OPT_COMMENT => 'optional', + PCLZIP_OPT_ADD_COMMENT => 'optional', + PCLZIP_OPT_PREPEND_COMMENT => 'optional' + //, PCLZIP_OPT_CRYPT => 'optional' + )); + if ($v_result != 1) { + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0); + return 0; + } + + // ----- Set the arguments + if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { + $v_add_path = $v_options[PCLZIP_OPT_ADD_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { + $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { + $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Static synopsis"); + + // ----- Get the first argument + $v_add_path = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_remove_path = $v_arg_list[1]; + } + else if ($v_size > 2) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return 0; + } + } + } + + // ----- Trace + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "add_path='$v_add_path', remove_path='$v_remove_path', remove_all_path='".($v_remove_all_path?'true':'false')."'"); + + // ----- Look if the $p_filelist is really an array + $p_result_list = array(); + if (is_array($p_filelist)) + { + // ----- Call the create fct + $v_result = $this->privAdd($p_filelist, $p_result_list, $v_add_path, $v_remove_path, $v_remove_all_path, $v_options); + } + + // ----- Look if the $p_filelist is a string + else if (is_string($p_filelist)) + { + // ----- Create a list with the elements from the string + $v_list = explode(PCLZIP_SEPARATOR, $p_filelist); + + // ----- Call the create fct + $v_result = $this->privAdd($v_list, $p_result_list, $v_add_path, $v_remove_path, $v_remove_all_path, $v_options); + } + + // ----- Invalid variable + else + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist"); + $v_result = PCLZIP_ERR_INVALID_PARAMETER; + } + + if ($v_result != 1) + { + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0); + return 0; + } + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_result_list); + return $p_result_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : listContent() + // Description : + // This public method, gives the list of the files and directories, with their + // properties. + // The properties of each entries in the list are (used also in other functions) : + // filename : Name of the file. For a create or add action it is the filename + // given by the user. For an extract function it is the filename + // of the extracted file. + // stored_filename : Name of the file / directory stored in the archive. + // size : Size of the stored file. + // compressed_size : Size of the file's data compressed in the archive + // (without the headers overhead) + // mtime : Last known modification date of the file (UNIX timestamp) + // comment : Comment associated with the file + // folder : true | false + // index : index of the file in the archive + // status : status of the action (depending of the action) : + // Values are : + // ok : OK ! + // filtered : the file / dir is not extracted (filtered by user) + // already_a_directory : the file can not be extracted because a + // directory with the same name already exists + // write_protected : the file can not be extracted because a file + // with the same name already exists and is + // write protected + // newer_exist : the file was not extracted because a newer file exists + // path_creation_fail : the file is not extracted because the folder + // does not exists and can not be created + // write_error : the file was not extracted because there was a + // error while writing the file + // read_error : the file was not extracted because there was a error + // while reading the file + // invalid_header : the file was not extracted because of an archive + // format error (bad file header) + // Note that each time a method can continue operating when there + // is an action error on a file, the error is only logged in the file status. + // Return Values : + // 0 on an unrecoverable failure, + // The list of the files in the archive. + // -------------------------------------------------------------------------------- + function listContent() + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::listContent', ""); + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0); + return(0); + } + + // ----- Call the extracting fct + $p_list = array(); + if (($v_result = $this->privList($p_list)) != 1) + { + unset($p_list); + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo()); + return(0); + } + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_list); + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // extract($p_path="./", $p_remove_path="") + // extract([$p_option, $p_option_value, ...]) + // Description : + // This method supports two synopsis. The first one is historical. + // This method extract all the files / directories from the archive to the + // folder indicated in $p_path. + // If you want to ignore the 'root' part of path of the memorized files + // you can indicate this in the optional $p_remove_path parameter. + // By default, if a newer file with the same name already exists, the + // file is not extracted. + // + // If both PCLZIP_OPT_PATH and PCLZIP_OPT_ADD_PATH aoptions + // are used, the path indicated in PCLZIP_OPT_ADD_PATH is append + // at the end of the path value of PCLZIP_OPT_PATH. + // Parameters : + // $p_path : Path where the files and directories are to be extracted + // $p_remove_path : First part ('root' part) of the memorized path + // (if any similar) to remove while extracting. + // Options : + // PCLZIP_OPT_PATH : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_CB_PRE_EXTRACT : + // PCLZIP_CB_POST_EXTRACT : + // Return Values : + // 0 or a negative value on failure, + // The list of the extracted files, with a status of the action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + //function extract($p_path="./", $p_remove_path="") + function extract(/* options */) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::extract", ""); + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0); + return(0); + } + + // ----- Set default values + $v_options = array(); + $v_path = "./"; + $v_remove_path = ""; + $v_remove_all_path = false; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method"); + + // ----- Default values for option + $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; + + // ----- Look for arguments + if ($v_size > 0) { + // ----- Get the arguments + $v_arg_list = &func_get_args(); + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Variable list of options"); + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_PATH => 'optional', + PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_EXTRACT => 'optional', + PCLZIP_CB_POST_EXTRACT => 'optional', + PCLZIP_OPT_SET_CHMOD => 'optional', + PCLZIP_OPT_BY_NAME => 'optional', + PCLZIP_OPT_BY_EREG => 'optional', + PCLZIP_OPT_BY_PREG => 'optional', + PCLZIP_OPT_BY_INDEX => 'optional', + PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', + PCLZIP_OPT_EXTRACT_IN_OUTPUT => 'optional', + PCLZIP_OPT_REPLACE_NEWER => 'optional' + ,PCLZIP_OPT_STOP_ON_ERROR => 'optional' + )); + if ($v_result != 1) { + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0); + return 0; + } + + // ----- Set the arguments + if (isset($v_options[PCLZIP_OPT_PATH])) { + $v_path = $v_options[PCLZIP_OPT_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { + $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { + $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; + } + if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { + // ----- Check for '/' in last path char + if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { + $v_path .= '/'; + } + $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Static synopsis"); + + // ----- Get the first argument + $v_path = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_remove_path = $v_arg_list[1]; + } + else if ($v_size > 2) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo()); + return 0; + } + } + } + + // ----- Trace + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "path='$v_path', remove_path='$v_remove_path', remove_all_path='".($v_remove_path?'true':'false')."'"); + + // ----- Call the extracting fct + $p_list = array(); + $v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, + $v_remove_all_path, $v_options); + if ($v_result < 1) { + unset($p_list); + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo()); + return(0); + } + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_list); + return $p_list; + } + // -------------------------------------------------------------------------------- + + + // -------------------------------------------------------------------------------- + // Function : + // extractByIndex($p_index, $p_path="./", $p_remove_path="") + // extractByIndex($p_index, [$p_option, $p_option_value, ...]) + // Description : + // This method supports two synopsis. The first one is historical. + // This method is doing a partial extract of the archive. + // The extracted files or folders are identified by their index in the + // archive (from 0 to n). + // Note that if the index identify a folder, only the folder entry is + // extracted, not all the files included in the archive. + // Parameters : + // $p_index : A single index (integer) or a string of indexes of files to + // extract. The form of the string is "0,4-6,8-12" with only numbers + // and '-' for range or ',' to separate ranges. No spaces or ';' + // are allowed. + // $p_path : Path where the files and directories are to be extracted + // $p_remove_path : First part ('root' part) of the memorized path + // (if any similar) to remove while extracting. + // Options : + // PCLZIP_OPT_PATH : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_OPT_EXTRACT_AS_STRING : The files are extracted as strings and + // not as files. + // The resulting content is in a new field 'content' in the file + // structure. + // This option must be used alone (any other options are ignored). + // PCLZIP_CB_PRE_EXTRACT : + // PCLZIP_CB_POST_EXTRACT : + // Return Values : + // 0 on failure, + // The list of the extracted files, with a status of the action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + function extractByIndex($p_index /* $options */) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::extractByIndex", "index='$p_index', ..."); + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0); + return(0); + } + + // ----- Set default values + $v_options = array(); + $v_path = "./"; + $v_remove_path = ""; + $v_remove_all_path = false; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method"); + + // ----- Default values for option + $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; + + // ----- Look for arguments + if ($v_size > 1) { + // ----- Get the arguments + $v_arg_list = &func_get_args(); + + // ----- Remove form the options list the first argument + array_shift($v_arg_list); + $v_size--; + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Variable list of options"); + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_PATH => 'optional', + PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_EXTRACT => 'optional', + PCLZIP_CB_POST_EXTRACT => 'optional', + PCLZIP_OPT_SET_CHMOD => 'optional', + PCLZIP_OPT_REPLACE_NEWER => 'optional' + ,PCLZIP_OPT_STOP_ON_ERROR => 'optional' + )); + if ($v_result != 1) { + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0); + return 0; + } + + // ----- Set the arguments + if (isset($v_options[PCLZIP_OPT_PATH])) { + $v_path = $v_options[PCLZIP_OPT_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { + $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { + $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; + } + if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { + // ----- Check for '/' in last path char + if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { + $v_path .= '/'; + } + $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; + } + if (!isset($v_options[PCLZIP_OPT_EXTRACT_AS_STRING])) { + $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Option PCLZIP_OPT_EXTRACT_AS_STRING not set."); + } + else { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Option PCLZIP_OPT_EXTRACT_AS_STRING set."); + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Static synopsis"); + + // ----- Get the first argument + $v_path = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_remove_path = $v_arg_list[1]; + } + else if ($v_size > 2) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return 0; + } + } + } + + // ----- Trace + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "index='$p_index', path='$v_path', remove_path='$v_remove_path', remove_all_path='".($v_remove_path?'true':'false')."'"); + + // ----- Trick + // Here I want to reuse extractByRule(), so I need to parse the $p_index + // with privParseOptions() + $v_arg_trick = array (PCLZIP_OPT_BY_INDEX, $p_index); + $v_options_trick = array(); + $v_result = $this->privParseOptions($v_arg_trick, sizeof($v_arg_trick), $v_options_trick, + array (PCLZIP_OPT_BY_INDEX => 'optional' )); + if ($v_result != 1) { + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0); + return 0; + } + $v_options[PCLZIP_OPT_BY_INDEX] = $v_options_trick[PCLZIP_OPT_BY_INDEX]; + + // ----- Call the extracting fct + if (($v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options)) < 1) { + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo()); + return(0); + } + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_list); + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // delete([$p_option, $p_option_value, ...]) + // Description : + // Parameters : + // None + // Options : + // PCLZIP_OPT_BY_INDEX : + // Return Values : + // 0 on failure, + // The list of the files which are still present in the archive. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + function delete(/* options */) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::delete", ""); + $v_result=1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0); + return(0); + } + + // ----- Set default values + $v_options = array(); + + // ----- Look for variable options arguments + $v_size = func_num_args(); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "$v_size arguments passed to the method"); + + // ----- Look for no arguments + if ($v_size <= 0) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing arguments"); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo()); + return 0; + } + + // ----- Get the arguments + $v_arg_list = &func_get_args(); + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array (PCLZIP_OPT_BY_NAME => 'optional', + PCLZIP_OPT_BY_EREG => 'optional', + PCLZIP_OPT_BY_PREG => 'optional', + PCLZIP_OPT_BY_INDEX => 'optional' )); + if ($v_result != 1) { + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0); + return 0; + } + + // ----- Check that at least one rule is set + if ( (!isset($v_options[PCLZIP_OPT_BY_NAME])) + && (!isset($v_options[PCLZIP_OPT_BY_EREG])) + && (!isset($v_options[PCLZIP_OPT_BY_PREG])) + && (!isset($v_options[PCLZIP_OPT_BY_INDEX]))) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "At least one filtering rule must be set"); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo()); + return 0; + } + + // ----- Call the delete fct + $v_list = array(); + if (($v_result = $this->privDeleteByRule($v_list, $v_options)) != 1) + { + unset($v_list); + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0, PclZip::errorInfo()); + return(0); + } + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_list); + return $v_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : deleteByIndex() + // Description : + // ***** Deprecated ***** + // delete(PCLZIP_OPT_BY_INDEX, $p_index) should be prefered. + // -------------------------------------------------------------------------------- + function deleteByIndex($p_index) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::deleteByIndex", "index='$p_index'"); + + $p_list = $this->delete(PCLZIP_OPT_BY_INDEX, $p_index); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $p_list); + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : properties() + // Description : + // This method gives the properties of the archive. + // The properties are : + // nb : Number of files in the archive + // comment : Comment associated with the archive file + // status : not_exist, ok + // Parameters : + // None + // Return Values : + // 0 on failure, + // An array with the archive properties. + // -------------------------------------------------------------------------------- + function properties() + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::properties", ""); + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0); + return(0); + } + + // ----- Default properties + $v_prop = array(); + $v_prop['comment'] = ''; + $v_prop['nb'] = 0; + $v_prop['status'] = 'not_exist'; + + // ----- Look if file exists + if (@is_file($this->zipname)) + { + // ----- Open the zip file + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode"); + if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode'); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), 0); + return 0; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0); + return 0; + } + + // ----- Close the zip file + $this->privCloseFd(); + + // ----- Set the user attributes + $v_prop['comment'] = $v_central_dir['comment']; + $v_prop['nb'] = $v_central_dir['entries']; + $v_prop['status'] = 'ok'; + } + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_prop); + return $v_prop; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : duplicate() + // Description : + // This method creates an archive by copying the content of an other one. If + // the archive already exist, it is replaced by the new one without any warning. + // Parameters : + // $p_archive : The filename of a valid archive, or + // a valid PclZip object. + // Return Values : + // 1 on success. + // 0 or a negative value on error (error code). + // -------------------------------------------------------------------------------- + function duplicate($p_archive) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::duplicate", ""); + $v_result = 1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Look if the $p_archive is a PclZip object + if ((is_object($p_archive)) && (get_class($p_archive) == 'pclzip')) + { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "The parameter is valid PclZip object '".$p_archive->zipname."'"); + + // ----- Duplicate the archive + $v_result = $this->privDuplicate($p_archive->zipname); + } + + // ----- Look if the $p_archive is a string (so a filename) + else if (is_string($p_archive)) + { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "The parameter is a filename '$p_archive'"); + + // ----- Check that $p_archive is a valid zip file + // TBC : Should also check the archive format + if (!is_file($p_archive)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "No file with filename '".$p_archive."'"); + $v_result = PCLZIP_ERR_MISSING_FILE; + } + else { + // ----- Duplicate the archive + $v_result = $this->privDuplicate($p_archive); + } + } + + // ----- Invalid variable + else + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); + $v_result = PCLZIP_ERR_INVALID_PARAMETER; + } + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : merge() + // Description : + // This method merge the $p_archive_to_add archive at the end of the current + // one ($this). + // If the archive ($this) does not exist, the merge becomes a duplicate. + // If the $p_archive_to_add archive does not exist, the merge is a success. + // Parameters : + // $p_archive_to_add : It can be directly the filename of a valid zip archive, + // or a PclZip object archive. + // Return Values : + // 1 on success, + // 0 or negative values on error (see below). + // -------------------------------------------------------------------------------- + function merge($p_archive_to_add) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::merge", ""); + $v_result = 1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, 0); + return(0); + } + + // ----- Look if the $p_archive_to_add is a PclZip object + if ((is_object($p_archive_to_add)) && (get_class($p_archive_to_add) == 'pclzip')) + { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The parameter is valid PclZip object"); + + // ----- Merge the archive + $v_result = $this->privMerge($p_archive_to_add); + } + + // ----- Look if the $p_archive_to_add is a string (so a filename) + else if (is_string($p_archive_to_add)) + { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The parameter is a filename"); + + // ----- Create a temporary archive + $v_object_archive = new PclZip($p_archive_to_add); + + // ----- Merge the archive + $v_result = $this->privMerge($v_object_archive); + } + + // ----- Invalid variable + else + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); + $v_result = PCLZIP_ERR_INVALID_PARAMETER; + } + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + + + // -------------------------------------------------------------------------------- + // Function : errorCode() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function errorCode() + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + return(PclErrorCode()); + } + else { + return($this->error_code); + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : errorName() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function errorName($p_with_code=false) + { + $v_name = array ( PCLZIP_ERR_NO_ERROR => 'PCLZIP_ERR_NO_ERROR', + PCLZIP_ERR_WRITE_OPEN_FAIL => 'PCLZIP_ERR_WRITE_OPEN_FAIL', + PCLZIP_ERR_READ_OPEN_FAIL => 'PCLZIP_ERR_READ_OPEN_FAIL', + PCLZIP_ERR_INVALID_PARAMETER => 'PCLZIP_ERR_INVALID_PARAMETER', + PCLZIP_ERR_MISSING_FILE => 'PCLZIP_ERR_MISSING_FILE', + PCLZIP_ERR_FILENAME_TOO_LONG => 'PCLZIP_ERR_FILENAME_TOO_LONG', + PCLZIP_ERR_INVALID_ZIP => 'PCLZIP_ERR_INVALID_ZIP', + PCLZIP_ERR_BAD_EXTRACTED_FILE => 'PCLZIP_ERR_BAD_EXTRACTED_FILE', + PCLZIP_ERR_DIR_CREATE_FAIL => 'PCLZIP_ERR_DIR_CREATE_FAIL', + PCLZIP_ERR_BAD_EXTENSION => 'PCLZIP_ERR_BAD_EXTENSION', + PCLZIP_ERR_BAD_FORMAT => 'PCLZIP_ERR_BAD_FORMAT', + PCLZIP_ERR_DELETE_FILE_FAIL => 'PCLZIP_ERR_DELETE_FILE_FAIL', + PCLZIP_ERR_RENAME_FILE_FAIL => 'PCLZIP_ERR_RENAME_FILE_FAIL', + PCLZIP_ERR_BAD_CHECKSUM => 'PCLZIP_ERR_BAD_CHECKSUM', + PCLZIP_ERR_INVALID_ARCHIVE_ZIP => 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP', + PCLZIP_ERR_MISSING_OPTION_VALUE => 'PCLZIP_ERR_MISSING_OPTION_VALUE', + PCLZIP_ERR_INVALID_OPTION_VALUE => 'PCLZIP_ERR_INVALID_OPTION_VALUE', + PCLZIP_ERR_UNSUPPORTED_COMPRESSION => 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION', + PCLZIP_ERR_UNSUPPORTED_ENCRYPTION => 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION' ); + + if (isset($v_name[$this->error_code])) { + $v_value = $v_name[$this->error_code]; + } + else { + $v_value = 'NoName'; + } + + if ($p_with_code) { + return($v_value.' ('.$this->error_code.')'); + } + else { + return($v_value); + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : errorInfo() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function errorInfo($p_full=false) + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + return(PclErrorString()); + } + else { + if ($p_full) { + return($this->errorName(true)." : ".$this->error_string); + } + else { + return($this->error_string." [code ".$this->error_code."]"); + } + } + } + // -------------------------------------------------------------------------------- + + +// -------------------------------------------------------------------------------- +// ***** UNDER THIS LINE ARE DEFINED PRIVATE INTERNAL FUNCTIONS ***** +// ***** ***** +// ***** THESES FUNCTIONS MUST NOT BE USED DIRECTLY ***** +// -------------------------------------------------------------------------------- + + + + // -------------------------------------------------------------------------------- + // Function : privCheckFormat() + // Description : + // This method check that the archive exists and is a valid zip archive. + // Several level of check exists. (futur) + // Parameters : + // $p_level : Level of check. Default 0. + // 0 : Check the first bytes (magic codes) (default value)) + // 1 : 0 + Check the central directory (futur) + // 2 : 1 + Check each file header (futur) + // Return Values : + // true on success, + // false on error, the error code is set. + // -------------------------------------------------------------------------------- + function privCheckFormat($p_level=0) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCheckFormat", ""); + $v_result = true; + + // ----- Reset the file system cache + clearstatcache(); + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Look if the file exits + if (!is_file($this->zipname)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "Missing archive file '".$this->zipname."'"); + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, false, PclZip::errorInfo()); + return(false); + } + + // ----- Check that the file is readeable + if (!is_readable($this->zipname)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to read archive '".$this->zipname."'"); + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, false, PclZip::errorInfo()); + return(false); + } + + // ----- Check the magic code + // TBC + + // ----- Check the central header + // TBC + + // ----- Check each file header + // TBC + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privParseOptions() + // Description : + // This internal methods reads the variable list of arguments ($p_options_list, + // $p_size) and generate an array with the options and values ($v_result_list). + // $v_requested_options contains the options that can be present and those that + // must be present. + // $v_requested_options is an array, with the option value as key, and 'optional', + // or 'mandatory' as value. + // Parameters : + // See above. + // Return Values : + // 1 on success. + // 0 on failure. + // -------------------------------------------------------------------------------- + function privParseOptions(&$p_options_list, $p_size, &$v_result_list, $v_requested_options=false) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privParseOptions", ""); + $v_result=1; + + // ----- Read the options + $i=0; + while ($i<$p_size) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Looking for table index $i, option = '".PclZipUtilOptionText($p_options_list[$i])."(".$p_options_list[$i].")'"); + + // ----- Check if the option is requested + if (!isset($v_requested_options[$p_options_list[$i]])) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid optional parameter '".$p_options_list[$i]."' for this method"); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + + // ----- Look for next option + switch ($p_options_list[$i]) { + // ----- Look for options that request a path value + case PCLZIP_OPT_PATH : + case PCLZIP_OPT_REMOVE_PATH : + case PCLZIP_OPT_ADD_PATH : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + + // ----- Get the value + $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], false); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'"); + $i++; + break; + + // ----- Look for options that request an array of string for value + case PCLZIP_OPT_BY_NAME : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + + // ----- Get the value + if (is_string($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]][0] = $p_options_list[$i+1]; + } + else if (is_array($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + } + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + ////--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'"); + $i++; + break; + + // ----- Look for options that request an EREG or PREG expression + case PCLZIP_OPT_BY_EREG : + case PCLZIP_OPT_BY_PREG : + //case PCLZIP_OPT_CRYPT : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + + // ----- Get the value + if (is_string($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + } + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'"); + $i++; + break; + + // ----- Look for options that takes a string + case PCLZIP_OPT_COMMENT : + case PCLZIP_OPT_ADD_COMMENT : + case PCLZIP_OPT_PREPEND_COMMENT : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, + "Missing parameter value for option '" + .PclZipUtilOptionText($p_options_list[$i]) + ."'"); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + + // ----- Get the value + if (is_string($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + } + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, + "Wrong parameter value for option '" + .PclZipUtilOptionText($p_options_list[$i]) + ."'"); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'"); + $i++; + break; + + // ----- Look for options that request an array of index + case PCLZIP_OPT_BY_INDEX : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + + // ----- Get the value + $v_work_list = array(); + if (is_string($p_options_list[$i+1])) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Index value is a string '".$p_options_list[$i+1]."'"); + + // ----- Remove spaces + $p_options_list[$i+1] = strtr($p_options_list[$i+1], ' ', ''); + + // ----- Parse items + $v_work_list = explode(",", $p_options_list[$i+1]); + } + else if (is_integer($p_options_list[$i+1])) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Index value is an integer '".$p_options_list[$i+1]."'"); + $v_work_list[0] = $p_options_list[$i+1].'-'.$p_options_list[$i+1]; + } + else if (is_array($p_options_list[$i+1])) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Index value is an array"); + $v_work_list = $p_options_list[$i+1]; + } + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Value must be integer, string or array for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + + // ----- Reduce the index list + // each index item in the list must be a couple with a start and + // an end value : [0,3], [5-5], [8-10], ... + // ----- Check the format of each item + $v_sort_flag=false; + $v_sort_value=0; + for ($j=0; $j= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + + // ----- Get the value + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "".PclZipUtilOptionText($p_options_list[$i])." = '".$v_result_list[$p_options_list[$i]]."'"); + $i++; + break; + + // ----- Look for options that request a call-back + case PCLZIP_CB_PRE_EXTRACT : + case PCLZIP_CB_POST_EXTRACT : + case PCLZIP_CB_PRE_ADD : + case PCLZIP_CB_POST_ADD : + /* for futur use + case PCLZIP_CB_PRE_DELETE : + case PCLZIP_CB_POST_DELETE : + case PCLZIP_CB_PRE_LIST : + case PCLZIP_CB_POST_LIST : + */ + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + + // ----- Get the value + $v_function_name = $p_options_list[$i+1]; + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "call-back ".PclZipUtilOptionText($p_options_list[$i])." = '".$v_function_name."'"); + + // ----- Check that the value is a valid existing function + if (!function_exists($v_function_name)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Function '".$v_function_name."()' is not an existing function for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + + // ----- Set the attribute + $v_result_list[$p_options_list[$i]] = $v_function_name; + $i++; + break; + + default : + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, + "Unknown parameter '" + .$p_options_list[$i]."'"); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + + // ----- Next options + $i++; + } + + // ----- Look for mandatory options + if ($v_requested_options !== false) { + for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) { + // ----- Look for mandatory option + if ($v_requested_options[$key] == 'mandatory') { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Detect a mandatory option : ".PclZipUtilOptionText($key)."(".$key.")"); + // ----- Look if present + if (!isset($v_result_list[$key])) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")"); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + } + } + } + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCreate() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privCreate($p_list, &$p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_options) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCreate", "list, result_list, add_dir='$p_add_dir', remove_dir='$p_remove_dir'"); + $v_result=1; + $v_list_detail = array(); + + // ----- Open the file in write mode + if (($v_result = $this->privOpenFd('wb')) != 1) + { + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Add the list of files + $v_result = $this->privAddList($p_list, $p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, $p_options); + + // ----- Close + $this->privCloseFd(); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAdd() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privAdd($p_list, &$p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_options) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privAdd", "list, result_list, add_dir='$p_add_dir', remove_dir='$p_remove_dir'"); + $v_result=1; + $v_list_detail = array(); + + // ----- Look if the archive exists or is empty + if ((!is_file($this->zipname)) || (filesize($this->zipname) == 0)) + { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Archive does not exist, or is empty, create it."); + + // ----- Do a create + $v_result = $this->privCreate($p_list, $p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, $p_options); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Open the zip file + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode"); + if (($v_result=$this->privOpenFd('rb')) != 1) + { + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privCloseFd(); + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Go to beginning of File + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in file : ".ftell($this->zip_fd)."'"); + @rewind($this->zip_fd); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in file : ".ftell($this->zip_fd)."'"); + + // ----- Creates a temporay file + $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; + + // ----- Open the temporary file in write mode + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode"); + if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) + { + $this->privCloseFd(); + + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode'); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + + // ----- Copy the files from the archive to the temporary file + // TBC : Here I should better append the file and go back to erase the central dir + $v_size = $v_central_dir['offset']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes"); + $v_buffer = fread($this->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Swap the file descriptor + // Here is a trick : I swap the temporary fd with the zip fd, in order to use + // the following methods on the temporary fil and not the real archive + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Add the files + $v_header_list = array(); + if (($v_result = $this->privAddFileList($p_list, $v_header_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, $p_options)) != 1) + { + fclose($v_zip_temp_fd); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($this->zip_fd); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "New offset of central dir : $v_offset"); + + // ----- Copy the block of file headers from the old archive + $v_size = $v_central_dir['size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes"); + $v_buffer = @fread($v_zip_temp_fd, $v_read_size); + @fwrite($this->zip_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Create the Central Dir files header + for ($i=0, $v_count=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { + fclose($v_zip_temp_fd); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + $v_count++; + } + + // ----- Transform the header to a 'usable' info + $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); + } + + // ----- Zip file comment + $v_comment = $v_central_dir['comment']; + if (isset($p_options[PCLZIP_OPT_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_COMMENT]; + } + if (isset($p_options[PCLZIP_OPT_ADD_COMMENT])) { + $v_comment = $v_comment.$p_options[PCLZIP_OPT_ADD_COMMENT]; + } + if (isset($p_options[PCLZIP_OPT_PREPEND_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_PREPEND_COMMENT].$v_comment; + } + + // ----- Calculate the size of the central header + $v_size = @ftell($this->zip_fd)-$v_offset; + + // ----- Create the central dir footer + if (($v_result = $this->privWriteCentralHeader($v_count+$v_central_dir['entries'], $v_size, $v_offset, $v_comment)) != 1) + { + // ----- Reset the file list + unset($v_header_list); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Swap back the file descriptor + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Close + $this->privCloseFd(); + + // ----- Close the temporary file + @fclose($v_zip_temp_fd); + + // ----- Delete the zip file + // TBC : I should test the result ... + @unlink($this->zipname); + + // ----- Rename the temporary file + // TBC : I should test the result ... + //@rename($v_zip_temp_name, $this->zipname); + PclZipUtilRename($v_zip_temp_name, $this->zipname); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privOpenFd() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privOpenFd($p_mode) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privOpenFd", 'mode='.$p_mode); + $v_result=1; + + // ----- Look if already open + if ($this->zip_fd != 0) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Zip file \''.$this->zipname.'\' already open'); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + + // ----- Open the zip file + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Open file in '.$p_mode.' mode'); + if (($this->zip_fd = @fopen($this->zipname, $p_mode)) == 0) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in '.$p_mode.' mode'); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCloseFd() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privCloseFd() + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCloseFd", ""); + $v_result=1; + + if ($this->zip_fd != 0) + @fclose($this->zip_fd); + $this->zip_fd = 0; + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddList() + // Description : + // $p_add_dir and $p_remove_dir will give the ability to memorize a path which is + // different from the real path of the file. This is usefull if you want to have PclTar + // running in any directory, and memorize relative path from an other directory. + // Parameters : + // $p_list : An array containing the file or directory names to add in the tar + // $p_result_list : list of added files with their properties (specially the status field) + // $p_add_dir : Path to add in the filename path archived + // $p_remove_dir : Path to remove in the filename path archived + // Return Values : + // -------------------------------------------------------------------------------- + function privAddList($p_list, &$p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_options) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privAddList", "list, add_dir='$p_add_dir', remove_dir='$p_remove_dir'"); + $v_result=1; + + // ----- Add the files + $v_header_list = array(); + if (($v_result = $this->privAddFileList($p_list, $v_header_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, $p_options)) != 1) + { + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($this->zip_fd); + + // ----- Create the Central Dir files header + for ($i=0,$v_count=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + $v_count++; + } + + // ----- Transform the header to a 'usable' info + $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); + } + + // ----- Zip file comment + $v_comment = ''; + if (isset($p_options[PCLZIP_OPT_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_COMMENT]; + } + + // ----- Calculate the size of the central header + $v_size = @ftell($this->zip_fd)-$v_offset; + + // ----- Create the central dir footer + if (($v_result = $this->privWriteCentralHeader($v_count, $v_size, $v_offset, $v_comment)) != 1) + { + // ----- Reset the file list + unset($v_header_list); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddFileList() + // Description : + // $p_add_dir and $p_remove_dir will give the ability to memorize a path which is + // different from the real path of the file. This is usefull if you want to + // run the lib in any directory, and memorize relative path from an other directory. + // Parameters : + // $p_list : An array containing the file or directory names to add in the tar + // $p_result_list : list of added files with their properties (specially the status field) + // $p_add_dir : Path to add in the filename path archived + // $p_remove_dir : Path to remove in the filename path archived + // Return Values : + // -------------------------------------------------------------------------------- + function privAddFileList($p_list, &$p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_options) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privAddFileList", "list, add_dir='$p_add_dir', remove_dir='$p_remove_dir'"); + $v_result=1; + $v_header = array(); + + // ----- Recuperate the current number of elt in list + $v_nb = sizeof($p_result_list); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Before add, list have $v_nb elements"); + + // ----- Loop on the files + for ($j=0; ($j 0xFF) + { + // ----- Error log + PclZip::privErrorLog(-5, "File name is too long (max. 255) : '$p_filename'"); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + */ + + // ----- Look if it is a file or a dir with no all pathnre move + if ((is_file($p_filename)) || ((is_dir($p_filename)) && !$p_remove_all_dir)) { + // ----- Add the file + if (($v_result = $this->privAddFile($p_filename, $v_header, $p_add_dir, $p_remove_dir, $p_remove_all_dir, $p_options)) != 1) + { + // ----- Return status + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Store the file infos + $p_result_list[$v_nb++] = $v_header; + } + + // ----- Look for directory + if (@is_dir($p_filename)) + { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "$p_filename is a directory"); + + // ----- Look for path + if ($p_filename != ".") + $v_path = $p_filename."/"; + else + $v_path = ""; + + // ----- Read the directory for files and sub-directories + if ($p_hdir = @opendir($p_filename)) { + $p_hitem = @readdir($p_hdir); // '.' directory + $p_hitem = @readdir($p_hdir); // '..' directory + while (($p_hitem = @readdir($p_hdir)) !== false) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Looking for $p_hitem in the directory"); + + // ----- Look for a file + if (is_file($v_path.$p_hitem)) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Add the file '".$v_path.$p_hitem."'"); + + // ----- Add the file + if (($v_result = $this->privAddFile($v_path.$p_hitem, $v_header, $p_add_dir, $p_remove_dir, $p_remove_all_dir, $p_options)) != 1) { + // ----- Return status + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Store the file infos + $p_result_list[$v_nb++] = $v_header; + } + + // ----- Recursive call to privAddFileList() + else { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Add the directory '".$v_path.$p_hitem."'"); + + // ----- Need an array as parameter + $p_temp_list[0] = $v_path.$p_hitem; + $v_result = $this->privAddFileList($p_temp_list, $p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, $p_options); + + // ----- Update the number of elements of the list + $v_nb = sizeof($p_result_list); + } + } + } + + // ----- Free memory for the recursive loop + unset($p_temp_list); + unset($p_hdir); + unset($p_hitem); + } + } + + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "After add, list have $v_nb elements"); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddFile() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privAddFile($p_filename, &$p_header, $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_options) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privAddFile", "filename='$p_filename', add_dir='$p_add_dir', remove_dir='$p_remove_dir'"); + $v_result=1; + + if ($p_filename == "") + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file list parameter (invalid or empty list)"); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + + // ----- Calculate the stored filename + $v_stored_filename = $p_filename; + + // ----- Look for all path to remove + if ($p_remove_all_dir) { + $v_stored_filename = basename($p_filename); + } + // ----- Look for partial path remove + else if ($p_remove_dir != "") + { + if (substr($p_remove_dir, -1) != '/') + $p_remove_dir .= "/"; + + if ((substr($p_filename, 0, 2) == "./") || (substr($p_remove_dir, 0, 2) == "./")) + { + if ((substr($p_filename, 0, 2) == "./") && (substr($p_remove_dir, 0, 2) != "./")) + $p_remove_dir = "./".$p_remove_dir; + if ((substr($p_filename, 0, 2) != "./") && (substr($p_remove_dir, 0, 2) == "./")) + $p_remove_dir = substr($p_remove_dir, 2); + } + + $v_compare = PclZipUtilPathInclusion($p_remove_dir, $p_filename); + if ($v_compare > 0) +// if (substr($p_filename, 0, strlen($p_remove_dir)) == $p_remove_dir) + { + + if ($v_compare == 2) { + $v_stored_filename = ""; + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Path to remove is the current folder"); + } + else { + $v_stored_filename = substr($p_filename, strlen($p_remove_dir)); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Remove path '$p_remove_dir' in file '$p_filename' = '$v_stored_filename'"); + } + } + } + // ----- Look for path to add + if ($p_add_dir != "") + { + if (substr($p_add_dir, -1) == "/") + $v_stored_filename = $p_add_dir.$v_stored_filename; + else + $v_stored_filename = $p_add_dir."/".$v_stored_filename; + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Add path '$p_add_dir' in file '$p_filename' = '$v_stored_filename'"); + } + + // ----- Filename (reduce the path of stored name) + $v_stored_filename = PclZipUtilPathReduction($v_stored_filename); + + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Filename (reduced) '$v_stored_filename', strlen ".strlen($v_stored_filename)); + + // ----- Set the file properties + clearstatcache(); + $p_header['version'] = 20; + $p_header['version_extracted'] = 10; + $p_header['flag'] = 0; + $p_header['compression'] = 0; + $p_header['mtime'] = filemtime($p_filename); + $p_header['crc'] = 0; + $p_header['compressed_size'] = 0; + $p_header['size'] = filesize($p_filename); + $p_header['filename_len'] = strlen($p_filename); + $p_header['extra_len'] = 0; + $p_header['comment_len'] = 0; + $p_header['disk'] = 0; + $p_header['internal'] = 0; +// $p_header['external'] = (is_file($p_filename)?0xFE49FFE0:0x41FF0010); + $p_header['external'] = (is_file($p_filename)?0x00000000:0x00000010); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Header external extension '".sprintf("0x%X",$p_header['external'])."'"); + $p_header['offset'] = 0; + $p_header['filename'] = $p_filename; + $p_header['stored_filename'] = $v_stored_filename; + $p_header['extra'] = ''; + $p_header['comment'] = ''; + $p_header['status'] = 'ok'; + $p_header['index'] = -1; + + + // ----- Look for pre-add callback + if (isset($p_options[PCLZIP_CB_PRE_ADD])) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A pre-callback '".$p_options[PCLZIP_CB_PRE_ADD]."()') is defined for the extraction"); + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_header, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. + eval('$v_result = '.$p_options[PCLZIP_CB_PRE_ADD].'(PCLZIP_CB_PRE_ADD, $v_local_header);'); + if ($v_result == 0) { + // ----- Change the file status + $p_header['status'] = "skipped"; + $v_result = 1; + } + + // ----- Update the informations + // Only some fields can be modified + if ($p_header['stored_filename'] != $v_local_header['stored_filename']) { + $p_header['stored_filename'] = PclZipUtilPathReduction($v_local_header['stored_filename']); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "New stored filename is '".$p_header['stored_filename']."'"); + } + } + + // ----- Look for empty stored filename + if ($p_header['stored_filename'] == "") { + $p_header['status'] = "filtered"; + } + + // ----- Check the path length + if (strlen($p_header['stored_filename']) > 0xFF) { + $p_header['status'] = 'filename_too_long'; + } + + // ----- Look if no error, or file not skipped + if ($p_header['status'] == 'ok') { + + // ----- Look for a file + if (is_file($p_filename)) + { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "'".$p_filename."' is a file"); + // ----- Open the source file + if (($v_file = @fopen($p_filename, "rb")) == 0) { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + + if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File will not be compressed"); + // ----- Read the file content + $v_content_compressed = @fread($v_file, $p_header['size']); + + // ----- Calculate the CRC + $p_header['crc'] = @crc32($v_content_compressed); + + // ----- Set header parameters + $p_header['compressed_size'] = $p_header['size']; + $p_header['compression'] = 0; + } + else { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File will be compressed"); + // ----- Read the file content + $v_content = @fread($v_file, $p_header['size']); + + // ----- Calculate the CRC + $p_header['crc'] = @crc32($v_content); + + // ----- Compress the file + $v_content_compressed = @gzdeflate($v_content); + + // ----- Set header parameters + $p_header['compressed_size'] = strlen($v_content_compressed); + $p_header['compression'] = 8; + } + + // ----- Look for encryption + /* + if ((isset($p_options[PCLZIP_OPT_CRYPT])) + && ($p_options[PCLZIP_OPT_CRYPT] != "")) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File need to be crypted ...."); + + // Should be a random header + $v_header = 'xxxxxxxxxxxx'; + $v_content_compressed = PclZipUtilZipEncrypt($v_content_compressed, + $p_header['compressed_size'], + $v_header, + $p_header['crc'], + "test"); + + $p_header['compressed_size'] += 12; + $p_header['flag'] = 1; + + // ----- Add the header to the data + $v_content_compressed = $v_header.$v_content_compressed; + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Size after header : ".strlen($v_content_compressed).""); + } + */ + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { + @fclose($v_file); + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Write the compressed (or not) content + $v_binary_data = pack('a'.$p_header['compressed_size'], + $v_content_compressed); + @fwrite($this->zip_fd, $v_binary_data, $p_header['compressed_size']); + + // ----- Close the file + @fclose($v_file); + } + + // ----- Look for a directory + else { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "'".$p_filename."' is a folder"); + // ----- Look for directory last '/' + if (@substr($p_header['stored_filename'], -1) != '/') { + $p_header['stored_filename'] .= '/'; + } + + // ----- Set the file properties + $p_header['size'] = 0; + //$p_header['external'] = 0x41FF0010; // Value for a folder : to be checked + $p_header['external'] = 0x00000010; // Value for a folder : to be checked + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) + { + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + } + } + + // ----- Look for pre-add callback + if (isset($p_options[PCLZIP_CB_POST_ADD])) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A post-callback '".$p_options[PCLZIP_CB_POST_ADD]."()') is defined for the extraction"); + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_header, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. + eval('$v_result = '.$p_options[PCLZIP_CB_POST_ADD].'(PCLZIP_CB_POST_ADD, $v_local_header);'); + if ($v_result == 0) { + // ----- Ignored + $v_result = 1; + } + + // ----- Update the informations + // Nothing can be modified + } + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privWriteFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privWriteFileHeader(&$p_header) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privWriteFileHeader", 'file="'.$p_header['filename'].'", stored as "'.$p_header['stored_filename'].'"'); + $v_result=1; + + // TBC + //for(reset($p_header); $key = key($p_header); next($p_header)) { + // //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "header[$key] = ".$p_header[$key]); + //} + + // ----- Store the offset position of the file + $p_header['offset'] = ftell($this->zip_fd); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, 'File offset of the header :'.$p_header['offset']); + + // ----- Transform UNIX mtime to DOS format mdate/mtime + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Date : \''.date("d/m/y H:i:s", $p_header['mtime']).'\''); + $v_date = getdate($p_header['mtime']); + $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2; + $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday']; + + // ----- Packed data + $v_binary_data = pack("VvvvvvVVVvv", 0x04034b50, + $p_header['version_extracted'], $p_header['flag'], + $p_header['compression'], $v_mtime, $v_mdate, + $p_header['crc'], $p_header['compressed_size'], + $p_header['size'], + strlen($p_header['stored_filename']), + $p_header['extra_len']); + + // ----- Write the first 148 bytes of the header in the archive + fputs($this->zip_fd, $v_binary_data, 30); + + // ----- Write the variable fields + if (strlen($p_header['stored_filename']) != 0) + { + fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); + } + if ($p_header['extra_len'] != 0) + { + fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); + } + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privWriteCentralFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privWriteCentralFileHeader(&$p_header) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privWriteCentralFileHeader", 'file="'.$p_header['filename'].'", stored as "'.$p_header['stored_filename'].'"'); + $v_result=1; + + // TBC + //for(reset($p_header); $key = key($p_header); next($p_header)) { + // //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "header[$key] = ".$p_header[$key]); + //} + + // ----- Transform UNIX mtime to DOS format mdate/mtime + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Date : \''.date("d/m/y H:i:s", $p_header['mtime']).'\''); + $v_date = getdate($p_header['mtime']); + $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2; + $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday']; + + // ----- Packed data + $v_binary_data = pack("VvvvvvvVVVvvvvvVV", 0x02014b50, + $p_header['version'], $p_header['version_extracted'], + $p_header['flag'], $p_header['compression'], + $v_mtime, $v_mdate, $p_header['crc'], + $p_header['compressed_size'], $p_header['size'], + strlen($p_header['stored_filename']), + $p_header['extra_len'], $p_header['comment_len'], + $p_header['disk'], $p_header['internal'], + $p_header['external'], $p_header['offset']); + + // ----- Write the 42 bytes of the header in the zip file + fputs($this->zip_fd, $v_binary_data, 46); + + // ----- Write the variable fields + if (strlen($p_header['stored_filename']) != 0) + { + fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); + } + if ($p_header['extra_len'] != 0) + { + fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); + } + if ($p_header['comment_len'] != 0) + { + fputs($this->zip_fd, $p_header['comment'], $p_header['comment_len']); + } + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privWriteCentralHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privWriteCentralHeader($p_nb_entries, $p_size, $p_offset, $p_comment) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privWriteCentralHeader", 'nb_entries='.$p_nb_entries.', size='.$p_size.', offset='.$p_offset.', comment="'.$p_comment.'"'); + $v_result=1; + + // ----- Packed data + $v_binary_data = pack("VvvvvVVv", 0x06054b50, 0, 0, $p_nb_entries, + $p_nb_entries, $p_size, + $p_offset, strlen($p_comment)); + + // ----- Write the 22 bytes of the header in the zip file + fputs($this->zip_fd, $v_binary_data, 22); + + // ----- Write the variable fields + if (strlen($p_comment) != 0) + { + fputs($this->zip_fd, $p_comment, strlen($p_comment)); + } + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privList() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privList(&$p_list) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privList", "list"); + $v_result=1; + + // ----- Open the zip file + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode"); + if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode'); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Go to beginning of Central Dir + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Offset : ".$v_central_dir['offset']."'"); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Position in file : ".ftell($this->zip_fd)."'"); + @rewind($this->zip_fd); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Position in file : ".ftell($this->zip_fd)."'"); + if (@fseek($this->zip_fd, $v_central_dir['offset'])) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Position in file : ".ftell($this->zip_fd)."'"); + + // ----- Read each entry + for ($i=0; $i<$v_central_dir['entries']; $i++) + { + // ----- Read the file header + if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) + { + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + $v_header['index'] = $i; + + // ----- Get the only interesting attributes + $this->privConvertHeader2FileInfo($v_header, $p_list[$i]); + unset($v_header); + } + + // ----- Close the zip file + $this->privCloseFd(); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privConvertHeader2FileInfo() + // Description : + // This function takes the file informations from the central directory + // entries and extract the interesting parameters that will be given back. + // The resulting file infos are set in the array $p_info + // $p_info['filename'] : Filename with full path. Given by user (add), + // extracted in the filesystem (extract). + // $p_info['stored_filename'] : Stored filename in the archive. + // $p_info['size'] = Size of the file. + // $p_info['compressed_size'] = Compressed size of the file. + // $p_info['mtime'] = Last modification date of the file. + // $p_info['comment'] = Comment associated with the file. + // $p_info['folder'] = true/false : indicates if the entry is a folder or not. + // $p_info['status'] = status of the action on the file. + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privConvertHeader2FileInfo($p_header, &$p_info) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privConvertHeader2FileInfo", "Filename='".$p_header['filename']."'"); + $v_result=1; + + // ----- Get the interesting attributes + $p_info['filename'] = $p_header['filename']; + $p_info['stored_filename'] = $p_header['stored_filename']; + $p_info['size'] = $p_header['size']; + $p_info['compressed_size'] = $p_header['compressed_size']; + $p_info['mtime'] = $p_header['mtime']; + $p_info['comment'] = $p_header['comment']; + $p_info['folder'] = (($p_header['external']&0x00000010)==0x00000010); + $p_info['index'] = $p_header['index']; + $p_info['status'] = $p_header['status']; + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractByRule() + // Description : + // Extract a file or directory depending of rules (by index, by name, ...) + // Parameters : + // $p_file_list : An array where will be placed the properties of each + // extracted file + // $p_path : Path to add while writing the extracted files + // $p_remove_path : Path to remove (from the file memorized path) while writing the + // extracted files. If the path does not match the file path, + // the file is extracted with its memorized path. + // $p_remove_path does not apply to 'list' mode. + // $p_path and $p_remove_path are commulative. + // Return Values : + // 1 on success,0 or less on error (see error code list) + // -------------------------------------------------------------------------------- + function privExtractByRule(&$p_file_list, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privExtractByRule", "path='$p_path', remove_path='$p_remove_path', remove_all_path='".($p_remove_all_path?'true':'false')."'"); + $v_result=1; + + // ----- Check the path + if (($p_path == "") || ((substr($p_path, 0, 1) != "/") && (substr($p_path, 0, 3) != "../") && (substr($p_path,1,2)!=":/"))) + $p_path = "./".$p_path; + + // ----- Reduce the path last (and duplicated) '/' + if (($p_path != "./") && ($p_path != "/")) + { + // ----- Look for the path end '/' + while (substr($p_path, -1) == "/") + { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Destination path [$p_path] ends by '/'"); + $p_path = substr($p_path, 0, strlen($p_path)-1); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Modified to [$p_path]"); + } + } + + // ----- Look for path to remove format (should end by /) + if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/')) + { + $p_remove_path .= '/'; + } + $p_remove_path_size = strlen($p_remove_path); + + // ----- Open the zip file + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode"); + if (($v_result = $this->privOpenFd('rb')) != 1) + { + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Start at beginning of Central Dir + $v_pos_entry = $v_central_dir['offset']; + + // ----- Read each entry + $j_start = 0; + for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) + { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Read next file header entry : '$i'"); + + // ----- Read next Central dir entry + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Position before rewind : ".ftell($this->zip_fd)."'"); + @rewind($this->zip_fd); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Position after rewind : ".ftell($this->zip_fd)."'"); + if (@fseek($this->zip_fd, $v_pos_entry)) + { + // ----- Close the zip file + $this->privCloseFd(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Position after fseek : ".ftell($this->zip_fd)."'"); + + // ----- Read the file header + $v_header = array(); + if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Store the index + $v_header['index'] = $i; + + // ----- Store the file position + $v_pos_entry = ftell($this->zip_fd); + + // ----- Look for the specific extract rules + $v_extract = false; + + // ----- Look for extract by name rule + if ( (isset($p_options[PCLZIP_OPT_BY_NAME])) + && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByName'"); + + // ----- Look if the filename is in the list + for ($j=0; ($j strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) + && (substr($v_header['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The directory is in the file path"); + $v_extract = true; + } + } + // ----- Look for a filename + elseif ($v_header['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The file is the right one."); + $v_extract = true; + } + } + } + + // ----- Look for extract by ereg rule + else if ( (isset($p_options[PCLZIP_OPT_BY_EREG])) + && ($p_options[PCLZIP_OPT_BY_EREG] != "")) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract by ereg '".$p_options[PCLZIP_OPT_BY_EREG]."'"); + + if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header['stored_filename'])) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filename match the regular expression"); + $v_extract = true; + } + } + + // ----- Look for extract by preg rule + else if ( (isset($p_options[PCLZIP_OPT_BY_PREG])) + && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByEreg'"); + + if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header['stored_filename'])) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filename match the regular expression"); + $v_extract = true; + } + } + + // ----- Look for extract by index rule + else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX])) + && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByIndex'"); + + // ----- Look if the index is in the list + for ($j=$j_start; ($j=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Found as part of an index range"); + $v_extract = true; + } + if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Do not look this index range for next loop"); + $j_start = $j+1; + } + + if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Index range is greater than index, stop loop"); + break; + } + } + } + + // ----- Look for no rule, which means extract all the archive + else { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with no rule (extract all)"); + $v_extract = true; + } + + // ----- Check compression method + if ( ($v_extract) + && ( ($v_header['compression'] != 8) + && ($v_header['compression'] != 0))) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unsupported compression method (".$v_header['compression'].")"); + $v_header['status'] = 'unsupported_compression'; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped"); + + PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_COMPRESSION, + "Filename '".$v_header['stored_filename']."' is " + ."compressed by an unsupported compression " + ."method (".$v_header['compression'].") "); + + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + } + + // ----- Check encrypted files + if (($v_extract) && (($v_header['flag'] & 1) == 1)) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unsupported file encryption"); + $v_header['status'] = 'unsupported_encryption'; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped"); + + PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, + "Unsupported encryption for " + ." filename '".$v_header['stored_filename'] + ."'"); + + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + } + + // ----- Look for real extraction + if (($v_extract) && ($v_header['status'] != 'ok')) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "No need for extract"); + $v_result = $this->privConvertHeader2FileInfo($v_header, + $p_file_list[$v_nb_extracted++]); + if ($v_result != 1) { + $this->privCloseFd(); + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + $v_extract = false; + } + + // ----- Look for real extraction + if ($v_extract) + { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting file '".$v_header['filename']."', index '$i'"); + + // ----- Go to the file position + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position before rewind : ".ftell($this->zip_fd)."'"); + @rewind($this->zip_fd); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after rewind : ".ftell($this->zip_fd)."'"); + if (@fseek($this->zip_fd, $v_header['offset'])) + { + // ----- Close the zip file + $this->privCloseFd(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after fseek : ".ftell($this->zip_fd)."'"); + + // ----- Look for extraction as string + if ($p_options[PCLZIP_OPT_EXTRACT_AS_STRING]) { + + // ----- Extracting the file + $v_result1 = $this->privExtractFileAsString($v_header, $v_string); + if ($v_result1 < 1) { + $this->privCloseFd(); + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result1); + return $v_result1; + } + + // ----- Get the only interesting attributes + if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Set the file content + $p_file_list[$v_nb_extracted]['content'] = $v_string; + + // ----- Next extracted file + $v_nb_extracted++; + + // ----- Look for user callback abort + if ($v_result1 == 2) { + break; + } + } + // ----- Look for extraction in standard output + elseif ( (isset($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) + && ($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) { + // ----- Extracting the file in standard output + $v_result1 = $this->privExtractFileInOutput($v_header, $p_options); + if ($v_result1 < 1) { + $this->privCloseFd(); + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result1); + return $v_result1; + } + + // ----- Get the only interesting attributes + if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) { + $this->privCloseFd(); + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Look for user callback abort + if ($v_result1 == 2) { + break; + } + } + // ----- Look for normal extraction + else { + // ----- Extracting the file + $v_result1 = $this->privExtractFile($v_header, + $p_path, $p_remove_path, + $p_remove_all_path, + $p_options); + if ($v_result1 < 1) { + $this->privCloseFd(); + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result1); + return $v_result1; + } + + // ----- Get the only interesting attributes + if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Look for user callback abort + if ($v_result1 == 2) { + break; + } + } + } + } + + // ----- Close the zip file + $this->privCloseFd(); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFile() + // Description : + // Parameters : + // Return Values : + // + // 1 : ... ? + // PCLZIP_ERR_USER_ABORTED(2) : User ask for extraction stop in callback + // -------------------------------------------------------------------------------- + function privExtractFile(&$p_entry, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privExtractFile', "path='$p_path', remove_path='$p_remove_path', remove_all_path='".($p_remove_all_path?'true':'false')."'"); + $v_result=1; + + // ----- Read the file header + if (($v_result = $this->privReadFileHeader($v_header)) != 1) + { + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Found file '".$v_header['filename']."', size '".$v_header['size']."'"); + + // ----- Check that the file header is coherent with $p_entry info + if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { + // TBC + } + + // ----- Look for all path to remove + if ($p_remove_all_path == true) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "All path is removed"); + // ----- Get the basename of the path + $p_entry['filename'] = basename($p_entry['filename']); + } + + // ----- Look for path to remove + else if ($p_remove_path != "") + { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Look for some path to remove"); + if (PclZipUtilPathInclusion($p_remove_path, $p_entry['filename']) == 2) + { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "The folder is the same as the removed path '".$p_entry['filename']."'"); + + // ----- Change the file status + $p_entry['status'] = "filtered"; + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + $p_remove_path_size = strlen($p_remove_path); + if (substr($p_entry['filename'], 0, $p_remove_path_size) == $p_remove_path) + { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Found path '$p_remove_path' to remove in file '".$p_entry['filename']."'"); + + // ----- Remove the path + $p_entry['filename'] = substr($p_entry['filename'], $p_remove_path_size); + + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Resulting file is '".$p_entry['filename']."'"); + } + } + + // ----- Add the path + if ($p_path != '') + { + $p_entry['filename'] = $p_path."/".$p_entry['filename']; + } + + // ----- Look for pre-extract callback + if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A pre-callback '".$p_options[PCLZIP_CB_PRE_EXTRACT]."()') is defined for the extraction"); + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. + eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); + if ($v_result == 0) { + // ----- Change the file status + $p_entry['status'] = "skipped"; + $v_result = 1; + } + + // ----- Look for abort result + if ($v_result == 2) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "User callback abort the extraction"); + // ----- This status is internal and will be changed in 'skipped' + $p_entry['status'] = "aborted"; + $v_result = PCLZIP_ERR_USER_ABORTED; + } + + // ----- Update the informations + // Only some fields can be modified + $p_entry['filename'] = $v_local_header['filename']; + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "New filename is '".$p_entry['filename']."'"); + } + + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting file (with path) '".$p_entry['filename']."', size '$v_header[size]'"); + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Look for specific actions while the file exist + if (file_exists($p_entry['filename'])) + { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File '".$p_entry['filename']."' already exists"); + + // ----- Look if file is a directory + if (is_dir($p_entry['filename'])) + { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Existing file '".$p_entry['filename']."' is a directory"); + + // ----- Change the file status + $p_entry['status'] = "already_a_directory"; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + // For historical reason first PclZip implementation does not stop + // when this kind of error occurs. + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped"); + + PclZip::privErrorLog(PCLZIP_ERR_ALREADY_A_DIRECTORY, + "Filename '".$p_entry['filename']."' is " + ."already used by an existing directory"); + + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + } + // ----- Look if file is write protected + else if (!is_writeable($p_entry['filename'])) + { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Existing file '".$p_entry['filename']."' is write protected"); + + // ----- Change the file status + $p_entry['status'] = "write_protected"; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + // For historical reason first PclZip implementation does not stop + // when this kind of error occurs. + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped"); + + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, + "Filename '".$p_entry['filename']."' exists " + ."and is write protected"); + + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + } + + // ----- Look if the extracted file is older + else if (filemtime($p_entry['filename']) > $p_entry['mtime']) + { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Existing file '".$p_entry['filename']."' is newer (".date("l dS of F Y h:i:s A", filemtime($p_entry['filename'])).") than the extracted file (".date("l dS of F Y h:i:s A", $p_entry['mtime']).")"); + // ----- Change the file status + if ( (isset($p_options[PCLZIP_OPT_REPLACE_NEWER])) + && ($p_options[PCLZIP_OPT_REPLACE_NEWER]===true)) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_REPLACE_NEWER is selected, file will be replaced"); + } + else { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File will not be replaced"); + $p_entry['status'] = "newer_exist"; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + // For historical reason first PclZip implementation does not stop + // when this kind of error occurs. + if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "PCLZIP_OPT_STOP_ON_ERROR is selected, extraction will be stopped"); + + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, + "Newer version of '".$p_entry['filename']."' exists " + ."and option PCLZIP_OPT_REPLACE_NEWER is not selected"); + + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + } + } + else { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Existing file '".$p_entry['filename']."' is older than the extrated one - will be replaced by the extracted one (".date("l dS of F Y h:i:s A", filemtime($p_entry['filename'])).") than the extracted file (".date("l dS of F Y h:i:s A", $p_entry['mtime']).")"); + } + } + + // ----- Check the directory availability and create it if necessary + else { + if ((($p_entry['external']&0x00000010)==0x00000010) || (substr($p_entry['filename'], -1) == '/')) + $v_dir_to_check = $p_entry['filename']; + else if (!strstr($p_entry['filename'], "/")) + $v_dir_to_check = ""; + else + $v_dir_to_check = dirname($p_entry['filename']); + + if (($v_result = $this->privDirCheck($v_dir_to_check, (($p_entry['external']&0x00000010)==0x00000010))) != 1) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unable to create path for '".$p_entry['filename']."'"); + + // ----- Change the file status + $p_entry['status'] = "path_creation_fail"; + + // ----- Return + ////--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + //return $v_result; + $v_result = 1; + } + } + } + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Do the extraction (if not a folder) + if (!(($p_entry['external']&0x00000010)==0x00000010)) + { + // ----- Look for not compressed file + if ($p_entry['compression'] == 0) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting an un-compressed file"); + + // ----- Opening destination file + if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) + { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Error while opening '".$p_entry['filename']."' in write binary mode"); + + // ----- Change the file status + $p_entry['status'] = "write_error"; + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Read '".$p_entry['size']."' bytes"); + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = $p_entry['compressed_size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Read $v_read_size bytes"); + $v_buffer = fread($this->zip_fd, $v_read_size); + $v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($v_dest_file, $v_binary_data, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Closing the destination file + fclose($v_dest_file); + + // ----- Change the file mtime + touch($p_entry['filename'], $p_entry['mtime']); + + + } + else { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting a compressed file (Compression method ".$p_entry['compression'].")"); + // ----- TBC + // Need to be finished + if (($p_entry['flag'] & 1) == 1) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File is encrypted"); + /* + // ----- Read the encryption header + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Read 12 encryption header bytes"); + $v_encryption_header = @fread($this->zip_fd, 12); + + // ----- Read the encrypted & compressed file in a buffer + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Read '".($p_entry['compressed_size']-12)."' compressed & encrypted bytes"); + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']-12); + + // ----- Decrypt the buffer + $this->privDecrypt($v_encryption_header, $v_buffer, + $p_entry['compressed_size']-12, $p_entry['crc']); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Buffer is '".$v_buffer."'"); + */ + } + else { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Read '".$p_entry['compressed_size']."' compressed bytes"); + // ----- Read the compressed file in a buffer (one shot) + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + } + + // ----- Decompress the file + $v_file_content = @gzinflate($v_buffer); + unset($v_buffer); + if ($v_file_content === FALSE) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unable to inflate compressed file"); + + // ----- Change the file status + // TBC + $p_entry['status'] = "error"; + + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Opening destination file + if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Error while opening '".$p_entry['filename']."' in write binary mode"); + + // ----- Change the file status + $p_entry['status'] = "write_error"; + + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Write the uncompressed data + @fwrite($v_dest_file, $v_file_content, $p_entry['size']); + unset($v_file_content); + + // ----- Closing the destination file + @fclose($v_dest_file); + + // ----- Change the file mtime + @touch($p_entry['filename'], $p_entry['mtime']); + } + + // ----- Look for chmod option + if (isset($p_options[PCLZIP_OPT_SET_CHMOD])) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "chmod option activated '".$p_options[PCLZIP_OPT_SET_CHMOD]."'"); + + // ----- Change the mode of the file + @chmod($p_entry['filename'], $p_options[PCLZIP_OPT_SET_CHMOD]); + } + + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extraction done"); + } + } + + // ----- Change abort status + if ($p_entry['status'] == "aborted") { + $p_entry['status'] = "skipped"; + } + + // ----- Look for post-extract callback + elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A post-callback '".$p_options[PCLZIP_CB_POST_EXTRACT]."()') is defined for the extraction"); + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. + eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); + + // ----- Look for abort result + if ($v_result == 2) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "User callback abort the extraction"); + $v_result = PCLZIP_ERR_USER_ABORTED; + } + } + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFileInOutput() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privExtractFileInOutput(&$p_entry, &$p_options) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privExtractFileInOutput', ""); + $v_result=1; + + // ----- Read the file header + if (($v_result = $this->privReadFileHeader($v_header)) != 1) { + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Found file '".$v_header['filename']."', size '".$v_header['size']."'"); + + // ----- Check that the file header is coherent with $p_entry info + if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { + // TBC + } + + // ----- Look for pre-extract callback + if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A pre-callback '".$p_options[PCLZIP_CB_PRE_EXTRACT]."()') is defined for the extraction"); + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. + eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); + if ($v_result == 0) { + // ----- Change the file status + $p_entry['status'] = "skipped"; + $v_result = 1; + } + + // ----- Look for abort result + if ($v_result == 2) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "User callback abort the extraction"); + // ----- This status is internal and will be changed in 'skipped' + $p_entry['status'] = "aborted"; + $v_result = PCLZIP_ERR_USER_ABORTED; + } + + // ----- Update the informations + // Only some fields can be modified + $p_entry['filename'] = $v_local_header['filename']; + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "New filename is '".$p_entry['filename']."'"); + } + + // ----- Trace + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting file (with path) '".$p_entry['filename']."', size '$v_header[size]'"); + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Do the extraction (if not a folder) + if (!(($p_entry['external']&0x00000010)==0x00000010)) { + // ----- Look for not compressed file + if ($p_entry['compressed_size'] == $p_entry['size']) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting an un-compressed file"); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Reading '".$p_entry['size']."' bytes"); + + // ----- Read the file in a buffer (one shot) + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Send the file to the output + echo $v_buffer; + unset($v_buffer); + } + else { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting a compressed file"); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Reading '".$p_entry['size']."' bytes"); + + // ----- Read the compressed file in a buffer (one shot) + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Decompress the file + $v_file_content = gzinflate($v_buffer); + unset($v_buffer); + + // ----- Send the file to the output + echo $v_file_content; + unset($v_file_content); + } + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extraction done"); + } + } + + // ----- Change abort status + if ($p_entry['status'] == "aborted") { + $p_entry['status'] = "skipped"; + } + + // ----- Look for post-extract callback + elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "A post-callback '".$p_options[PCLZIP_CB_POST_EXTRACT]."()') is defined for the extraction"); + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. + eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); + + // ----- Look for abort result + if ($v_result == 2) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "User callback abort the extraction"); + $v_result = PCLZIP_ERR_USER_ABORTED; + } + } + + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFileAsString() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privExtractFileAsString(&$p_entry, &$p_string) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privExtractFileAsString', "p_entry['filename']='".$p_entry['filename']."'"); + $v_result=1; + + // ----- Read the file header + $v_header = array(); + if (($v_result = $this->privReadFileHeader($v_header)) != 1) + { + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Found file '".$v_header['filename']."', size '".$v_header['size']."'"); + + // ----- Check that the file header is coherent with $p_entry info + if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { + // TBC + } + + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting file in string (with path) '".$p_entry['filename']."', size '$v_header[size]'"); + + // ----- Do the extraction (if not a folder) + if (!(($p_entry['external']&0x00000010)==0x00000010)) + { + // ----- Look for not compressed file + if ($p_entry['compressed_size'] == $p_entry['size']) + { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting an un-compressed file"); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Reading '".$p_entry['size']."' bytes"); + + // ----- Reading the file + $p_string = @fread($this->zip_fd, $p_entry['compressed_size']); + } + else + { + // ----- Trace + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extracting a compressed file"); + + // ----- Reading the file + $v_data = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Decompress the file + if (($p_string = @gzinflate($v_data)) === FALSE) { + // TBC + } + } + + // ----- Trace + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Extraction done"); + } + else { + // TBC : error : can not extract a folder in a string + } + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privReadFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privReadFileHeader(&$p_header) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privReadFileHeader", ""); + $v_result=1; + + // ----- Read the 4 bytes signature + $v_binary_data = @fread($this->zip_fd, 4); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary data is : '".sprintf("%08x", $v_binary_data)."'"); + $v_data = unpack('Vid', $v_binary_data); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary signature is : '".sprintf("0x%08x", $v_data['id'])."'"); + + // ----- Check signature + if ($v_data['id'] != 0x04034b50) + { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Invalid File header"); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + + // ----- Read the first 42 bytes of the header + $v_binary_data = fread($this->zip_fd, 26); + + // ----- Look for invalid block size + if (strlen($v_binary_data) != 26) + { + $p_header['filename'] = ""; + $p_header['status'] = "invalid_header"; + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Invalid block size : ".strlen($v_binary_data)); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + + // ----- Extract the values + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Header : '".$v_binary_data."'"); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Header (Hex) : '".bin2hex($v_binary_data)."'"); + $v_data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $v_binary_data); + + // ----- Get filename + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "File name length : ".$v_data['filename_len']); + $p_header['filename'] = fread($this->zip_fd, $v_data['filename_len']); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Filename : \''.$p_header['filename'].'\''); + + // ----- Get extra_fields + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extra field length : ".$v_data['extra_len']); + if ($v_data['extra_len'] != 0) { + $p_header['extra'] = fread($this->zip_fd, $v_data['extra_len']); + } + else { + $p_header['extra'] = ''; + } + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Extra field : \''.bin2hex($p_header['extra']).'\''); + + // ----- Extract properties + $p_header['version_extracted'] = $v_data['version']; + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Version need to extract : ('.$p_header['version_extracted'].') \''.($p_header['version_extracted']/10).'.'.($p_header['version_extracted']%10).'\''); + $p_header['compression'] = $v_data['compression']; + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Compression method : \''.$p_header['compression'].'\''); + $p_header['size'] = $v_data['size']; + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Size : \''.$p_header['size'].'\''); + $p_header['compressed_size'] = $v_data['compressed_size']; + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Compressed Size : \''.$p_header['compressed_size'].'\''); + $p_header['crc'] = $v_data['crc']; + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'CRC : \''.sprintf("0x%X", $p_header['crc']).'\''); + $p_header['flag'] = $v_data['flag']; + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Flag : \''.$p_header['flag'].'\''); + + // ----- Recuperate date in UNIX format + $p_header['mdate'] = $v_data['mdate']; + $p_header['mtime'] = $v_data['mtime']; + if ($p_header['mdate'] && $p_header['mtime']) + { + // ----- Extract time + $v_hour = ($p_header['mtime'] & 0xF800) >> 11; + $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; + $v_seconde = ($p_header['mtime'] & 0x001F)*2; + + // ----- Extract date + $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; + $v_month = ($p_header['mdate'] & 0x01E0) >> 5; + $v_day = $p_header['mdate'] & 0x001F; + + // ----- Get UNIX date format + $p_header['mtime'] = mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); + + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Date : \''.date("d/m/y H:i:s", $p_header['mtime']).'\''); + } + else + { + $p_header['mtime'] = time(); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Date is actual : \''.date("d/m/y H:i:s", $p_header['mtime']).'\''); + } + + // TBC + //for(reset($v_data); $key = key($v_data); next($v_data)) { + // //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Attribut[$key] = ".$v_data[$key]); + //} + + // ----- Set the stored filename + $p_header['stored_filename'] = $p_header['filename']; + + // ----- Set the status field + $p_header['status'] = "ok"; + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privReadCentralFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privReadCentralFileHeader(&$p_header) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privReadCentralFileHeader", ""); + $v_result=1; + + // ----- Read the 4 bytes signature + $v_binary_data = @fread($this->zip_fd, 4); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary data is : '".sprintf("%08x", $v_binary_data)."'"); + $v_data = unpack('Vid', $v_binary_data); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary signature is : '".sprintf("0x%08x", $v_data['id'])."'"); + + // ----- Check signature + if ($v_data['id'] != 0x02014b50) + { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Invalid Central Dir File signature"); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + + // ----- Read the first 42 bytes of the header + $v_binary_data = fread($this->zip_fd, 42); + + // ----- Look for invalid block size + if (strlen($v_binary_data) != 42) + { + $p_header['filename'] = ""; + $p_header['status'] = "invalid_header"; + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Invalid block size : ".strlen($v_binary_data)); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + + // ----- Extract the values + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Header : '".$v_binary_data."'"); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Header (Hex) : '".bin2hex($v_binary_data)."'"); + $p_header = unpack('vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $v_binary_data); + + // ----- Get filename + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "File name length : ".$p_header['filename_len']); + if ($p_header['filename_len'] != 0) + $p_header['filename'] = fread($this->zip_fd, $p_header['filename_len']); + else + $p_header['filename'] = ''; + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Filename : \''.$p_header['filename'].'\''); + + // ----- Get extra + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Extra length : ".$p_header['extra_len']); + if ($p_header['extra_len'] != 0) + $p_header['extra'] = fread($this->zip_fd, $p_header['extra_len']); + else + $p_header['extra'] = ''; + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Extra : \''.$p_header['extra'].'\''); + + // ----- Get comment + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Comment length : ".$p_header['comment_len']); + if ($p_header['comment_len'] != 0) + $p_header['comment'] = fread($this->zip_fd, $p_header['comment_len']); + else + $p_header['comment'] = ''; + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Comment : \''.$p_header['comment'].'\''); + + // ----- Extract properties + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Version : \''.($p_header['version']/10).'.'.($p_header['version']%10).'\''); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Version need to extract : \''.($p_header['version_extracted']/10).'.'.($p_header['version_extracted']%10).'\''); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Size : \''.$p_header['size'].'\''); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Compressed Size : \''.$p_header['compressed_size'].'\''); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'CRC : \''.sprintf("0x%X", $p_header['crc']).'\''); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Flag : \''.$p_header['flag'].'\''); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Offset : \''.$p_header['offset'].'\''); + + // ----- Recuperate date in UNIX format + if ($p_header['mdate'] && $p_header['mtime']) + { + // ----- Extract time + $v_hour = ($p_header['mtime'] & 0xF800) >> 11; + $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; + $v_seconde = ($p_header['mtime'] & 0x001F)*2; + + // ----- Extract date + $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; + $v_month = ($p_header['mdate'] & 0x01E0) >> 5; + $v_day = $p_header['mdate'] & 0x001F; + + // ----- Get UNIX date format + $p_header['mtime'] = mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); + + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Date : \''.date("d/m/y H:i:s", $p_header['mtime']).'\''); + } + else + { + $p_header['mtime'] = time(); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Date is actual : \''.date("d/m/y H:i:s", $p_header['mtime']).'\''); + } + + // ----- Set the stored filename + $p_header['stored_filename'] = $p_header['filename']; + + // ----- Set default status to ok + $p_header['status'] = 'ok'; + + // ----- Look if it is a directory + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Internal (Hex) : '".sprintf("Ox%04X", $p_header['internal'])."'"); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "External (Hex) : '".sprintf("Ox%04X", $p_header['external'])."' (".(($p_header['external']&0x00000010)==0x00000010?'is a folder':'is a file').')'); + if (substr($p_header['filename'], -1) == '/') { + //$p_header['external'] = 0x41FF0010; + $p_header['external'] = 0x00000010; + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Force folder external : \''.sprintf("Ox%04X", $p_header['external']).'\''); + } + + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Header of filename : \''.$p_header['filename'].'\''); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCheckFileHeaders() + // Description : + // Parameters : + // Return Values : + // 1 on success, + // 0 on error; + // -------------------------------------------------------------------------------- + function privCheckFileHeaders(&$p_local_header, &$p_central_header) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privCheckFileHeaders", ""); + $v_result=1; + + // ----- Check the static values + // TBC + if ($p_local_header['filename'] != $p_central_header['filename']) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "filename" : TBC To Be Completed'); + } + if ($p_local_header['version_extracted'] != $p_central_header['version_extracted']) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "version_extracted" : TBC To Be Completed'); + } + if ($p_local_header['flag'] != $p_central_header['flag']) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "flag" : TBC To Be Completed'); + } + if ($p_local_header['compression'] != $p_central_header['compression']) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "compression" : TBC To Be Completed'); + } + if ($p_local_header['mtime'] != $p_central_header['mtime']) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "mtime" : TBC To Be Completed'); + } + if ($p_local_header['filename_len'] != $p_central_header['filename_len']) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Bad check "filename_len" : TBC To Be Completed'); + } + + // ----- Look for flag bit 3 + if (($p_local_header['flag'] & 8) == 8) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Purpose bit flag bit 3 set !'); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'File size, compression size and crc found in central header'); + $p_local_header['size'] = $p_central_header['size']; + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Size : \''.$p_local_header['size'].'\''); + $p_local_header['compressed_size'] = $p_central_header['compressed_size']; + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Compressed Size : \''.$p_local_header['compressed_size'].'\''); + $p_local_header['crc'] = $p_central_header['crc']; + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'CRC : \''.sprintf("0x%X", $p_local_header['crc']).'\''); + } + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privReadEndCentralDir() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privReadEndCentralDir(&$p_central_dir) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privReadEndCentralDir", ""); + $v_result=1; + + // ----- Go to the end of the zip file + $v_size = filesize($this->zipname); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Size of the file :$v_size"); + @fseek($this->zip_fd, $v_size); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Position at end of zip file : \''.ftell($this->zip_fd).'\''); + if (@ftell($this->zip_fd) != $v_size) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to go to the end of the archive \''.$this->zipname.'\''); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + + // ----- First try : look if this is an archive with no commentaries (most of the time) + // in this case the end of central dir is at 22 bytes of the file end + $v_found = 0; + if ($v_size > 26) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Look for central dir with no comment'); + @fseek($this->zip_fd, $v_size-22); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Position after min central position : \''.ftell($this->zip_fd).'\''); + if (($v_pos = @ftell($this->zip_fd)) != ($v_size-22)) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\''); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + + // ----- Read for bytes + $v_binary_data = @fread($this->zip_fd, 4); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Binary data is : '".sprintf("%08x", $v_binary_data)."'"); + $v_data = @unpack('Vid', $v_binary_data); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Binary signature is : '".sprintf("0x%08x", $v_data['id'])."'"); + + // ----- Check signature + if ($v_data['id'] == 0x06054b50) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Found central dir at the default position."); + $v_found = 1; + } + + $v_pos = ftell($this->zip_fd); + } + + // ----- Go back to the maximum possible size of the Central Dir End Record + if (!$v_found) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Start extended search of end central dir'); + $v_maximum_size = 65557; // 0xFFFF + 22; + if ($v_maximum_size > $v_size) + $v_maximum_size = $v_size; + @fseek($this->zip_fd, $v_size-$v_maximum_size); + if (@ftell($this->zip_fd) != ($v_size-$v_maximum_size)) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\''); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Position after max central position : \''.ftell($this->zip_fd).'\''); + + // ----- Read byte per byte in order to find the signature + $v_pos = ftell($this->zip_fd); + $v_bytes = 0x00000000; + while ($v_pos < $v_size) + { + // ----- Read a byte + $v_byte = @fread($this->zip_fd, 1); + + // ----- Add the byte + $v_bytes = ($v_bytes << 8) | Ord($v_byte); + + // ----- Compare the bytes + if ($v_bytes == 0x504b0506) + { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, 'Found End Central Dir signature at position : \''.ftell($this->zip_fd).'\''); + $v_pos++; + break; + } + + $v_pos++; + } + + // ----- Look if not found end of central dir + if ($v_pos == $v_size) + { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Unable to find End of Central Dir Record signature"); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Unable to find End of Central Dir Record signature"); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + } + + // ----- Read the first 18 bytes of the header + $v_binary_data = fread($this->zip_fd, 18); + + // ----- Look for invalid block size + if (strlen($v_binary_data) != 18) + { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "Invalid End of Central Dir Record size : ".strlen($v_binary_data)); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid End of Central Dir Record size : ".strlen($v_binary_data)); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + + // ----- Extract the values + ////--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Central Dir Record : '".$v_binary_data."'"); + ////--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Central Dir Record (Hex) : '".bin2hex($v_binary_data)."'"); + $v_data = unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data); + + // ----- Check the global size + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Comment length : ".$v_data['comment_size']); + if (($v_pos + $v_data['comment_size'] + 18) != $v_size) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "The central dir is not at the end of the archive. Some trailing bytes exists after the archive."); + + // ----- Removed in release 2.2 see readme file + // The check of the file size is a little too strict. + // Some bugs where found when a zip is encrypted/decrypted with 'crypt'. + // While decrypted, zip has training 0 bytes + if (0) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, + 'The central dir is not at the end of the archive.' + .' Some trailing bytes exists after the archive.'); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + } + + // ----- Get comment + if ($v_data['comment_size'] != 0) + $p_central_dir['comment'] = fread($this->zip_fd, $v_data['comment_size']); + else + $p_central_dir['comment'] = ''; + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Comment : \''.$p_central_dir['comment'].'\''); + + $p_central_dir['entries'] = $v_data['entries']; + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Nb of entries : \''.$p_central_dir['entries'].'\''); + $p_central_dir['disk_entries'] = $v_data['disk_entries']; + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Nb of entries for this disk : \''.$p_central_dir['disk_entries'].'\''); + $p_central_dir['offset'] = $v_data['offset']; + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Offset of Central Dir : \''.$p_central_dir['offset'].'\''); + $p_central_dir['size'] = $v_data['size']; + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Size of Central Dir : \''.$p_central_dir['size'].'\''); + $p_central_dir['disk'] = $v_data['disk']; + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Disk number : \''.$p_central_dir['disk'].'\''); + $p_central_dir['disk_start'] = $v_data['disk_start']; + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, 'Start disk number : \''.$p_central_dir['disk_start'].'\''); + + // TBC + //for(reset($p_central_dir); $key = key($p_central_dir); next($p_central_dir)) { + // //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "central_dir[$key] = ".$p_central_dir[$key]); + //} + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDeleteByRule() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privDeleteByRule(&$p_result_list, &$p_options) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privDeleteByRule", ""); + $v_result=1; + $v_list_detail = array(); + + // ----- Open the zip file + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode"); + if (($v_result=$this->privOpenFd('rb')) != 1) + { + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privCloseFd(); + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Go to beginning of File + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in file : ".ftell($this->zip_fd)."'"); + @rewind($this->zip_fd); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in file : ".ftell($this->zip_fd)."'"); + + // ----- Scan all the files + // ----- Start at beginning of Central Dir + $v_pos_entry = $v_central_dir['offset']; + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position before rewind : ".ftell($this->zip_fd)."'"); + @rewind($this->zip_fd); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after rewind : ".ftell($this->zip_fd)."'"); + if (@fseek($this->zip_fd, $v_pos_entry)) + { + // ----- Close the zip file + $this->privCloseFd(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after fseek : ".ftell($this->zip_fd)."'"); + + // ----- Read each entry + $v_header_list = array(); + $j_start = 0; + for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) + { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Read next file header entry (index '$i')"); + + // ----- Read the file header + $v_header_list[$v_nb_extracted] = array(); + if (($v_result = $this->privReadCentralFileHeader($v_header_list[$v_nb_extracted])) != 1) + { + // ----- Close the zip file + $this->privCloseFd(); + + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filename (index '$i') : '".$v_header_list[$v_nb_extracted]['stored_filename']."'"); + + // ----- Store the index + $v_header_list[$v_nb_extracted]['index'] = $i; + + // ----- Look for the specific extract rules + $v_found = false; + + // ----- Look for extract by name rule + if ( (isset($p_options[PCLZIP_OPT_BY_NAME])) + && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByName'"); + + // ----- Look if the filename is in the list + for ($j=0; ($j strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) + && (substr($v_header_list[$v_nb_extracted]['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The directory is in the file path"); + $v_found = true; + } + elseif ( (($v_header_list[$v_nb_extracted]['external']&0x00000010)==0x00000010) /* Indicates a folder */ + && ($v_header_list[$v_nb_extracted]['stored_filename'].'/' == $p_options[PCLZIP_OPT_BY_NAME][$j])) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The entry is the searched directory"); + $v_found = true; + } + } + // ----- Look for a filename + elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "The file is the right one."); + $v_found = true; + } + } + } + + // ----- Look for extract by ereg rule + else if ( (isset($p_options[PCLZIP_OPT_BY_EREG])) + && ($p_options[PCLZIP_OPT_BY_EREG] != "")) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract by ereg '".$p_options[PCLZIP_OPT_BY_EREG]."'"); + + if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header_list[$v_nb_extracted]['stored_filename'])) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filename match the regular expression"); + $v_found = true; + } + } + + // ----- Look for extract by preg rule + else if ( (isset($p_options[PCLZIP_OPT_BY_PREG])) + && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByEreg'"); + + if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header_list[$v_nb_extracted]['stored_filename'])) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Filename match the regular expression"); + $v_found = true; + } + } + + // ----- Look for extract by index rule + else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX])) + && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Extract with rule 'ByIndex'"); + + // ----- Look if the index is in the list + for ($j=$j_start; ($j=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Found as part of an index range"); + $v_found = true; + } + if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Do not look this index range for next loop"); + $j_start = $j+1; + } + + if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Index range is greater than index, stop loop"); + break; + } + } + } + + // ----- Look for deletion + if ($v_found) + { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File '".$v_header_list[$v_nb_extracted]['stored_filename']."', index '$i' need to be deleted"); + unset($v_header_list[$v_nb_extracted]); + } + else + { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 2, "File '".$v_header_list[$v_nb_extracted]['stored_filename']."', index '$i' will not be deleted"); + $v_nb_extracted++; + } + } + + // ----- Look if something need to be deleted + if ($v_nb_extracted > 0) { + + // ----- Creates a temporay file + $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; + + // ----- Creates a temporary zip archive + $v_temp_zip = new PclZip($v_zip_temp_name); + + // ----- Open the temporary zip file in write mode + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary write mode"); + if (($v_result = $v_temp_zip->privOpenFd('wb')) != 1) { + $this->privCloseFd(); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Look which file need to be kept + for ($i=0; $izip_fd)."'"); + @rewind($this->zip_fd); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after rewind : ".ftell($this->zip_fd)."'"); + if (@fseek($this->zip_fd, $v_header_list[$i]['offset'])) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position after fseek : ".ftell($this->zip_fd)."'"); + + // ----- Read the file header + $v_local_header = array(); + if (($v_result = $this->privReadFileHeader($v_local_header)) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Check that local file header is same as central file header + if ($this->privCheckFileHeaders($v_local_header, + $v_header_list[$i]) != 1) { + // TBC + } + unset($v_local_header); + + // ----- Write the file header + if (($v_result = $v_temp_zip->privWriteFileHeader($v_header_list[$i])) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Offset for this file is '".$v_header_list[$i]['offset']."'"); + + // ----- Read/write the data block + if (($v_result = PclZipUtilCopyBlock($this->zip_fd, $v_temp_zip->zip_fd, $v_header_list[$i]['compressed_size'])) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($v_temp_zip->zip_fd); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "New offset of central dir : $v_offset"); + + // ----- Re-Create the Central Dir files header + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Creates the new central directory"); + for ($i=0; $iprivWriteCentralFileHeader($v_header_list[$i])) != 1) { + $v_temp_zip->privCloseFd(); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Transform the header to a 'usable' info + $v_temp_zip->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); + } + + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Creates the central directory footer"); + + // ----- Zip file comment + $v_comment = ''; + if (isset($p_options[PCLZIP_OPT_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_COMMENT]; + } + + // ----- Calculate the size of the central header + $v_size = @ftell($v_temp_zip->zip_fd)-$v_offset; + + // ----- Create the central dir footer + if (($v_result = $v_temp_zip->privWriteCentralHeader(sizeof($v_header_list), $v_size, $v_offset, $v_comment)) != 1) { + // ----- Reset the file list + unset($v_header_list); + $v_temp_zip->privCloseFd(); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Close + $v_temp_zip->privCloseFd(); + $this->privCloseFd(); + + // ----- Delete the zip file + // TBC : I should test the result ... + @unlink($this->zipname); + + // ----- Rename the temporary file + // TBC : I should test the result ... + //@rename($v_zip_temp_name, $this->zipname); + PclZipUtilRename($v_zip_temp_name, $this->zipname); + + // ----- Destroy the temporary archive + unset($v_temp_zip); + } + + // ----- Remove every files : reset the file + else if ($v_central_dir['entries'] != 0) { + $this->privCloseFd(); + + if (($v_result = $this->privOpenFd('wb')) != 1) { + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + if (($v_result = $this->privWriteCentralHeader(0, 0, 0, '')) != 1) { + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + $this->privCloseFd(); + } + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDirCheck() + // Description : + // Check if a directory exists, if not it creates it and all the parents directory + // which may be useful. + // Parameters : + // $p_dir : Directory path to check. + // Return Values : + // 1 : OK + // -1 : Unable to create directory + // -------------------------------------------------------------------------------- + function privDirCheck($p_dir, $p_is_dir=false) + { + $v_result = 1; + + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privDirCheck", "entry='$p_dir', is_dir='".($p_is_dir?"true":"false")."'"); + + // ----- Remove the final '/' + if (($p_is_dir) && (substr($p_dir, -1)=='/')) + { + $p_dir = substr($p_dir, 0, strlen($p_dir)-1); + } + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Looking for entry '$p_dir'"); + + // ----- Check the directory availability + if ((is_dir($p_dir)) || ($p_dir == "")) + { + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, "'$p_dir' is a directory"); + return 1; + } + + // ----- Extract parent directory + $p_parent_dir = dirname($p_dir); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Parent directory is '$p_parent_dir'"); + + // ----- Just a check + if ($p_parent_dir != $p_dir) + { + // ----- Look for parent directory + if ($p_parent_dir != "") + { + if (($v_result = $this->privDirCheck($p_parent_dir)) != 1) + { + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + } + } + + // ----- Create the directory + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Create directory '$p_dir'"); + if (!@mkdir($p_dir, 0777)) + { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_DIR_CREATE_FAIL, "Unable to create directory '$p_dir'"); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result, "Directory '$p_dir' created"); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privMerge() + // Description : + // If $p_archive_to_add does not exist, the function exit with a success result. + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privMerge(&$p_archive_to_add) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privMerge", "archive='".$p_archive_to_add->zipname."'"); + $v_result=1; + + // ----- Look if the archive_to_add exists + if (!is_file($p_archive_to_add->zipname)) + { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Archive to add does not exist. End of merge."); + + // ----- Nothing to merge, so merge is a success + $v_result = 1; + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Look if the archive exists + if (!is_file($this->zipname)) + { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Archive does not exist, duplicate the archive_to_add."); + + // ----- Do a duplicate + $v_result = $this->privDuplicate($p_archive_to_add->zipname); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Open the zip file + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode"); + if (($v_result=$this->privOpenFd('rb')) != 1) + { + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) + { + $this->privCloseFd(); + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Go to beginning of File + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in zip : ".ftell($this->zip_fd)."'"); + @rewind($this->zip_fd); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in zip : ".ftell($this->zip_fd)."'"); + + // ----- Open the archive_to_add file + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open archive_to_add in binary read mode"); + if (($v_result=$p_archive_to_add->privOpenFd('rb')) != 1) + { + $this->privCloseFd(); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir_to_add = array(); + if (($v_result = $p_archive_to_add->privReadEndCentralDir($v_central_dir_to_add)) != 1) + { + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Go to beginning of File + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in archive_to_add : ".ftell($p_archive_to_add->zip_fd)."'"); + @rewind($p_archive_to_add->zip_fd); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Position in archive_to_add : ".ftell($p_archive_to_add->zip_fd)."'"); + + // ----- Creates a temporay file + $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; + + // ----- Open the temporary file in write mode + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode"); + if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) + { + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode'); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + + // ----- Copy the files from the archive to the temporary file + // TBC : Here I should better append the file and go back to erase the central dir + $v_size = $v_central_dir['offset']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes"); + $v_buffer = fread($this->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Copy the files from the archive_to_add into the temporary file + $v_size = $v_central_dir_to_add['offset']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes"); + $v_buffer = fread($p_archive_to_add->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($v_zip_temp_fd); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "New offset of central dir : $v_offset"); + + // ----- Copy the block of file headers from the old archive + $v_size = $v_central_dir['size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes"); + $v_buffer = @fread($this->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Copy the block of file headers from the archive_to_add + $v_size = $v_central_dir_to_add['size']; + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes"); + $v_buffer = @fread($p_archive_to_add->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Merge the file comments + $v_comment = $v_central_dir['comment'].' '.$v_central_dir_to_add['comment']; + + // ----- Calculate the size of the (new) central header + $v_size = @ftell($v_zip_temp_fd)-$v_offset; + + // ----- Swap the file descriptor + // Here is a trick : I swap the temporary fd with the zip fd, in order to use + // the following methods on the temporary fil and not the real archive fd + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Create the central dir footer + if (($v_result = $this->privWriteCentralHeader($v_central_dir['entries']+$v_central_dir_to_add['entries'], $v_size, $v_offset, $v_comment)) != 1) + { + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + @fclose($v_zip_temp_fd); + $this->zip_fd = null; + + // ----- Reset the file list + unset($v_header_list); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Swap back the file descriptor + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Close + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + + // ----- Close the temporary file + @fclose($v_zip_temp_fd); + + // ----- Delete the zip file + // TBC : I should test the result ... + @unlink($this->zipname); + + // ----- Rename the temporary file + // TBC : I should test the result ... + //@rename($v_zip_temp_name, $this->zipname); + PclZipUtilRename($v_zip_temp_name, $this->zipname); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDuplicate() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privDuplicate($p_archive_filename) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZip::privDuplicate", "archive_filename='$p_archive_filename'"); + $v_result=1; + + // ----- Look if the $p_archive_filename exists + if (!is_file($p_archive_filename)) + { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Archive to duplicate does not exist. End of duplicate."); + + // ----- Nothing to duplicate, so duplicate is a success. + $v_result = 1; + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Open the zip file + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode"); + if (($v_result=$this->privOpenFd('wb')) != 1) + { + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + + // ----- Open the temporary file in write mode + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 3, "Open file in binary read mode"); + if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0) + { + $this->privCloseFd(); + + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive file \''.$p_archive_filename.'\' in binary write mode'); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, PclZip::errorCode(), PclZip::errorInfo()); + return PclZip::errorCode(); + } + + // ----- Copy the files from the archive to the temporary file + // TBC : Here I should better append the file and go back to erase the central dir + $v_size = filesize($p_archive_filename); + while ($v_size != 0) + { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Read $v_read_size bytes"); + $v_buffer = fread($v_zip_temp_fd, $v_read_size); + @fwrite($this->zip_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Close + $this->privCloseFd(); + + // ----- Close the temporary file + @fclose($v_zip_temp_fd); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privErrorLog() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privErrorLog($p_error_code=0, $p_error_string='') + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + PclError($p_error_code, $p_error_string); + } + else { + $this->error_code = $p_error_code; + $this->error_string = $p_error_string; + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privErrorReset() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privErrorReset() + { + if (PCLZIP_ERROR_EXTERNAL == 1) { + PclErrorReset(); + } + else { + $this->error_code = 0; + $this->error_string = ''; + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDecrypt() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privDecrypt($p_encryption_header, &$p_buffer, $p_size, $p_crc) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, 'PclZip::privDecrypt', "size=".$p_size.""); + $v_result=1; + + // ----- To Be Modified ;-) + $v_pwd = "test"; + + $p_buffer = PclZipUtilZipDecrypt($p_buffer, $p_size, $p_encryption_header, + $p_crc, $v_pwd); + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + } + // End of class + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilPathReduction() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function PclZipUtilPathReduction($p_dir) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilPathReduction", "dir='$p_dir'"); + $v_result = ""; + + // ----- Look for not empty path + if ($p_dir != "") + { + // ----- Explode path by directory names + $v_list = explode("/", $p_dir); + + // ----- Study directories from last to first + for ($i=sizeof($v_list)-1; $i>=0; $i--) + { + // ----- Look for current path + if ($v_list[$i] == ".") + { + // ----- Ignore this directory + // Should be the first $i=0, but no check is done + } + else if ($v_list[$i] == "..") + { + // ----- Ignore it and ignore the $i-1 + $i--; + } + else if (($v_list[$i] == "") && ($i!=(sizeof($v_list)-1)) && ($i!=0)) + { + // ----- Ignore only the double '//' in path, + // but not the first and last '/' + } + else + { + $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?"/".$v_result:""); + } + } + } + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilPathInclusion() + // Description : + // This function indicates if the path $p_path is under the $p_dir tree. Or, + // said in an other way, if the file or sub-dir $p_path is inside the dir + // $p_dir. + // The function indicates also if the path is exactly the same as the dir. + // This function supports path with duplicated '/' like '//', but does not + // support '.' or '..' statements. + // Parameters : + // Return Values : + // 0 if $p_path is not inside directory $p_dir + // 1 if $p_path is inside directory $p_dir + // 2 if $p_path is exactly the same as $p_dir + // -------------------------------------------------------------------------------- + function PclZipUtilPathInclusion($p_dir, $p_path) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilPathInclusion", "dir='$p_dir', path='$p_path'"); + $v_result = 1; + + // ----- Explode dir and path by directory separator + $v_list_dir = explode("/", $p_dir); + $v_list_dir_size = sizeof($v_list_dir); + $v_list_path = explode("/", $p_path); + $v_list_path_size = sizeof($v_list_path); + + // ----- Study directories paths + $i = 0; + $j = 0; + while (($i < $v_list_dir_size) && ($j < $v_list_path_size) && ($v_result)) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Working on dir($i)='".$v_list_dir[$i]."' and path($j)='".$v_list_path[$j]."'"); + + // ----- Look for empty dir (path reduction) + if ($v_list_dir[$i] == '') { + $i++; + continue; + } + if ($v_list_path[$j] == '') { + $j++; + continue; + } + + // ----- Compare the items + if (($v_list_dir[$i] != $v_list_path[$j]) && ($v_list_dir[$i] != '') && ( $v_list_path[$j] != '')) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Items ($i,$j) are different"); + $v_result = 0; + } + + // ----- Next items + $i++; + $j++; + } + + // ----- Look if everything seems to be the same + if ($v_result) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Look for tie break"); + // ----- Skip all the empty items + while (($j < $v_list_path_size) && ($v_list_path[$j] == '')) $j++; + while (($i < $v_list_dir_size) && ($v_list_dir[$i] == '')) $i++; + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Looking on dir($i)='".($i < $v_list_dir_size?$v_list_dir[$i]:'')."' and path($j)='".($j < $v_list_path_size?$v_list_path[$j]:'')."'"); + + if (($i >= $v_list_dir_size) && ($j >= $v_list_path_size)) { + // ----- There are exactly the same + $v_result = 2; + } + else if ($i < $v_list_dir_size) { + // ----- The path is shorter than the dir + $v_result = 0; + } + } + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilCopyBlock() + // Description : + // Parameters : + // $p_mode : read/write compression mode + // 0 : src & dest normal + // 1 : src gzip, dest normal + // 2 : src normal, dest gzip + // 3 : src & dest gzip + // Return Values : + // -------------------------------------------------------------------------------- + function PclZipUtilCopyBlock($p_src, $p_dest, $p_size, $p_mode=0) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilCopyBlock", "size=$p_size, mode=$p_mode"); + $v_result = 1; + + if ($p_mode==0) + { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Src offset before read :".(@ftell($p_src))); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Dest offset before write :".(@ftell($p_dest))); + while ($p_size != 0) + { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes"); + $v_buffer = @fread($p_src, $v_read_size); + @fwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Src offset after read :".(@ftell($p_src))); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Dest offset after write :".(@ftell($p_dest))); + } + else if ($p_mode==1) + { + while ($p_size != 0) + { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes"); + $v_buffer = @gzread($p_src, $v_read_size); + @fwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } + else if ($p_mode==2) + { + while ($p_size != 0) + { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes"); + $v_buffer = @fread($p_src, $v_read_size); + @gzwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } + else if ($p_mode==3) + { + while ($p_size != 0) + { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 4, "Read $v_read_size bytes"); + $v_buffer = @gzread($p_src, $v_read_size); + @gzwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilRename() + // Description : + // This function tries to do a simple rename() function. If it fails, it + // tries to copy the $p_src file in a new $p_dest file and then unlink the + // first one. + // Parameters : + // $p_src : Old filename + // $p_dest : New filename + // Return Values : + // 1 on success, 0 on failure. + // -------------------------------------------------------------------------------- + function PclZipUtilRename($p_src, $p_dest) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilRename", "source=$p_src, destination=$p_dest"); + $v_result = 1; + + // ----- Try to rename the files + if (!@rename($p_src, $p_dest)) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Fail to rename file, try copy+unlink"); + + // ----- Try to copy & unlink the src + if (!@copy($p_src, $p_dest)) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Fail to copy file"); + $v_result = 0; + } + else if (!@unlink($p_src)) { + //--(MAGIC-PclTrace)--//PclTraceFctMessage(__FILE__, __LINE__, 5, "Fail to unlink old filename"); + $v_result = 0; + } + } + + // ----- Return + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilOptionText() + // Description : + // Translate option value in text. Mainly for debug purpose. + // Parameters : + // $p_option : the option value. + // Return Values : + // The option text value. + // -------------------------------------------------------------------------------- + function PclZipUtilOptionText($p_option) + { + //--(MAGIC-PclTrace)--//PclTraceFctStart(__FILE__, __LINE__, "PclZipUtilOptionText", "option='".$p_option."'"); + + $v_list = get_defined_constants(); + for (reset($v_list); $v_key = key($v_list); next($v_list)) { + $v_prefix = substr($v_key, 0, 10); + if ((($v_prefix == 'PCLZIP_OPT') || ($v_prefix == 'PCLZIP_CB_')) + && ($v_list[$v_key] == $p_option)) { + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_key); + return $v_key; + } + } + + $v_result = 'Unknown'; + + //--(MAGIC-PclTrace)--//PclTraceFctEnd(__FILE__, __LINE__, $v_result); + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : PclZipUtilTranslateWinPath() + // Description : + // Translate windows path by replacing '\' by '/' and optionally removing + // drive letter. + // Parameters : + // $p_path : path to translate. + // $p_remove_disk_letter : true | false + // Return Values : + // The path translated. + // -------------------------------------------------------------------------------- + function PclZipUtilTranslateWinPath($p_path, $p_remove_disk_letter=true) + { + if (stristr(php_uname(), 'windows')) { + // ----- Look for potential disk letter + if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) { + $p_path = substr($p_path, $v_position+1); + } + // ----- Change potential windows directory separator + if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0,1) == '\\')) { + $p_path = strtr($p_path, '\\', '/'); + } + } + return $p_path; + } + // -------------------------------------------------------------------------------- + + +?> diff --git a/e107_handlers/php_compatibility_handler.php b/e107_handlers/php_compatibility_handler.php new file mode 100644 index 000000000..bbde66e5c --- /dev/null +++ b/e107_handlers/php_compatibility_handler.php @@ -0,0 +1,79 @@ + 4.3.0, all functions that are used in e107, introduced in newer +// versions than that should be recreated in here for compatabilty reasons.. + +if (!function_exists('file_put_contents')) { + /** + * @return int + * @param string $filename + * @param mixed $data + * @desc Write a string to a file + */ + function file_put_contents($filename, $data) { + if (($h = @fopen($filename, 'w+')) === false) { + return false; + } + if (($bytes = @fwrite($h, $data)) === false) { + return false; + } + fclose($h); + return $bytes; + } +} + +if (!function_exists('stripos')) { + function stripos($haystack, $needle) { + $parts = explode(strtolower($needle), strtolower($haystack), 2); + if (count($parts) == 1) { + return false; + } + return strlen($parts[0]); + } +} + + + +if(!function_exists("mime_content_type")){ + function mime_content_type($filename){ + + $filename = basename($filename); + + $mime[".zip"] = "application/x-zip-compressed"; + $mime[".gif"] = "image/gif"; + $mime[".png"] = "image/x-png"; + $mime[".jpg"] = "image/jpeg"; + $mime[".jpeg"] = "image/jpeg"; + $mime[".tif"] = "image/tiff"; + $mime[".tiff"] = "image/tiff"; + $mime[".pdf"] = "application/pdf"; + $mime[".hqx"] = "application/mac-binhex40"; + $mime[".doc"] = "application/msword"; + $mime[".dot"] = "application/msword"; + $mime[".exe"] = "application/octet-stream"; + $mime[".au"] = "audio/basic"; + $mime[".snd"] = "audio/basic"; + $mime[".mid"] = "audio/mid"; + $mime[".mp3"] = "audio/mpeg"; + $mime[".aif"] = "audio/x-aiff"; + $mime[".ra"] = "audio/x-pn-realaudio"; + $mime[".ram"] = "audio/x-pn-realaudio"; + $mime[".wav"] = "audio/x-wav"; + $mime[".bmp"] = "image/bmp"; + $mime[".ra"] = "audio/x-pn-realaudio"; + $mime[".htm"] = "text/html"; + $mime[".html"] = "text/html"; + $mime[".css"] = "text/css"; + $mime[".txt"] = "text/plain"; + $mime[".mov"] = "video/quicktime"; + $mime[".mpg"] = "video/mpeg"; + $mime[".asx"] = "video/x-ms-asf"; + $mime[".avi"] = "video/x-msvideo"; + + $ext = strrchr($filename, '.'); + return $mime[$ext]; + } +} +?> \ No newline at end of file diff --git a/e107_handlers/phpmailer/class.phpmailer.php b/e107_handlers/phpmailer/class.phpmailer.php new file mode 100644 index 000000000..ccbcc9fb8 --- /dev/null +++ b/e107_handlers/phpmailer/class.phpmailer.php @@ -0,0 +1,1499 @@ +ContentType = "text/html"; + else + $this->ContentType = "text/plain"; + } + + /** + * Sets Mailer to send message using SMTP. + * @return void + */ + function IsSMTP() { + $this->Mailer = "smtp"; + } + + /** + * Sets Mailer to send message using PHP mail() function. + * @return void + */ + function IsMail() { + $this->Mailer = "mail"; + } + + /** + * Sets Mailer to send message using the $Sendmail program. + * @return void + */ + function IsSendmail() { + $this->Mailer = "sendmail"; + } + + /** + * Sets Mailer to send message using the qmail MTA. + * @return void + */ + function IsQmail() { + $this->Sendmail = "/var/qmail/bin/sendmail"; + $this->Mailer = "sendmail"; + } + + + ///////////////////////////////////////////////// + // RECIPIENT METHODS + ///////////////////////////////////////////////// + + /** + * Adds a "To" address. + * @param string $address + * @param string $name + * @return void + */ + function AddAddress($address, $name = "") { + $cur = count($this->to); + $this->to[$cur][0] = trim($address); + $this->to[$cur][1] = $name; + } + + /** + * Adds a "Cc" address. Note: this function works + * with the SMTP mailer on win32, not with the "mail" + * mailer. + * @param string $address + * @param string $name + * @return void + */ + function AddCC($address, $name = "") { + $cur = count($this->cc); + $this->cc[$cur][0] = trim($address); + $this->cc[$cur][1] = $name; + } + + /** + * Adds a "Bcc" address. Note: this function works + * with the SMTP mailer on win32, not with the "mail" + * mailer. + * @param string $address + * @param string $name + * @return void + */ + function AddBCC($address, $name = "") { + $cur = count($this->bcc); + $this->bcc[$cur][0] = trim($address); + $this->bcc[$cur][1] = $name; + } + + /** + * Adds a "Reply-to" address. + * @param string $address + * @param string $name + * @return void + */ + function AddReplyTo($address, $name = "") { + $cur = count($this->ReplyTo); + $this->ReplyTo[$cur][0] = trim($address); + $this->ReplyTo[$cur][1] = $name; + } + + + ///////////////////////////////////////////////// + // MAIL SENDING METHODS + ///////////////////////////////////////////////// + + /** + * Creates message and assigns Mailer. If the message is + * not sent successfully then it returns false. Use the ErrorInfo + * variable to view description of the error. + * @return bool + */ + function Send() { + $header = ""; + $body = ""; + $result = true; + + if((count($this->to) + count($this->cc) + count($this->bcc)) < 1) + { + $this->SetError($this->Lang("provide_address")); + return false; + } + + // Set whether the message is multipart/alternative + if(!empty($this->AltBody)) + $this->ContentType = "multipart/alternative"; + + $this->error_count = 0; // reset errors + $this->SetMessageType(); + $header .= $this->CreateHeader(); + $body = $this->CreateBody(); + + if($body == "") { return false; } + + // Choose the mailer + switch($this->Mailer) + { + case "sendmail": + $result = $this->SendmailSend($header, $body); + break; + case "mail": + $result = $this->MailSend($header, $body); + break; + case "smtp": + $result = $this->SmtpSend($header, $body); + break; + default: + $this->SetError($this->Mailer . $this->Lang("mailer_not_supported")); + $result = false; + break; + } + + return $result; + } + + /** + * Sends mail using the $Sendmail program. + * @access private + * @return bool + */ + function SendmailSend($header, $body) { + if ($this->Sender != "") + $sendmail = sprintf("%s -oi -f %s -t", $this->Sendmail, $this->Sender); + else + $sendmail = sprintf("%s -oi -t", $this->Sendmail); + + if(!@$mail = popen($sendmail, "w")) + { + $this->SetError($this->Lang("execute") . $this->Sendmail); + return false; + } + + fputs($mail, $header); + fputs($mail, $body); + + $result = pclose($mail) >> 8 & 0xFF; + if($result != 0) + { + $this->SetError($this->Lang("execute") . $this->Sendmail); + return false; + } + + return true; + } + + /** + * Sends mail using the PHP mail() function. + * @access private + * @return bool + */ + function MailSend($header, $body) { + $to = ""; + for($i = 0; $i < count($this->to); $i++) + { + if($i != 0) { $to .= ", "; } + $to .= $this->to[$i][0]; + } + + if ($this->Sender != "" && strlen(ini_get("safe_mode"))< 1) + { + $old_from = ini_get("sendmail_from"); + e107_ini_set("sendmail_from", $this->Sender); + $params = sprintf("-oi -f %s", $this->Sender); + $rt = @mail($to, $this->EncodeHeader($this->Subject), $body, + $header, $params); + } + else + $rt = @mail($to, $this->EncodeHeader($this->Subject), $body, $header); + + if (isset($old_from)) + e107_ini_set("sendmail_from", $old_from); + + if(!$rt) + { + $this->SetError($this->Lang("instantiate")); + return false; + } + + return true; + } + + /** + * Sends mail via SMTP using PhpSMTP (Author: + * Chris Ryan). Returns bool. Returns false if there is a + * bad MAIL FROM, RCPT, or DATA input. + * @access private + * @return bool + */ + function SmtpSend($header, $body) { + include_once($this->PluginDir . "class.smtp.php"); + $error = ""; + $bad_rcpt = array(); + + if(!$this->SmtpConnect()) + return false; + + $smtp_from = ($this->Sender == "") ? $this->From : $this->Sender; + if(!$this->smtp->Mail($smtp_from)) + { + $error = $this->Lang("from_failed") . $smtp_from; + $this->SetError($error); + $this->smtp->Reset(); + return false; + } + + // Attempt to send attach all recipients + for($i = 0; $i < count($this->to); $i++) + { + if(!$this->smtp->Recipient($this->to[$i][0])) + $bad_rcpt[] = $this->to[$i][0]; + } + for($i = 0; $i < count($this->cc); $i++) + { + if(!$this->smtp->Recipient($this->cc[$i][0])) + $bad_rcpt[] = $this->cc[$i][0]; + } + for($i = 0; $i < count($this->bcc); $i++) + { + if(!$this->smtp->Recipient($this->bcc[$i][0])) + $bad_rcpt[] = $this->bcc[$i][0]; + } + + if(count($bad_rcpt) > 0) // Create error message + { + for($i = 0; $i < count($bad_rcpt); $i++) + { + if($i != 0) { $error .= ", "; } + $error .= $bad_rcpt[$i]; + } + $error = $this->Lang("recipients_failed") . $error; + $this->SetError($error); + $this->smtp->Reset(); + return false; + } + + if(!$this->smtp->Data($header . $body)) + { + $this->SetError($this->Lang("data_not_accepted")); + $this->smtp->Reset(); + return false; + } + if($this->SMTPKeepAlive == true) + $this->smtp->Reset(); + else + $this->SmtpClose(); + + return true; + } + + /** + * Initiates a connection to an SMTP server. Returns false if the + * operation failed. + * @access private + * @return bool + */ + function SmtpConnect() { + if($this->smtp == NULL) { $this->smtp = new SMTP(); } + + $this->smtp->do_debug = $this->SMTPDebug; + $hosts = explode(";", $this->Host); + $index = 0; + $connection = ($this->smtp->Connected()); + + // Retry while there is no connection + while($index < count($hosts) && $connection == false) + { + if(strstr($hosts[$index], ":")) + list($host, $port) = explode(":", $hosts[$index]); + else + { + $host = $hosts[$index]; + $port = $this->Port; + } + + if($this->smtp->Connect($host, $port, $this->Timeout)) + { + if ($this->Helo != '') + $this->smtp->Hello($this->Helo); + else + $this->smtp->Hello($this->ServerHostname()); + + if($this->SMTPAuth) + { + if(!$this->smtp->Authenticate($this->Username, + $this->Password)) + { + $this->SetError($this->Lang("authenticate")); + $this->smtp->Reset(); + $connection = false; + } + } + $connection = true; + } + $index++; + } + if(!$connection) + $this->SetError($this->Lang("connect_host")); + + return $connection; + } + + /** + * Closes the active SMTP session if one exists. + * @return void + */ + function SmtpClose() { + if($this->smtp != NULL) + { + if($this->smtp->Connected()) + { + $this->smtp->Quit(); + $this->smtp->Close(); + } + } + } + + /** + * Sets the language for all class error messages. Returns false + * if it cannot load the language file. The default language type + * is English. + * @param string $lang_type Type of language (e.g. Portuguese: "br") + * @param string $lang_path Path to the language file directory + * @access public + * @return bool + */ + function SetLanguage($lang_type, $lang_path = "language/") { + if(file_exists($lang_path.'phpmailer.lang-'.$lang_type.'.php')) + include($lang_path.'phpmailer.lang-'.$lang_type.'.php'); + else if(file_exists($lang_path.'phpmailer.lang-en.php')) + include($lang_path.'phpmailer.lang-en.php'); + else + { + $this->SetError("Could not load language file"); + return false; + } + $this->language = $PHPMAILER_LANG; + + return true; + } + + ///////////////////////////////////////////////// + // MESSAGE CREATION METHODS + ///////////////////////////////////////////////// + + /** + * Creates recipient headers. + * @access private + * @return string + */ + function AddrAppend($type, $addr) { + $addr_str = $type . ": "; + $addr_str .= $this->AddrFormat($addr[0]); + if(count($addr) > 1) + { + for($i = 1; $i < count($addr); $i++) + $addr_str .= ", " . $this->AddrFormat($addr[$i]); + } + $addr_str .= $this->LE; + + return $addr_str; + } + + /** + * Formats an address correctly. + * @access private + * @return string + */ + function AddrFormat($addr) { + if(empty($addr[1])) + $formatted = $addr[0]; + else + { + $formatted = $this->EncodeHeader($addr[1], 'phrase') . " <" . + $addr[0] . ">"; + } + + return $formatted; + } + + /** + * Wraps message for use with mailers that do not + * automatically perform wrapping and for quoted-printable. + * Original written by philippe. + * @access private + * @return string + */ + function WrapText($message, $length, $qp_mode = false) { + $soft_break = ($qp_mode) ? sprintf(" =%s", $this->LE) : $this->LE; + + $message = $this->FixEOL($message); + if (substr($message, -1) == $this->LE) + $message = substr($message, 0, -1); + + $line = explode($this->LE, $message); + $message = ""; + for ($i=0 ;$i < count($line); $i++) + { + $line_part = explode(" ", $line[$i]); + $buf = ""; + for ($e = 0; $e $length)) + { + $space_left = $length - strlen($buf) - 1; + if ($e != 0) + { + if ($space_left > 20) + { + $len = $space_left; + if (substr($word, $len - 1, 1) == "=") + $len--; + elseif (substr($word, $len - 2, 1) == "=") + $len -= 2; + $part = substr($word, 0, $len); + $word = substr($word, $len); + $buf .= " " . $part; + $message .= $buf . sprintf("=%s", $this->LE); + } + else + { + $message .= $buf . $soft_break; + } + $buf = ""; + } + while (strlen($word) > 0) + { + $len = $length; + if (substr($word, $len - 1, 1) == "=") + $len--; + elseif (substr($word, $len - 2, 1) == "=") + $len -= 2; + $part = substr($word, 0, $len); + $word = substr($word, $len); + + if (strlen($word) > 0) + $message .= $part . sprintf("=%s", $this->LE); + else + $buf = $part; + } + } + else + { + $buf_o = $buf; + $buf .= ($e == 0) ? $word : (" " . $word); + + if (strlen($buf) > $length and $buf_o != "") + { + $message .= $buf_o . $soft_break; + $buf = $word; + } + } + } + $message .= $buf . $this->LE; + } + + return $message; + } + + /** + * Set the body wrapping. + * @access private + * @return void + */ + function SetWordWrap() { + if($this->WordWrap < 1) + return; + + switch($this->message_type) + { + case "alt": + // fall through + case "alt_attachments": + $this->AltBody = $this->WrapText($this->AltBody, $this->WordWrap); + break; + default: + $this->Body = $this->WrapText($this->Body, $this->WordWrap); + break; + } + } + + /** + * Assembles message header. + * @access private + * @return string + */ + function CreateHeader() { + $result = ""; + + // Set the boundaries + $uniq_id = md5(uniqid(time())); + $this->boundary[1] = "b1_" . $uniq_id; + $this->boundary[2] = "b2_" . $uniq_id; + + $result .= $this->HeaderLine("Date", $this->RFCDate()); + if($this->Sender == "") + $result .= $this->HeaderLine("Return-Path", trim($this->From)); + else + $result .= $this->HeaderLine("Return-Path", trim($this->Sender)); + + // To be created automatically by mail() + if($this->Mailer != "mail") + { + if(count($this->to) > 0) + $result .= $this->AddrAppend("To", $this->to); + else if (count($this->cc) == 0) + $result .= $this->HeaderLine("To", "undisclosed-recipients:;"); + if(count($this->cc) > 0) + $result .= $this->AddrAppend("Cc", $this->cc); + } + + $from = array(); + $from[0][0] = trim($this->From); + $from[0][1] = $this->FromName; + $result .= $this->AddrAppend("From", $from); + + // sendmail and mail() extract Bcc from the header before sending + if((($this->Mailer == "sendmail") || ($this->Mailer == "mail")) && (count($this->bcc) > 0)) + $result .= $this->AddrAppend("Bcc", $this->bcc); + + if(count($this->ReplyTo) > 0) + $result .= $this->AddrAppend("Reply-to", $this->ReplyTo); + + // mail() sets the subject itself + if($this->Mailer != "mail") + $result .= $this->HeaderLine("Subject", $this->EncodeHeader(trim($this->Subject))); + + $result .= sprintf("Message-ID: <%s@%s>%s", $uniq_id, $this->ServerHostname(), $this->LE); + $result .= $this->HeaderLine("X-Priority", $this->Priority); + $result .= $this->HeaderLine("X-Mailer", "PHPMailer [version " . $this->Version . "]"); + + if($this->ConfirmReadingTo != "") + { + $result .= $this->HeaderLine("Disposition-Notification-To", + "<" . trim($this->ConfirmReadingTo) . ">"); + } + + // Add custom headers + for($index = 0; $index < count($this->CustomHeader); $index++) + { + $result .= $this->HeaderLine(trim($this->CustomHeader[$index][0]), + $this->EncodeHeader(trim($this->CustomHeader[$index][1]))); + } + $result .= $this->HeaderLine("MIME-Version", "1.0"); + + switch($this->message_type) + { + case "plain": + $result .= $this->HeaderLine("Content-Transfer-Encoding", $this->Encoding); + $result .= sprintf("Content-Type: %s; charset=\"%s\"", + $this->ContentType, $this->CharSet); + break; + case "attachments": + // fall through + case "alt_attachments": + if($this->InlineImageExists()) + { + $result .= sprintf("Content-Type: %s;%s\ttype=\"text/html\";%s\tboundary=\"%s\"%s", + "multipart/related", $this->LE, $this->LE, + $this->boundary[1], $this->LE); + } + else + { + $result .= $this->HeaderLine("Content-Type", "multipart/mixed;"); + $result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"'); + } + break; + case "alt": + $result .= $this->HeaderLine("Content-Type", "multipart/alternative;"); + $result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"'); + break; + } + + if($this->Mailer != "mail") + $result .= $this->LE.$this->LE; + + return $result; + } + + /** + * Assembles the message body. Returns an empty string on failure. + * @access private + * @return string + */ + function CreateBody() { + $result = ""; + + $this->SetWordWrap(); + + switch($this->message_type) + { + case "alt": + $result .= $this->GetBoundary($this->boundary[1], "", + "text/plain", ""); + $result .= $this->EncodeString($this->AltBody, $this->Encoding); + $result .= $this->LE.$this->LE; + $result .= $this->GetBoundary($this->boundary[1], "", + "text/html", ""); + + $result .= $this->EncodeString($this->Body, $this->Encoding); + $result .= $this->LE.$this->LE; + + $result .= $this->EndBoundary($this->boundary[1]); + break; + case "plain": + $result .= $this->EncodeString($this->Body, $this->Encoding); + break; + case "attachments": + $result .= $this->GetBoundary($this->boundary[1], "", "", ""); + $result .= $this->EncodeString($this->Body, $this->Encoding); + $result .= $this->LE; + + $result .= $this->AttachAll(); + break; + case "alt_attachments": + $result .= sprintf("--%s%s", $this->boundary[1], $this->LE); + $result .= sprintf("Content-Type: %s;%s" . + "\tboundary=\"%s\"%s", + "multipart/alternative", $this->LE, + $this->boundary[2], $this->LE.$this->LE); + + // Create text body + $result .= $this->GetBoundary($this->boundary[2], "", + "text/plain", "") . $this->LE; + + $result .= $this->EncodeString($this->AltBody, $this->Encoding); + $result .= $this->LE.$this->LE; + + // Create the HTML body + $result .= $this->GetBoundary($this->boundary[2], "", + "text/html", "") . $this->LE; + + $result .= $this->EncodeString($this->Body, $this->Encoding); + $result .= $this->LE.$this->LE; + + $result .= $this->EndBoundary($this->boundary[2]); + + $result .= $this->AttachAll(); + break; + } + if($this->IsError()) + $result = ""; + + return $result; + } + + /** + * Returns the start of a message boundary. + * @access private + */ + function GetBoundary($boundary, $charSet, $contentType, $encoding) { + $result = ""; + if($charSet == "") { $charSet = $this->CharSet; } + if($contentType == "") { $contentType = $this->ContentType; } + if($encoding == "") { $encoding = $this->Encoding; } + + $result .= $this->TextLine("--" . $boundary); + $result .= sprintf("Content-Type: %s; charset = \"%s\"", + $contentType, $charSet); + $result .= $this->LE; + $result .= $this->HeaderLine("Content-Transfer-Encoding", $encoding); + $result .= $this->LE; + + return $result; + } + + /** + * Returns the end of a message boundary. + * @access private + */ + function EndBoundary($boundary) { + return $this->LE . "--" . $boundary . "--" . $this->LE; + } + + /** + * Sets the message type. + * @access private + * @return void + */ + function SetMessageType() { + if(count($this->attachment) < 1 && strlen($this->AltBody) < 1) + $this->message_type = "plain"; + else + { + if(count($this->attachment) > 0) + $this->message_type = "attachments"; + if(strlen($this->AltBody) > 0 && count($this->attachment) < 1) + $this->message_type = "alt"; + if(strlen($this->AltBody) > 0 && count($this->attachment) > 0) + $this->message_type = "alt_attachments"; + } + } + + /** + * Returns a formatted header line. + * @access private + * @return string + */ + function HeaderLine($name, $value) { + return $name . ": " . $value . $this->LE; + } + + /** + * Returns a formatted mail line. + * @access private + * @return string + */ + function TextLine($value) { + return $value . $this->LE; + } + + ///////////////////////////////////////////////// + // ATTACHMENT METHODS + ///////////////////////////////////////////////// + + /** + * Adds an attachment from a path on the filesystem. + * Returns false if the file could not be found + * or accessed. + * @param string $path Path to the attachment. + * @param string $name Overrides the attachment name. + * @param string $encoding File encoding (see $Encoding). + * @param string $type File extension (MIME) type. + * @return bool + */ + function AddAttachment($path, $name = "", $encoding = "base64", + $type = "application/octet-stream") { + if(!@is_file($path)) + { + $this->SetError($this->Lang("file_access") . $path); + return false; + } + + $filename = basename($path); + if($name == "") + $name = $filename; + + $cur = count($this->attachment); + $this->attachment[$cur][0] = $path; + $this->attachment[$cur][1] = $filename; + $this->attachment[$cur][2] = $name; + $this->attachment[$cur][3] = $encoding; + $this->attachment[$cur][4] = $type; + $this->attachment[$cur][5] = false; // isStringAttachment + $this->attachment[$cur][6] = "attachment"; + $this->attachment[$cur][7] = 0; + + return true; + } + + /** + * Attaches all fs, string, and binary attachments to the message. + * Returns an empty string on failure. + * @access private + * @return string + */ + function AttachAll() { + // Return text of body + $mime = array(); + + // Add all attachments + for($i = 0; $i < count($this->attachment); $i++) + { + // Check for string attachment + $bString = $this->attachment[$i][5]; + if ($bString) + $string = $this->attachment[$i][0]; + else + $path = $this->attachment[$i][0]; + + $filename = $this->attachment[$i][1]; + $name = $this->attachment[$i][2]; + $encoding = $this->attachment[$i][3]; + $type = $this->attachment[$i][4]; + $disposition = $this->attachment[$i][6]; + $cid = $this->attachment[$i][7]; + + $mime[] = sprintf("--%s%s", $this->boundary[1], $this->LE); + $mime[] = sprintf("Content-Type: %s; name=\"%s\"%s", $type, $name, $this->LE); + $mime[] = sprintf("Content-Transfer-Encoding: %s%s", $encoding, $this->LE); + + if($disposition == "inline") + $mime[] = sprintf("Content-ID: <%s>%s", $cid, $this->LE); + + $mime[] = sprintf("Content-Disposition: %s; filename=\"%s\"%s", + $disposition, $name, $this->LE.$this->LE); + + // Encode as string attachment + if($bString) + { + $mime[] = $this->EncodeString($string, $encoding); + if($this->IsError()) { return ""; } + $mime[] = $this->LE.$this->LE; + } + else + { + $mime[] = $this->EncodeFile($path, $encoding); + if($this->IsError()) { return ""; } + $mime[] = $this->LE.$this->LE; + } + } + + $mime[] = sprintf("--%s--%s", $this->boundary[1], $this->LE); + + return join("", $mime); + } + + /** + * Encodes attachment in requested format. Returns an + * empty string on failure. + * @access private + * @return string + */ + function EncodeFile ($path, $encoding = "base64") { + if(!@$fd = fopen($path, "rb")) + { + $this->SetError($this->Lang("file_open") . $path); + return ""; + } + $magic_quotes = get_magic_quotes_runtime(); + set_magic_quotes_runtime(0); + $file_buffer = fread($fd, filesize($path)); + $file_buffer = $this->EncodeString($file_buffer, $encoding); + fclose($fd); + set_magic_quotes_runtime($magic_quotes); + + return $file_buffer; + } + + /** + * Encodes string to requested format. Returns an + * empty string on failure. + * @access private + * @return string + */ + function EncodeString ($str, $encoding = "base64") { + $encoded = ""; + switch(strtolower($encoding)) { + case "base64": + // chunk_split is found in PHP >= 3.0.6 + $encoded = chunk_split(base64_encode($str), 76, $this->LE); + break; + case "7bit": + case "8bit": + $encoded = $this->FixEOL($str); + if (substr($encoded, -(strlen($this->LE))) != $this->LE) + $encoded .= $this->LE; + break; + case "binary": + $encoded = $str; + break; + case "quoted-printable": + $encoded = $this->EncodeQP($str); + break; + default: + $this->SetError($this->Lang("encoding") . $encoding); + break; + } + return $encoded; + } + + /** + * Encode a header string to best of Q, B, quoted or none. + * @access private + * @return string + */ + function EncodeHeader ($str, $position = 'text') { + $x = 0; + + switch (strtolower($position)) { + case 'phrase': + if (!preg_match('/[\200-\377]/', $str)) { + // Can't use addslashes as we don't know what value has magic_quotes_sybase. + $encoded = addcslashes($str, "\0..\37\177\\\""); + + if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) + return ($encoded); + else + return ("\"$encoded\""); + } + $x = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches); + break; + case 'comment': + $x = preg_match_all('/[()"]/', $str, $matches); + // Fall-through + case 'text': + default: + $x += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches); + break; + } + + if ($x == 0) + return ($str); + + $maxlen = 75 - 7 - strlen($this->CharSet); + // Try to select the encoding which should produce the shortest output + if (strlen($str)/3 < $x) { + $encoding = 'B'; + $encoded = base64_encode($str); + $maxlen -= $maxlen % 4; + $encoded = trim(chunk_split($encoded, $maxlen, "\n")); + } else { + $encoding = 'Q'; + $encoded = $this->EncodeQ($str, $position); + $encoded = $this->WrapText($encoded, $maxlen, true); + $encoded = str_replace("=".$this->LE, "\n", trim($encoded)); + } + + $encoded = preg_replace('/^(.*)$/m', " =?".$this->CharSet."?$encoding?\\1?=", $encoded); + $encoded = trim(str_replace("\n", $this->LE, $encoded)); + + return $encoded; + } + + /** + * Encode string to quoted-printable. + * @access private + * @return string + */ + function EncodeQP ($str) { + $encoded = $this->FixEOL($str); + if (substr($encoded, -(strlen($this->LE))) != $this->LE) + $encoded .= $this->LE; + + // Replace every high ascii, control and = characters + $encoded = preg_replace('/([\000-\010\013\014\016-\037\075\177-\377])/e', + "'='.sprintf('%02X', ord('\\1'))", $encoded); + // Replace every spaces and tabs when it's the last character on a line + $encoded = preg_replace("/([\011\040])".$this->LE."/e", + "'='.sprintf('%02X', ord('\\1')).'".$this->LE."'", $encoded); + + // Maximum line length of 76 characters before CRLF (74 + space + '=') + $encoded = $this->WrapText($encoded, 74, true); + + return $encoded; + } + + /** + * Encode string to q encoding. + * @access private + * @return string + */ + function EncodeQ ($str, $position = "text") { + // There should not be any EOL in the string + $encoded = preg_replace("[\r\n]", "", $str); + + switch (strtolower($position)) { + case "phrase": + $encoded = preg_replace("/([^A-Za-z0-9!*+\/ -])/e", "'='.sprintf('%02X', ord('\\1'))", $encoded); + break; + case "comment": + $encoded = preg_replace("/([\(\)\"])/e", "'='.sprintf('%02X', ord('\\1'))", $encoded); + case "text": + default: + // Replace every high ascii, control =, ? and _ characters + $encoded = preg_replace('/([\000-\011\013\014\016-\037\075\077\137\177-\377])/e', + "'='.sprintf('%02X', ord('\\1'))", $encoded); + break; + } + + // Replace every spaces to _ (more readable than =20) + $encoded = str_replace(" ", "_", $encoded); + + return $encoded; + } + + /** + * Adds a string or binary attachment (non-filesystem) to the list. + * This method can be used to attach ascii or binary data, + * such as a BLOB record from a database. + * @param string $string String attachment data. + * @param string $filename Name of the attachment. + * @param string $encoding File encoding (see $Encoding). + * @param string $type File extension (MIME) type. + * @return void + */ + function AddStringAttachment($string, $filename, $encoding = "base64", + $type = "application/octet-stream") { + // Append to $attachment array + $cur = count($this->attachment); + $this->attachment[$cur][0] = $string; + $this->attachment[$cur][1] = $filename; + $this->attachment[$cur][2] = $filename; + $this->attachment[$cur][3] = $encoding; + $this->attachment[$cur][4] = $type; + $this->attachment[$cur][5] = true; // isString + $this->attachment[$cur][6] = "attachment"; + $this->attachment[$cur][7] = 0; + } + + /** + * Adds an embedded attachment. This can include images, sounds, and + * just about any other document. Make sure to set the $type to an + * image type. For JPEG images use "image/jpeg" and for GIF images + * use "image/gif". + * @param string $path Path to the attachment. + * @param string $cid Content ID of the attachment. Use this to identify + * the Id for accessing the image in an HTML form. + * @param string $name Overrides the attachment name. + * @param string $encoding File encoding (see $Encoding). + * @param string $type File extension (MIME) type. + * @return bool + */ + function AddEmbeddedImage($path, $cid, $name = "", $encoding = "base64", + $type = "application/octet-stream") { + + if(!@is_file($path)) + { + $this->SetError($this->Lang("file_access") . $path); + return false; + } + + $filename = basename($path); + if($name == "") + $name = $filename; + + // Append to $attachment array + $cur = count($this->attachment); + $this->attachment[$cur][0] = $path; + $this->attachment[$cur][1] = $filename; + $this->attachment[$cur][2] = $name; + $this->attachment[$cur][3] = $encoding; + $this->attachment[$cur][4] = $type; + $this->attachment[$cur][5] = false; // isStringAttachment + $this->attachment[$cur][6] = "inline"; + $this->attachment[$cur][7] = $cid; + + return true; + } + + /** + * Returns true if an inline attachment is present. + * @access private + * @return bool + */ + function InlineImageExists() { + $result = false; + for($i = 0; $i < count($this->attachment); $i++) + { + if($this->attachment[$i][6] == "inline") + { + $result = true; + break; + } + } + + return $result; + } + + ///////////////////////////////////////////////// + // MESSAGE RESET METHODS + ///////////////////////////////////////////////// + + /** + * Clears all recipients assigned in the TO array. Returns void. + * @return void + */ + function ClearAddresses() { + $this->to = array(); + } + + /** + * Clears all recipients assigned in the CC array. Returns void. + * @return void + */ + function ClearCCs() { + $this->cc = array(); + } + + /** + * Clears all recipients assigned in the BCC array. Returns void. + * @return void + */ + function ClearBCCs() { + $this->bcc = array(); + } + + /** + * Clears all recipients assigned in the ReplyTo array. Returns void. + * @return void + */ + function ClearReplyTos() { + $this->ReplyTo = array(); + } + + /** + * Clears all recipients assigned in the TO, CC and BCC + * array. Returns void. + * @return void + */ + function ClearAllRecipients() { + $this->to = array(); + $this->cc = array(); + $this->bcc = array(); + } + + /** + * Clears all previously set filesystem, string, and binary + * attachments. Returns void. + * @return void + */ + function ClearAttachments() { + $this->attachment = array(); + } + + /** + * Clears all custom headers. Returns void. + * @return void + */ + function ClearCustomHeaders() { + $this->CustomHeader = array(); + } + + + ///////////////////////////////////////////////// + // MISCELLANEOUS METHODS + ///////////////////////////////////////////////// + + /** + * Adds the error message to the error container. + * Returns void. + * @access private + * @return void + */ + function SetError($msg) { + $this->error_count++; + $this->ErrorInfo = $msg; + } + + /** + * Returns the proper RFC 822 formatted date. + * @access private + * @return string + */ + function RFCDate() { + $tz = date("Z"); + $tzs = ($tz < 0) ? "-" : "+"; + $tz = abs($tz); + $tz = ($tz/3600)*100 + ($tz%3600)/60; + $result = sprintf("%s %s%04d", date("D, j M Y H:i:s"), $tzs, $tz); + + return $result; + } + + /** + * Returns the appropriate server variable. Should work with both + * PHP 4.1.0+ as well as older versions. Returns an empty string + * if nothing is found. + * @access private + * @return mixed + */ + function ServerVar($varName) { + global $HTTP_SERVER_VARS; + global $HTTP_ENV_VARS; + + if(!isset($_SERVER)) + { + $_SERVER = $HTTP_SERVER_VARS; + if(!isset($_SERVER["REMOTE_ADDR"])) + $_SERVER = $HTTP_ENV_VARS; // must be Apache + } + + if(isset($_SERVER[$varName])) + return $_SERVER[$varName]; + else + return ""; + } + + /** + * Returns the server hostname or 'localhost.localdomain' if unknown. + * @access private + * @return string + */ + function ServerHostname() { + if ($this->Hostname != "") + $result = $this->Hostname; + elseif ($this->ServerVar('SERVER_NAME') != "") + $result = $this->ServerVar('SERVER_NAME'); + else + $result = "localhost.localdomain"; + + return $result; + } + + /** + * Returns a message in the appropriate language. + * @access private + * @return string + */ + function Lang($key) { + if(count($this->language) < 1) + $this->SetLanguage("en"); // set the default language + + if(isset($this->language[$key])) + return $this->language[$key]; + else + return "Language string failed to load: " . $key; + } + + /** + * Returns true if an error occurred. + * @return bool + */ + function IsError() { + return ($this->error_count > 0); + } + + /** + * Changes every end of line from CR or LF to CRLF. + * @access private + * @return string + */ + function FixEOL($str) { + $str = str_replace("\r\n", "\n", $str); + $str = str_replace("\r", "\n", $str); + $str = str_replace("\n", $this->LE, $str); + return $str; + } + + /** + * Adds a custom header. + * @return void + */ + function AddCustomHeader($custom_header) { + $this->CustomHeader[] = explode(":", $custom_header, 2); + } +} + +?> \ No newline at end of file diff --git a/e107_handlers/phpmailer/class.pop3.php b/e107_handlers/phpmailer/class.pop3.php new file mode 100644 index 000000000..4a5996fb9 --- /dev/null +++ b/e107_handlers/phpmailer/class.pop3.php @@ -0,0 +1,389 @@ +pop_conn = 0; + $this->connected = false; + $this->error = null; + } + + /** + * Combination of public events - connect, login, disconnect + * + * @param string $host + * @param integer $port + * @param integer $tval + * @param string $username + * @param string $password + */ + function Authorise ($host, $port = false, $tval = false, $username, $password, $debug_level = 0) + { + $this->host = $host; + + // If no port value is passed, retrieve it + if ($port == false) + { + $this->port = $this->POP3_PORT; + } + else + { + $this->port = $port; + } + + // If no port value is passed, retrieve it + if ($tval == false) + { + $this->tval = $this->POP3_TIMEOUT; + } + else + { + $this->tval = $tval; + } + + $this->do_debug = $debug_level; + $this->username = $username; + $this->password = $password; + + // Refresh the error log + $this->error = null; + + // Connect + $result = $this->Connect($this->host, $this->port, $this->tval); + + if ($result) + { + $login_result = $this->Login($this->username, $this->password); + + if ($login_result) + { + $this->Disconnect(); + + return true; + } + + } + + // We need to disconnect regardless if the login succeeded + $this->Disconnect(); + + return false; + } + + /** + * Connect to the POP3 server + * + * @param string $host + * @param integer $port + * @param integer $tval + * @return boolean + */ + function Connect ($host, $port = false, $tval = 30) + { + // Are we already connected? + if ($this->connected) + { + return true; + } + + /* + On Windows this will raise a PHP Warning error if the hostname doesn't exist. + Rather than supress it with @fsockopen, let's capture it cleanly instead + */ + + set_error_handler(array(&$this, 'catchWarning')); + + // Connect to the POP3 server + $this->pop_conn = fsockopen($host, // POP3 Host + $port, // Port # + $errno, // Error Number + $errstr, // Error Message + $tval); // Timeout (seconds) + + // Restore the error handler + restore_error_handler(); + + // Does the Error Log now contain anything? + if ($this->error && $this->do_debug >= 1) + { + $this->displayErrors(); + } + + // Did we connect? + if ($this->pop_conn == false) + { + // It would appear not... + $this->error = array( + 'error' => "Failed to connect to server $host on port $port", + 'errno' => $errno, + 'errstr' => $errstr + ); + + if ($this->do_debug >= 1) + { + $this->displayErrors(); + } + + return false; + } + + // Increase the stream time-out + + // Check for PHP 4.3.0 or later + if (version_compare(phpversion(), '4.3.0', 'ge')) + { + stream_set_timeout($this->pop_conn, $tval, 0); + } + else + { + // Does not work on Windows + if (substr(PHP_OS, 0, 3) !== 'WIN') + { + socket_set_timeout($this->pop_conn, $tval, 0); + } + } + + // Get the POP3 server response + $pop3_response = $this->getResponse(); + + // Check for the +OK + if ($this->checkResponse($pop3_response)) + { + // The connection is established and the POP3 server is talking + $this->connected = true; + return true; + } + + } + + /** + * Login to the POP3 server (does not support APOP yet) + * + * @param string $username + * @param string $password + * @return boolean + */ + function Login ($username = '', $password = '') + { + if ($this->connected == false) + { + $this->error = 'Not connected to POP3 server'; + + if ($this->do_debug >= 1) + { + $this->displayErrors(); + } + } + + if (empty($username)) + { + $username = $this->username; + } + + if (empty($password)) + { + $password = $this->password; + } + + $pop_username = "USER $username" . $this->CRLF; + $pop_password = "PASS $password" . $this->CRLF; + + // Send the Username + $this->sendString($pop_username); + $pop3_response = $this->getResponse(); + + if ($this->checkResponse($pop3_response)) + { + // Send the Password + $this->sendString($pop_password); + $pop3_response = $this->getResponse(); + + if ($this->checkResponse($pop3_response)) + { + return true; + } + else + { + return false; + } + } + else + { + return false; + } + } + + /** + * Disconnect from the POP3 server + * + */ + function Disconnect () + { + $this->sendString('QUIT'); + + fclose($this->pop_conn); + } + + /* + --------------- + Private Methods + --------------- + */ + + /** + * Get the socket response back. + * $size is the maximum number of bytes to retrieve + * + * @param integer $size + * @return string + */ + function getResponse ($size = 128) + { + $pop3_response = fgets($this->pop_conn, $size); + + return $pop3_response; + } + + /** + * Send a string down the open socket connection to the POP3 server + * + * @param string $string + * @return integer + */ + function sendString ($string) + { + $bytes_sent = fwrite($this->pop_conn, $string, strlen($string)); + + return $bytes_sent; + + } + + /** + * Checks the POP3 server response for +OK or -ERR + * + * @param string $string + * @return boolean + */ + function checkResponse ($string) + { + if (substr($string, 0, 3) !== '+OK') + { + $this->error = array( + 'error' => "Server reported an error: $string", + 'errno' => 0, + 'errstr' => '' + ); + + if ($this->do_debug >= 1) + { + $this->displayErrors(); + } + + return false; + } + else + { + return true; + } + + } + + /** + * If debug is enabled, display the error message array + * + */ + function displayErrors () + { + echo '
    ';
    +
    +    	foreach ($this->error as $single_error)
    +		{
    +	    	print_r($single_error);
    +		}
    +		
    +    	echo '
    '; + } + + /** + * Takes over from PHP for the socket warning handler + * + * @param integer $errno + * @param string $errstr + * @param string $errfile + * @param integer $errline + */ + function catchWarning ($errno, $errstr, $errfile, $errline) + { + $this->error[] = array( + 'error' => "Connecting to the POP3 server raised a PHP warning: ", + 'errno' => $errno, + 'errstr' => $errstr + ); + } + +// End of class +} +?> \ No newline at end of file diff --git a/e107_handlers/phpmailer/class.smtp.php b/e107_handlers/phpmailer/class.smtp.php new file mode 100644 index 000000000..e8f6b9abe --- /dev/null +++ b/e107_handlers/phpmailer/class.smtp.php @@ -0,0 +1,1045 @@ +smtp_conn = 0; + $this->error = null; + $this->helo_rply = null; + + $this->do_debug = 0; + } + + /************************************************************* + * CONNECTION FUNCTIONS * + ***********************************************************/ + + /** + * Connect to the server specified on the port specified. + * If the port is not specified use the default SMTP_PORT. + * If tval is specified then a connection will try and be + * established with the server for that number of seconds. + * If tval is not specified the default is 30 seconds to + * try on the connection. + * + * SMTP CODE SUCCESS: 220 + * SMTP CODE FAILURE: 421 + * @access public + * @return bool + */ + function Connect($host,$port=0,$tval=30) { + # set the error val to null so there is no confusion + $this->error = null; + + # make sure we are __not__ connected + if($this->connected()) { + # ok we are connected! what should we do? + # for now we will just give an error saying we + # are already connected + $this->error = + array("error" => "Already connected to a server"); + return false; + } + + if(empty($port)) { + $port = $this->SMTP_PORT; + } + + #connect to the smtp server + $this->smtp_conn = fsockopen($host, # the host of the server + $port, # the port to use + $errno, # error number if any + $errstr, # error message if any + $tval); # give up after ? secs + # verify we connected properly + if(empty($this->smtp_conn)) { + $this->error = array("error" => "Failed to connect to server", + "errno" => $errno, + "errstr" => $errstr); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": $errstr ($errno)" . $this->CRLF; + } + return false; + } + + # sometimes the SMTP server takes a little longer to respond + # so we will give it a longer timeout for the first read + // Windows still does not have support for this timeout function + if(substr(PHP_OS, 0, 3) != "WIN") + socket_set_timeout($this->smtp_conn, $tval, 0); + + # get any announcement stuff + $announce = $this->get_lines(); + + # set the timeout of any socket functions at 1/10 of a second + //if(function_exists("socket_set_timeout")) + // socket_set_timeout($this->smtp_conn, 0, 100000); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $announce; + } + + return true; + } + + /** + * Performs SMTP authentication. Must be run after running the + * Hello() method. Returns true if successfully authenticated. + * @access public + * @return bool + */ + function Authenticate($username, $password) { + // Start authentication + fputs($this->smtp_conn,"AUTH LOGIN" . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($code != 334) { + $this->error = + array("error" => "AUTH not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + + // Send encoded username + fputs($this->smtp_conn, base64_encode($username) . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($code != 334) { + $this->error = + array("error" => "Username not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + + // Send encoded password + fputs($this->smtp_conn, base64_encode($password) . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($code != 235) { + $this->error = + array("error" => "Password not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + + return true; + } + + /** + * Returns true if connected to a server otherwise false + * @access private + * @return bool + */ + function Connected() { + if(!empty($this->smtp_conn)) { + $sock_status = socket_get_status($this->smtp_conn); + if($sock_status["eof"]) { + # hmm this is an odd situation... the socket is + # valid but we aren't connected anymore + if($this->do_debug >= 1) { + echo "SMTP -> NOTICE:" . $this->CRLF . + "EOF caught while checking if connected"; + } + $this->Close(); + return false; + } + return true; # everything looks good + } + return false; + } + + /** + * Closes the socket and cleans up the state of the class. + * It is not considered good to use this function without + * first trying to use QUIT. + * @access public + * @return void + */ + function Close() { + $this->error = null; # so there is no confusion + $this->helo_rply = null; + if(!empty($this->smtp_conn)) { + # close the connection and cleanup + fclose($this->smtp_conn); + $this->smtp_conn = 0; + } + } + + + /*************************************************************** + * SMTP COMMANDS * + *************************************************************/ + + /** + * Issues a data command and sends the msg_data to the server + * finializing the mail transaction. $msg_data is the message + * that is to be send with the headers. Each header needs to be + * on a single line followed by a with the message headers + * and the message body being separated by and additional . + * + * Implements rfc 821: DATA + * + * SMTP CODE INTERMEDIATE: 354 + * [data] + * . + * SMTP CODE SUCCESS: 250 + * SMTP CODE FAILURE: 552,554,451,452 + * SMTP CODE FAILURE: 451,554 + * SMTP CODE ERROR : 500,501,503,421 + * @access public + * @return bool + */ + function Data($msg_data) { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Data() without being connected"); + return false; + } + + fputs($this->smtp_conn,"DATA" . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 354) { + $this->error = + array("error" => "DATA command not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + + # the server is ready to accept data! + # according to rfc 821 we should not send more than 1000 + # including the CRLF + # characters on a single line so we will break the data up + # into lines by \r and/or \n then if needed we will break + # each of those into smaller lines to fit within the limit. + # in addition we will be looking for lines that start with + # a period '.' and append and additional period '.' to that + # line. NOTE: this does not count towards are limit. + + # normalize the line breaks so we know the explode works + $msg_data = str_replace("\r\n","\n",$msg_data); + $msg_data = str_replace("\r","\n",$msg_data); + $lines = explode("\n",$msg_data); + + # we need to find a good way to determine is headers are + # in the msg_data or if it is a straight msg body + # currently I'm assuming rfc 822 definitions of msg headers + # and if the first field of the first line (':' sperated) + # does not contain a space then it _should_ be a header + # and we can process all lines before a blank "" line as + # headers. + $field = substr($lines[0],0,strpos($lines[0],":")); + $in_headers = false; + if(!empty($field) && !strstr($field," ")) { + $in_headers = true; + } + + $max_line_length = 998; # used below; set here for ease in change + + while(list(,$line) = @each($lines)) { + $lines_out = null; + if($line == "" && $in_headers) { + $in_headers = false; + } + # ok we need to break this line up into several + # smaller lines + while(strlen($line) > $max_line_length) { + $pos = strrpos(substr($line,0,$max_line_length)," "); + + # Patch to fix DOS attack + if(!$pos) { + $pos = $max_line_length - 1; + } + + $lines_out[] = substr($line,0,$pos); + $line = substr($line,$pos + 1); + # if we are processing headers we need to + # add a LWSP-char to the front of the new line + # rfc 822 on long msg headers + if($in_headers) { + $line = "\t" . $line; + } + } + $lines_out[] = $line; + + # now send the lines to the server + while(list(,$line_out) = @each($lines_out)) { + if(strlen($line_out) > 0) + { + if(substr($line_out, 0, 1) == ".") { + $line_out = "." . $line_out; + } + } + fputs($this->smtp_conn,$line_out . $this->CRLF); + } + } + + # ok all the message data has been sent so lets get this + # over with aleady + fputs($this->smtp_conn, $this->CRLF . "." . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => "DATA not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + return true; + } + + /** + * Expand takes the name and asks the server to list all the + * people who are members of the _list_. Expand will return + * back and array of the result or false if an error occurs. + * Each value in the array returned has the format of: + * [ ] + * The definition of is defined in rfc 821 + * + * Implements rfc 821: EXPN + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE FAILURE: 550 + * SMTP CODE ERROR : 500,501,502,504,421 + * @access public + * @return string array + */ + function Expand($name) { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Expand() without being connected"); + return false; + } + + fputs($this->smtp_conn,"EXPN " . $name . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => "EXPN not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + + # parse the reply and place in our array to return to user + $entries = explode($this->CRLF,$rply); + while(list(,$l) = @each($entries)) { + $list[] = substr($l,4); + } + + return $list; + } + + /** + * Sends the HELO command to the smtp server. + * This makes sure that we and the server are in + * the same known state. + * + * Implements from rfc 821: HELO + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE ERROR : 500, 501, 504, 421 + * @access public + * @return bool + */ + function Hello($host="") { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Hello() without being connected"); + return false; + } + + # if a hostname for the HELO wasn't specified determine + # a suitable one to send + if(empty($host)) { + # we need to determine some sort of appopiate default + # to send to the server + $host = "localhost"; + } + + // Send extended hello first (RFC 2821) + if(!$this->SendHello("EHLO", $host)) + { + if(!$this->SendHello("HELO", $host)) + return false; + } + + return true; + } + + /** + * Sends a HELO/EHLO command. + * @access private + * @return bool + */ + function SendHello($hello, $host) { + fputs($this->smtp_conn, $hello . " " . $host . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER: " . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => $hello . " not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + + $this->helo_rply = $rply; + + return true; + } + + /** + * Gets help information on the keyword specified. If the keyword + * is not specified then returns generic help, ussually contianing + * A list of keywords that help is available on. This function + * returns the results back to the user. It is up to the user to + * handle the returned data. If an error occurs then false is + * returned with $this->error set appropiately. + * + * Implements rfc 821: HELP [ ] + * + * SMTP CODE SUCCESS: 211,214 + * SMTP CODE ERROR : 500,501,502,504,421 + * @access public + * @return string + */ + function Help($keyword="") { + $this->error = null; # to avoid confusion + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Help() without being connected"); + return false; + } + + $extra = ""; + if(!empty($keyword)) { + $extra = " " . $keyword; + } + + fputs($this->smtp_conn,"HELP" . $extra . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 211 && $code != 214) { + $this->error = + array("error" => "HELP not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + + return $rply; + } + + /** + * Starts a mail transaction from the email address specified in + * $from. Returns true if successful or false otherwise. If True + * the mail transaction is started and then one or more Recipient + * commands may be called followed by a Data command. + * + * Implements rfc 821: MAIL FROM: + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE SUCCESS: 552,451,452 + * SMTP CODE SUCCESS: 500,501,421 + * @access public + * @return bool + */ + function Mail($from) { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Mail() without being connected"); + return false; + } + + fputs($this->smtp_conn,"MAIL FROM:<" . $from . ">" . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => "MAIL not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + return true; + } + + /** + * Sends the command NOOP to the SMTP server. + * + * Implements from rfc 821: NOOP + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE ERROR : 500, 421 + * @access public + * @return bool + */ + function Noop() { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Noop() without being connected"); + return false; + } + + fputs($this->smtp_conn,"NOOP" . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => "NOOP not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + return true; + } + + /** + * Sends the quit command to the server and then closes the socket + * if there is no error or the $close_on_error argument is true. + * + * Implements from rfc 821: QUIT + * + * SMTP CODE SUCCESS: 221 + * SMTP CODE ERROR : 500 + * @access public + * @return bool + */ + function Quit($close_on_error=true) { + $this->error = null; # so there is no confusion + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Quit() without being connected"); + return false; + } + + # send the quit command to the server + fputs($this->smtp_conn,"quit" . $this->CRLF); + + # get any good-bye messages + $byemsg = $this->get_lines(); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $byemsg; + } + + $rval = true; + $e = null; + + $code = substr($byemsg,0,3); + if($code != 221) { + # use e as a tmp var cause Close will overwrite $this->error + $e = array("error" => "SMTP server rejected quit command", + "smtp_code" => $code, + "smtp_rply" => substr($byemsg,4)); + $rval = false; + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $e["error"] . ": " . + $byemsg . $this->CRLF; + } + } + + if(empty($e) || $close_on_error) { + $this->Close(); + } + + return $rval; + } + + /** + * Sends the command RCPT to the SMTP server with the TO: argument of $to. + * Returns true if the recipient was accepted false if it was rejected. + * + * Implements from rfc 821: RCPT TO: + * + * SMTP CODE SUCCESS: 250,251 + * SMTP CODE FAILURE: 550,551,552,553,450,451,452 + * SMTP CODE ERROR : 500,501,503,421 + * @access public + * @return bool + */ + function Recipient($to) { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Recipient() without being connected"); + return false; + } + + fputs($this->smtp_conn,"RCPT TO:<" . $to . ">" . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250 && $code != 251) { + $this->error = + array("error" => "RCPT not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + return true; + } + + /** + * Sends the RSET command to abort and transaction that is + * currently in progress. Returns true if successful false + * otherwise. + * + * Implements rfc 821: RSET + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE ERROR : 500,501,504,421 + * @access public + * @return bool + */ + function Reset() { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Reset() without being connected"); + return false; + } + + fputs($this->smtp_conn,"RSET" . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => "RSET failed", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + + return true; + } + + /** + * Starts a mail transaction from the email address specified in + * $from. Returns true if successful or false otherwise. If True + * the mail transaction is started and then one or more Recipient + * commands may be called followed by a Data command. This command + * will send the message to the users terminal if they are logged + * in. + * + * Implements rfc 821: SEND FROM: + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE SUCCESS: 552,451,452 + * SMTP CODE SUCCESS: 500,501,502,421 + * @access public + * @return bool + */ + function Send($from) { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Send() without being connected"); + return false; + } + + fputs($this->smtp_conn,"SEND FROM:" . $from . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => "SEND not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + return true; + } + + /** + * Starts a mail transaction from the email address specified in + * $from. Returns true if successful or false otherwise. If True + * the mail transaction is started and then one or more Recipient + * commands may be called followed by a Data command. This command + * will send the message to the users terminal if they are logged + * in and send them an email. + * + * Implements rfc 821: SAML FROM: + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE SUCCESS: 552,451,452 + * SMTP CODE SUCCESS: 500,501,502,421 + * @access public + * @return bool + */ + function SendAndMail($from) { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called SendAndMail() without being connected"); + return false; + } + + fputs($this->smtp_conn,"SAML FROM:" . $from . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => "SAML not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + return true; + } + + /** + * Starts a mail transaction from the email address specified in + * $from. Returns true if successful or false otherwise. If True + * the mail transaction is started and then one or more Recipient + * commands may be called followed by a Data command. This command + * will send the message to the users terminal if they are logged + * in or mail it to them if they are not. + * + * Implements rfc 821: SOML FROM: + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE SUCCESS: 552,451,452 + * SMTP CODE SUCCESS: 500,501,502,421 + * @access public + * @return bool + */ + function SendOrMail($from) { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called SendOrMail() without being connected"); + return false; + } + + fputs($this->smtp_conn,"SOML FROM:" . $from . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => "SOML not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + return true; + } + + /** + * This is an optional command for SMTP that this class does not + * support. This method is here to make the RFC821 Definition + * complete for this class and __may__ be implimented in the future + * + * Implements from rfc 821: TURN + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE FAILURE: 502 + * SMTP CODE ERROR : 500, 503 + * @access public + * @return bool + */ + function Turn() { + $this->error = array("error" => "This method, TURN, of the SMTP ". + "is not implemented"); + if($this->do_debug >= 1) { + echo "SMTP -> NOTICE: " . $this->error["error"] . $this->CRLF; + } + return false; + } + + /** + * Verifies that the name is recognized by the server. + * Returns false if the name could not be verified otherwise + * the response from the server is returned. + * + * Implements rfc 821: VRFY + * + * SMTP CODE SUCCESS: 250,251 + * SMTP CODE FAILURE: 550,551,553 + * SMTP CODE ERROR : 500,501,502,421 + * @access public + * @return int + */ + function Verify($name) { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Verify() without being connected"); + return false; + } + + fputs($this->smtp_conn,"VRFY " . $name . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250 && $code != 251) { + $this->error = + array("error" => "VRFY failed on name '$name'", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + return $rply; + } + + /******************************************************************* + * INTERNAL FUNCTIONS * + ******************************************************************/ + + /** + * Read in as many lines as possible + * either before eof or socket timeout occurs on the operation. + * With SMTP we can tell if we have more lines to read if the + * 4th character is '-' symbol. If it is a space then we don't + * need to read anything else. + * @access private + * @return string + */ + function get_lines() { + $data = ""; + while($str = fgets($this->smtp_conn,515)) { + if($this->do_debug >= 4) { + echo "SMTP -> get_lines(): \$data was \"$data\"" . + $this->CRLF; + echo "SMTP -> get_lines(): \$str is \"$str\"" . + $this->CRLF; + } + $data .= $str; + if($this->do_debug >= 4) { + echo "SMTP -> get_lines(): \$data is \"$data\"" . $this->CRLF; + } + # if the 4th character is a space then we are done reading + # so just break the loop + if(substr($str,3,1) == " ") { break; } + } + return $data; + } + +} + + + ?> diff --git a/e107_handlers/phpmailer/e107.htaccess b/e107_handlers/phpmailer/e107.htaccess new file mode 100644 index 000000000..3d13c9b8d --- /dev/null +++ b/e107_handlers/phpmailer/e107.htaccess @@ -0,0 +1 @@ +mod_gzip_on Off \ No newline at end of file diff --git a/e107_handlers/phpmailer/language/phpmailer.lang-en.php b/e107_handlers/phpmailer/language/phpmailer.lang-en.php new file mode 100644 index 000000000..1205a0228 --- /dev/null +++ b/e107_handlers/phpmailer/language/phpmailer.lang-en.php @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/e107_handlers/phpmailer/mailout_process.php b/e107_handlers/phpmailer/mailout_process.php new file mode 100644 index 000000000..b819d3b20 --- /dev/null +++ b/e107_handlers/phpmailer/mailout_process.php @@ -0,0 +1,364 @@ + db_Delete("generic", "gen_datestamp='".intval($_POST['mail_id'])."' "); + + $text = "

    ".MAILAN_66; // Cancelled Successfully; + $text .= "
    +
    +
    "; + + $ns -> tablerender(MAILAN_59, $text); + echo ""; + + exit; +} + + ob_implicit_flush(); +/* + if (ob_get_level() == 0) { + ob_start(); + } +*/ + +// -------------------- Configure PHP Mailer ------------------------------> + + require(e_HANDLER."phpmailer/class.phpmailer.php"); + + $mail = new PHPMailer(); + + $mail->From = ($_POST['email_from_email'])? $_POST['email_from_email']: $pref['siteadminemail']; + $mail->FromName = ($_POST['email_from_name'])? $_POST['email_from_name']: $pref['siteadmin']; + // $mail->Host = "smtp1.site.com;smtp2.site.com"; + if ($pref['mailer']== 'smtp') + { + $mail->Mailer = "smtp"; + $mail->SMTPKeepAlive = (isset($pref['smtp_keepalive']) && $pref['smtp_keepalive']==1) ? TRUE : FALSE; + if($pref['smtp_server']) + { + $mail->Host = $pref['smtp_server']; + } + if($pref['smtp_username'] && $pref['smtp_password']) + { + $mail->SMTPAuth = TRUE; + $mail->Username = $pref['smtp_username']; + $mail->Password = $pref['smtp_password']; + $mail->PluginDir = e_HANDLER."phpmailer/"; + } + } + elseif ($pref['mailer']== 'sendmail') + { + $mail->Mailer = "sendmail"; + $mail->Sendmail = ($pref['sendmail']) ? $pref['sendmail'] : "/usr/sbin/sendmail -t -i -r ".$pref['siteadminemail']; + } + else + { + $mail->Mailer = "mail"; + } + + $mail->AddCC = ($_POST['email_cc']); + $mail->WordWrap = 50; + $mail->Charset = CHARSET; + $mail->Subject = $_POST['email_subject']; + $mail->IsHTML(TRUE); + $mail->SMTPDebug = (e_MENU == "debug") ? TRUE : FALSE; + + if($_POST['email_cc']) + { + $tmp = explode(",",$_POST['email_cc']); + foreach($tmp as $addc) + { + $mail->AddCC($addc); + } + } + + if($_POST['email_bcc']) + { + $tmp = explode(",",$_POST['email_bcc']); + foreach($tmp as $addbc) + { + $mail->AddBCC($addbc); + } + } + + if($pref['mail_bounce_email'] !='') + { + $mail->Sender = $pref['mail_bounce_email']; + } + + $attach = chop($_POST['email_attachment']); + if (($temp = strrchr($attach,'/')) !== FALSE) + { + $attach = substr($attach,$temp + 1); + } + + if(is_readable(e_DOWNLOAD.$attach)) + { + $attach_link = e_DOWNLOAD.$attach; + } + else + { + $attach_link = e_FILE.'public/'.$attach; + } + + if ($attach != "" && !$mail->AddAttachment($attach_link, $attach)) + { + $mss = MAILAN_58."
    $attach_link"; // problem with attachment. + $ns->tablerender("Error", $mss); + require_once(e_ADMIN."footer.php"); + exit; + } + + + +// ---------------------------- Setup the Email -----------------------------> + + + $message_subject = stripslashes($tp -> toHTML($_POST['email_subject'])); + + $mail_head = "\n"; + $mail_head .= "\n"; + $mail_head .= "\n"; + + if (isset($_POST['use_theme'])) + { + $theme = $THEMES_DIRECTORY.$pref['sitetheme']."/"; + // $mail_head .= "\n"; + $style_css = file_get_contents(e_THEME.$pref['sitetheme']."/style.css"); + $mail_head .= ""; + + $message_body = $mail_head; + $message_body .= "\n\n"; + $message_body .= "
    \n"; + $message_body .= $tp -> toEmail($_POST['email_body'])."
    "; + } + else + { + $message_body = $mail_head; + $message_body .= "\n\n"; + $message_body .= $tp -> toEmail($_POST['email_body']).""; + $message_body = str_replace(""", '"', $message_body); + $message_body = str_replace('src="', 'src="'.SITEURL, $message_body); + } + + $message_body = stripslashes($message_body); + + + +// ---------------- Display Progress and Send Emails. -----------------------> + + + echo "
     ".MAILAN_59."
    "; + $qry = "SELECT g.*,u.* FROM #generic AS g LEFT JOIN #user AS u ON g.gen_user_id = u.user_id WHERE g.gen_type='sendmail' and g.gen_datestamp = '".intval($_POST['mail_id'])."' "; + $count = $sql -> db_Select_gen($qry); + + if(!$count) + { + echo "

    ".MAILAN_61."
    "; + echo ""; + echo "
    + +
    "; + exit; + } + + + $c = 0; $d=0; + $pause_count = 1; + $pause_amount = ($pref['mail_pause']) ? $pref['mail_pause'] : 10; + $pause_time = ($pref['mail_pausetime']) ? $pref['mail_pausetime'] : 1; + $sent = array(); + $failed = array(); + $unit = (1/$count)* 100; + echo "
     
    "; + + stopwatch(); + + while($row = $sql-> db_Fetch()){ + + +// ---------------------- Mailing Part. --------------------------------------> + + $activator = (substr(SITEURL, -1) == "/" ? SITEURL."signup.php?activate.".$row['user_id'].".".$row['user_sess'] : SITEURL."/signup.php?activate.".$row['user_id'].".".$row['user_sess']); + $signup_link = ($row['user_sess']) ? "$activator" : ""; + + $search = array("|USERNAME|","|USERID|","|SIGNUP_LINK|"); + $replace = array($row['user_name'],$row['user_id'],$signup_link); + + $mes_body = str_replace($search,$replace,$message_body); + $alt_body = str_replace($search,$replace,stripslashes($tp->toText($_POST['email_body']))); + + $mail->Body = $mes_body; + $mail->AltBody = $alt_body; + + $mail->AddAddress($row['user_email'], $row['user_name']); + $mail->AddCustomHeader("X-e107-id: ".$row['user_id']); + + + if ($mail->Send()) { + $sent[] = $row['user_id']; + } else { + $failed[] = $row['user_id']; + } + + $mail->ClearAddresses(); + + +// --------- End of the mailing. ---------------------------------------------> + + $cur = round((($c / $count) * 100) + $unit); + echo str_pad(' ',4096)."
    \n"; + + $d = ($c==0) ? 10 : round($width + $d); + + echo "
    ".($c+1)." / ".$count." (" . $cur . "%)  complete
    "; + + if($cur != $prev){ + echo "\n"; + } + $prev = $cur; + ob_flush(); + flush(); + + if($pause_count > $pause_amount){ + sleep($pause_time); + $pause_count = 1; + } + + // Default sleep to reduce server-load: 1 second. + sleep(1); + + $c++; + $pause_count++; + } + ob_end_flush(); + + echo "

    "; + echo MAILAN_62." ".count($sent)."
    "; + echo MAILAN_63." ".count($failed)."
    "; + echo MAILAN_64." ".stopwatch()." ".MAILAN_65."
    "; + echo "
    "; + + $message = $sql -> db_Delete("generic", "gen_datestamp='".intval($_POST['mail_id'])."' ") ? "deleted" : "deleted_failed"; + + $mail->ClearAttachments(); + if ($pref['mailer']== 'smtp') { + $mail->SmtpClose(); + } + +echo "
    +
    +
    "; +echo ""; + + + + + + +function headerjs(){ + $text = " + "; + +$text .= " + "; + + return $text; +} + + +function stopwatch(){ + static $mt_previous = 0; + list($usec, $sec) = explode(" ",microtime()); + $mt_current = (float)$usec + (float)$sec; + if (!$mt_previous) { + $mt_previous = $mt_current; + return ""; + } else { + $mt_diff = ($mt_current - $mt_previous); + $mt_previous = $mt_current; + return round(sprintf('%.16f',$mt_diff),2); + } +} +?> diff --git a/e107_handlers/plugin_class.php b/e107_handlers/plugin_class.php new file mode 100644 index 000000000..571c8a1b7 --- /dev/null +++ b/e107_handlers/plugin_class.php @@ -0,0 +1,601 @@ +db_Select("plugin","*","plugin_installflag = '".intval($flag)."' ORDER BY plugin_path ASC")) + { + $ret = $sql->db_getList(); + } + + + + return ($ret) ? $ret : FALSE; + } + + /** + * Check for new plugins, create entry in plugin table and remove deleted plugins + * + */ + function update_plugins_table() { + global $sql, $mySQLprefix, $menu_pref, $tp; + + require_once(e_HANDLER.'file_class.php'); + + $fl = new e_file; + $pluginList = $fl->get_files(e_PLUGIN, "^plugin\.php$", "standard", 1); + + foreach($pluginList as $p) + { + foreach($defined_vars as $varname) { + if (substr($varname, 0, 6) == 'eplug_' || substr($varname, 0, 8) == 'upgrade_') { + unset($$varname); + } + } + + include_once("{$p['path']}{$p['fname']}"); + $plugin_path = substr(str_replace(e_PLUGIN,"",$p['path']),0,-1); + + // scan for addons. + $eplug_addons = $this->getAddons($plugin_path); + + if($sql->db_Select("plugin", "plugin_id", "plugin_path = '$plugin_path'")) + { + $sql->db_Update("plugin", "plugin_addons = '{$eplug_addons}' WHERE plugin_path = '$plugin_path'"); + } + + if ((!$sql->db_Select("plugin", "plugin_id", "plugin_path = '".$tp -> toDB($eplug_folder, true)."'")) && $eplug_name){ + if (!$eplug_link_url && !$eplug_link && !$eplug_prefs && !$eplug_table_names && !$eplug_user_prefs && !$eplug_sc && !$eplug_userclass && !$eplug_module && !$eplug_bb && !$eplug_latest && !$eplug_status){ + // new plugin, assign entry in plugin table, install is not necessary so mark it as intalled + $sql->db_Insert("plugin", "0, '".$tp -> toDB($eplug_name, true)."', '".$tp -> toDB($eplug_version, true)."', '".$tp -> toDB($eplug_folder, true)."', 1, '$eplug_addons' "); + } + else + { + // new plugin, assign entry in plugin table, install is necessary + $sql->db_Insert("plugin", "0, '".$tp -> toDB($eplug_name, true)."', '".$tp -> toDB($eplug_version, true)."', '".$tp -> toDB($eplug_folder, true)."', 0, '$eplug_addons' "); + } + } + } + + $sql->db_Select("plugin"); + while ($row = $sql->db_fetch()) { + if (!is_dir(e_PLUGIN.$row['plugin_path'])) { + $sql->db_Delete('plugin', "plugin_path = '{$row['plugin_path']}'"); + } + } + } + + /** + * Returns deatils of a plugin from the plugin table from it's ID + * + * @param int $id + * @return array plugin info + */ + function getinfo($id) { + global $sql; + $id = intval($id); + if ($sql->db_Select('plugin', '*', "plugin_id = {$id}")) { + return $sql->db_Fetch(); + } + } + + function manage_userclass($action, $class_name, $class_description) { + global $sql, $tp; + $class_name = $tp -> toDB($class_name, true); + $class_description = $tp -> toDB($class_description, true); + if ($action == 'add') { + $i = 1; + while ($sql->db_Select('userclass_classes', '*', "userclass_id='{$i}' ") && $i < e_UC_READONLY) { + $i++; + } + if ($i < e_UC_READONLY) { + return $sql->db_Insert('userclass_classes', "{$i},'".strip_tags(strtoupper($class_name))."', '{$class_description}' ,".e_UC_PUBLIC); + } else { + return FALSE; + } + } + if ($action == 'remove') { + if ($sql->db_Select('userclass_classes', 'userclass_id', "userclass_name = '{$class_name}'")) { + $row = $sql->db_Fetch(); + $class_id = $row['userclass_id']; + if ($sql->db_Delete('userclass_classes', "userclass_id = '{$class_id}'")) { + if ($sql->db_Select('user', 'user_id, user_class', "user_class REGEXP('^{$class_id}\.') OR user_class REGEXP('\.{$class_id}\.') OR user_class REGEXP('\.{$class_id}$')")) { + $sql2 = new db; + while ($row = $sql->db_Fetch()) { + $classes = explode(".", $row['user_class']); + unset($classes[$class_id]); + foreach($classes as $k => $v) { + if ($v = '') { + unset($classes[$k]); + } + } + $newclass = '.'.implode('.', $classes).'.'; + $sql2->db_Update('user', "user_class = '{$newclass}' WHERE user_id = '{$row['user_id']}"); + } + } + } + } + } + } + + function manage_link($action, $link_url, $link_name,$link_class=0) { + global $sql, $tp; + $link_url = $tp -> toDB($link_url, true); + $link_name = $tp -> toDB($link_name, true); + if ($action == 'add') { + $path = str_replace("../", "", $link_url); + $link_t = $sql->db_Count('links'); + if (!$sql->db_Count('links', '(*)', "link_name = '{$link_name}'")) { + return $sql->db_Insert('links', "0, '{$link_name}', '{$path}', '', '', '1', '".($link_t + 1)."', '0', '0', '{$link_class}' "); + } else { + return FALSE; + } + } + if ($action == 'remove') { + if ($sql->db_Select('links', 'link_order', "link_name = '{$link_name}'")) { + $row = $sql->db_Fetch(); + $sql->db_Update('links', "link_order = link_order - 1 WHERE link_order > {$row['link_order']}"); + return $sql->db_Delete('links', "link_name = '{$link_name}'"); + } + } + } + + function manage_prefs($action, $var) { + global $pref; + if (is_array($var)) { + if ($action == 'add') { + foreach($var as $k => $v) { + $pref[$k] = $v; + } + } + if ($action == 'remove') { + foreach($var as $k => $v) { + unset($pref[$k]); + } + } + save_prefs(); + } + } + + + function manage_comments($action,$comment_id){ + global $sql, $tp; + if($action == 'remove'){ + foreach($comment_id as $com){ + $tmp[] = "comment_type='".$tp -> toDB($com, true)."'"; + } + $qry = implode(" OR ",$tmp); + return $sql->db_Delete('comments',$qry); + } + } + + + function manage_tables($action, $var) { + global $sql; + if ($action == 'add') { + if (is_array($var)) { + foreach($var as $tab) { + if (!$sql->db_Query($tab)) { + return FALSE; + } + } + return TRUE; + } + return TRUE; + } + if ($action == 'upgrade') { + if (is_array($var)) { + foreach($var as $tab) { + if (!$sql->db_Query_all($tab)) { + return FALSE; + } + } + return TRUE; + } + return TRUE; + } + if ($action == 'remove') { + if (is_array($var)) { + foreach($var as $tab) { + $qry = 'DROP TABLE '.MPREFIX.$tab; + if (!$sql->db_Query_all($qry)) { + return $tab; + } + } + return TRUE; + } + return TRUE; + } + } + + function manage_plugin_prefs($action, $prefname, $plugin_folder, $varArray = '') { + global $pref; + if ($prefname == 'plug_sc' || $prefname == 'plug_bb') { + foreach($varArray as $code) { + $prefvals[] = "$code:$plugin_folder"; + } + } else { + $prefvals[] = $plugin_folder; + } + $curvals = explode(',', $pref[$prefname]); + + if ($action == 'add') { + $newvals = array_merge($curvals, $prefvals); + } + if ($action == 'remove') { + foreach($prefvals as $v) { + if (($i = array_search($v, $curvals)) !== FALSE) { + unset($curvals[$i]); + } + } + // $newvals = explode(',', $curvals); + $newvals = $curvals; + } + $newvals = array_unique($newvals); + if(count($newvals) < 2) + { + $pref[$prefname] = $newvals[0]; + } + else + { + $pref[$prefname] = implode(',', $newvals); + } + if(substr($pref[$prefname], 0, 1) == ",") + { + $pref[$prefname] = substr($pref[$prefname], 1); + } + save_prefs(); + } + + + + + + + function manage_search($action, $eplug_folder) { + global $sql, $sysprefs; + $search_prefs = $sysprefs -> getArray('search_prefs'); + $default = file_exists(e_PLUGIN.$eplug_folder.'/e_search.php') ? TRUE : FALSE; + $comments = file_exists(e_PLUGIN.$eplug_folder.'/search/search_comments.php') ? TRUE : FALSE; + if ($action == 'add'){ + $install_default = $default ? TRUE : FALSE; + $install_comments = $comments ? TRUE : FALSE; + } else if ($action == 'remove'){ + $uninstall_default = isset($search_prefs['plug_handlers'][$eplug_folder]) ? TRUE : FALSE; + $uninstall_comments = isset($search_prefs['comments_handlers'][$eplug_folder]) ? TRUE : FALSE; + } else if ($action == 'upgrade'){ + if (isset($search_prefs['plug_handlers'][$eplug_folder])) { + $uninstall_default = $default ? FALSE : TRUE; + } else { + $install_default = $default ? TRUE : FALSE; + } + if (isset($search_prefs['comments_handlers'][$eplug_folder])) { + $uninstall_comments = $comments ? FALSE : TRUE; + } else { + $install_comments = $comments ? TRUE : FALSE; + } + } + if ($install_default) { + $search_prefs['plug_handlers'][$eplug_folder] = array('class' => 0, 'pre_title' => 1, 'pre_title_alt' => '', 'chars' => 150, 'results' => 10); + } else if ($uninstall_default) { + unset($search_prefs['plug_handlers'][$eplug_folder]); + } + if ($install_comments) { + require_once(e_PLUGIN.$eplug_folder.'/search/search_comments.php'); + $search_prefs['comments_handlers'][$eplug_folder] = array('id' => $comments_type_id, 'class' => 0, 'dir' => $eplug_folder); + } else if ($uninstall_comments) { + unset($search_prefs['comments_handlers'][$eplug_folder]); + } + $tmp = addslashes(serialize($search_prefs)); + $sql->db_Update("core", "e107_value = '{$tmp}' WHERE e107_name = 'search_prefs' "); + } + + function manage_notify($action, $eplug_folder) { + global $sql, $sysprefs, $eArrayStorage, $tp; + $notify_prefs = $sysprefs -> get('notify_prefs'); + $notify_prefs = $eArrayStorage -> ReadArray($notify_prefs); + $e_notify = file_exists(e_PLUGIN.$eplug_folder.'/e_notify.php') ? TRUE : FALSE; + if ($action == 'add'){ + $install_notify = $e_notify ? TRUE : FALSE; + } else if ($action == 'remove'){ + $uninstall_notify = isset($notify_prefs['plugins'][$eplug_folder]) ? TRUE : FALSE; + } else if ($action == 'upgrade'){ + if (isset($notify_prefs['plugins'][$eplug_folder])) { + $uninstall_notify = $e_notify ? FALSE : TRUE; + } else { + $install_notify = $e_notify ? TRUE : FALSE; + } + } + if ($install_notify) { + $notify_prefs['plugins'][$eplug_folder] = TRUE; + require_once(e_PLUGIN.$eplug_folder.'/e_notify.php'); + foreach ($config_events as $event_id => $event_text) { + $notify_prefs['event'][$event_id] = array('type' => 'off', 'class' => '254', 'email' => ''); + } + } else if ($uninstall_notify) { + unset($notify_prefs['plugins'][$eplug_folder]); + require_once(e_PLUGIN.$eplug_folder.'/e_notify.php'); + foreach ($config_events as $event_id => $event_text) { + unset($notify_prefs['event'][$event_id]); + } + } + $s_prefs = $tp -> toDB($notify_prefs); + $s_prefs = $eArrayStorage -> WriteArray($s_prefs); + $sql -> db_Update("core", "e107_value='".$s_prefs."' WHERE e107_name='notify_prefs'"); + } + + /** + * Installs a plugin by ID + * + * @param int $id + */ + function install_plugin($id) { + global $sql, $ns, $sysprefs,$mySQLprefix, $tp; + + // install plugin ... + $plug = $this->getinfo($id); + + if ($plug['plugin_installflag'] == FALSE) { + include_once(e_PLUGIN.$plug['plugin_path'].'/plugin.php'); + + $func = $eplug_folder.'_install'; + if (function_exists($func)) { + $text .= call_user_func($func); + } + + if (is_array($eplug_tables)) { + $result = $this->manage_tables('add', $eplug_tables); + if ($result === TRUE) { + $text .= EPL_ADLAN_19.'
    '; + //success + } else { + $text .= EPL_ADLAN_18.'
    '; + //fail + } + } + + + + if (is_array($eplug_prefs)) { + $this->manage_prefs('add', $eplug_prefs); + $text .= EPL_ADLAN_8.'
    '; + } + + + + if (is_array($eplug_array_pref)){ + foreach($eplug_array_pref as $key => $val){ + $this->manage_plugin_prefs('add', $key, $val); + } + } + + if (is_array($eplug_sc)) { + $this->manage_plugin_prefs('add', 'plug_sc', $eplug_folder, $eplug_sc); + } + + if (is_array($eplug_bb)) { + $this->manage_plugin_prefs('add', 'plug_bb', $eplug_folder, $eplug_bb); + } + + if (is_array($eplug_user_prefs)) { + $sql->db_Select("core", " e107_value", " e107_name = 'user_entended'"); + $row = $sql->db_Fetch(); + $user_entended = unserialize($row[0]); + while (list($e_user_pref, $default_value) = each($eplug_user_prefs)) { + $user_entended[] = $e_user_pref; + $user_pref['$e_user_pref'] = $default_value; + } + save_prefs("user"); + $tmp = addslashes(serialize($user_entended)); + if ($sql->db_Select("core", "e107_value", " e107_name = 'user_entended'")) { + $sql->db_Update("core", "e107_value = '{$tmp}' WHERE e107_name = 'user_entended' "); + } else { + $sql->db_Insert("core", "'user_entended', '{$tmp}' "); + } + $text .= EPL_ADLAN_8."
    "; + } + + if ($eplug_link === TRUE && $eplug_link_url != '' && $eplug_link_name != '') { + $plug_perm['everyone'] = e_UC_PUBLIC; + $plug_perm['guest'] = e_UC_GUEST; + $plug_perm['member'] = e_UC_MEMBER; + $plug_perm['admin'] = e_UC_ADMIN; + $plug_perm['nobody'] = e_UC_NOBODY; + $eplug_link_perms = strtolower($eplug_link_perms); + $linkperm = ($plug_perm[$eplug_link_perms]) ? $plug_perm[$eplug_link_perms] : e_UC_PUBLIC; + $this->manage_link('add', $eplug_link_url, $eplug_link_name,$linkperm); + } + + if ($eplug_userclass) { + $this->manage_userclass('add', $eplug_userclass, $eplug_userclass_description); + } + + $this -> manage_search('add', $eplug_folder); + + $this -> manage_notify('add', $eplug_folder); + + $eplug_addons = $this->getAddons($eplug_folder); + + $sql->db_Update('plugin', "plugin_installflag = 1, plugin_addons = '{$eplug_addons}' WHERE plugin_id = '".intval($id)."'"); + if($rssmess){ $text .= $rssmess; } + $text .= (isset($eplug_done) ? "
    {$eplug_done}" : "
    ".LAN_INSTALL_SUCCESSFUL); + } else { + $text = EPL_ADLAN_21; + } + if($eplug_conffile){ $text .= " [".LAN_CONFIGURE."]"; } + $ns->tablerender(EPL_ADLAN_33, $text); + } + + + + function save_addon_prefs(){ // scan the plugin table and create path-array-prefs for each addon. + global $sql,$pref; + $query = "SELECT * FROM #plugin WHERE plugin_installflag = 1 AND plugin_addons !='' ORDER BY plugin_path ASC"; + + // clear all addon prefs before re-creation. + unset($pref['shortcode_list'],$pref['bbcode_list'],$pref['e_sql_list']); + foreach($this->plugin_addons as $plg) + { + unset($pref[$plg."_list"]); + } + + if ($sql -> db_Select_gen($query)) + { + while($row = $sql-> db_Fetch()) + { + $tmp = explode(",",$row['plugin_addons']); + $path = $row['plugin_path']; + + foreach($this->plugin_addons as $val) + { + if(in_array($val,$tmp)) + { + $pref[$val."_list"][$path] = $path; + } + } + // search for .bb and .sc files. + $sc_array = array(); + $bb_array = array(); + $sql_array = array(); + + foreach($tmp as $adds) + { + if(substr($adds,-3) == ".sc") + { + $sc_name = substr($adds, 0,-3); // remove the .sc + $sc_array[$sc_name] = "0"; // default userclass. + } + + if(substr($adds,-3) == ".bb") + { + $bb_name = substr($adds, 0,-3); // remove the .bb + $bb_array[$bb_name] = "0"; // default userclass. + } + + if(substr($adds,-4) == "_sql") + { + $pref['e_sql_list'][$path] = $adds; + } + } + + // Build Bbcode list + if(count($bb_array) > 0) + { + ksort($bb_array); + $pref['bbcode_list'][$path] = $bb_array; + + } + else + { + unset($pref['bbcode_list'][$path]); + } + + // Build shortcode list + if(count($sc_array) > 0){ + ksort($sc_array); + $pref['shortcode_list'][$path] = $sc_array; + } + else + { + unset($pref['shortcode_list'][$path]); + } + + } + } + + save_prefs(); + return; + + } + + // return a list of available plugin addons for the specified plugin. e_xxx etc. + function getAddons($plugin_path,$debug=FALSE){ + global $fl; + + $p_addons = ""; + foreach($this->plugin_addons as $e_xxx) + { + if(is_readable(e_PLUGIN.$plugin_path."/".$e_xxx.".php")) + { + $p_addons[] = $e_xxx; + } + } + + if(!is_object($fl)){ + require_once(e_HANDLER.'file_class.php'); + $fl = new e_file; + } + + // Grab List of Shortcodes & BBcodes + $shortcodeList = $fl->get_files(e_PLUGIN.$plugin_path, ".sc$", "standard", 1); + $bbcodeList = $fl->get_files(e_PLUGIN.$plugin_path, ".bb$", "standard", 1); + $sqlList = $fl->get_files(e_PLUGIN.$plugin_path, "_sql.php$", "standard", 1); + + // Search Shortcodes + foreach($shortcodeList as $sc) + { + if(is_readable(e_PLUGIN.$plugin_path."/".$sc['fname'])) + { + $p_addons[] = $sc['fname']; + } + } + + // Search Bbcodes. + foreach($bbcodeList as $bb) + { + if(is_readable(e_PLUGIN.$plugin_path."/".$bb['fname'])) + { + $p_addons[] = $bb['fname']; + } + } + + // Search _sql files. + foreach($sqlList as $esql) + { + if(is_readable(e_PLUGIN.$plugin_path."/".$esql['fname'])) + { + $p_addons[] = str_replace(".php","",$esql['fname']); + } + } + + + if($debug) + { + echo $plugin_path." = ".implode(",",$p_addons)."
    "; + } + + return implode(",",$p_addons); + } + + +} + +?> diff --git a/e107_handlers/pop3_class.php b/e107_handlers/pop3_class.php new file mode 100644 index 000000000..d86408210 --- /dev/null +++ b/e107_handlers/pop3_class.php @@ -0,0 +1,182 @@ +server = $strConnect; + $this->username = $username; + $this->password = $password; + $this->email = $EmailAddress; + } + function connect() //Connect To the Mail Box + { + $this->marubox=imap_open($this->server,$this->username,$this->password); + } + + function getHeaders($mid) // Get Header info + { + $mail_header=imap_header($this->marubox,$mid); + $sender=$mail_header->from[0]; + $sender_replyto=$mail_header->reply_to[0]; + $stat = (strtolower($sender->mailbox)!='mailer-daemon' && strtolower($sender->mailbox)!='postmaster') ? FALSE : TRUE; + if(strpos($mail_header->subject,"delayed")){ + $stat = FALSE; + } + $mail_details=array( + 'from'=>strtolower($sender->mailbox).'@'.$sender->host, + 'fromName'=>$sender->personal, + 'toOth'=>strtolower($sender_replyto->mailbox).'@'.$sender_replyto->host, + 'toNameOth'=>$sender_replyto->personal, + 'subject'=>$mail_header->subject, + 'to'=>strtolower($mail_header->toaddress), + 'bounce'=>$stat, + 'date'=>$mail_header->date + ); + + return $mail_details; + } + function get_mime_type(&$structure) //Get Mime type Internal Private Use + { + $primary_mime_type = array("TEXT", "MULTIPART", "MESSAGE", "APPLICATION", "AUDIO", "IMAGE", "VIDEO", "OTHER"); + + if($structure->subtype) { + return $primary_mime_type[(int) $structure->type] . '/' . $structure->subtype; + } + return "TEXT/PLAIN"; + } + function get_part($stream, $msg_number, $mime_type, $structure = false, $part_number = false) //Get Part Of Message Internal Private Use + { + if(!$structure) { + $structure = imap_fetchstructure($stream, $msg_number); + } + if($structure) { + if($mime_type == $this->get_mime_type($structure)) + { + if(!$part_number) + { + $part_number = "1"; + } + $text = imap_fetchbody($stream, $msg_number, $part_number); + if($structure->encoding == 3) + { + return imap_base64($text); + } + else if($structure->encoding == 4) + { + return imap_qprint($text); + } + else + { + return $text; + } + } + if($structure->type == 1) /* multipart */ + { + while(list($index, $sub_structure) = each($structure->parts)) + { + if($part_number) + { + $prefix = $part_number . '.'; + } + $data = $this->get_part($stream, $msg_number, $mime_type, $sub_structure, $prefix . ($index + 1)); + if($data) + { + return $data; + } + } + } + } + return false; + } + function getTotalMails() //Get Total Number off Unread Email In Mailbox + { + $headers=imap_headers($this->marubox); + return count($headers); + } + function GetAttach($mid,$path) // Get Atteced File from Mail + { + $struckture = imap_fetchstructure($this->marubox,$mid); + $ar=""; + foreach($struckture->parts as $key => $value) + { + $enc=$struckture->parts[$key]->encoding; + if($struckture->parts[$key]->ifdparameters) + { + $name=$struckture->parts[$key]->dparameters[0]->value; + $message = imap_fetchbody($this->marubox,$mid,$key+1); + if ($enc == 0) + $message = imap_8bit($message); + if ($enc == 1) + $message = imap_8bit ($message); + if ($enc == 2) + $message = imap_binary ($message); + if ($enc == 3) + $message = imap_base64 ($message); + if ($enc == 4) + $message = quoted_printable_decode($message); + if ($enc == 5) + $message = $message; + $fp=fopen($path.$name,"w"); + fwrite($fp,$message); + fclose($fp); + $ar=$ar.$name.","; + } + } + $ar=substr($ar,0,(strlen($ar)-1)); + return $ar; + } + function getBody($mid,$mode="") // Get Message Body + { + if($mode != "plain") + { + $body = $this->get_part($this->marubox, $mid, "TEXT/HTML"); + } + if (($body == "") || $mode == 'plain') + $body = $this->get_part($this->marubox, $mid, "TEXT/PLAIN"); + if ($body == "") { + return ""; + } + return $body; + } + function deleteMails($mid) // Delete That Mail + { + imap_delete($this->marubox,$mid); + } + function close_mailbox() //Close Mail Box + { + imap_close($this->marubox,CL_EXPUNGE); + } +} +?> \ No newline at end of file diff --git a/e107_handlers/popup_handler.php b/e107_handlers/popup_handler.php new file mode 100644 index 000000000..2c0ee1dff --- /dev/null +++ b/e107_handlers/popup_handler.php @@ -0,0 +1,91 @@ +\n"; + // } + // on the page where you want to popup image to appear, + // you need to include this class and create a new object for it: + // require_once(e_HANDLER."popup_handler.php"); + // $pp = new popup; + // then you need to prepare the right paramater in the function call. + // the function returns the image with the popup link as a href on it + // clicking the popup will use the js functions in the included js file to popup the image + // $pp -> popup($oSrc, $oSrcThumb, $oIconWidth, $oMaxWidth, $oTitle, $oText) + + function popup($image, $thumb, $iconwidth='100', $maxwidth='', $title, $text){ + global $tp; + //$image : full path to the large image you want to popup + //$thumb : full path to the small image to show on screen + //$maxwidth : the maximum size (width or height) an image may be popup'ed + //$title : the window title of the popup + //$text : the additional text to add into the popup + + if(file_exists($image)){ + + //use $image if $thumb doesn't exist + if(!file_exists($thumb)){ + $thumb = $image; + } + $imagearray = getimagesize(trim($image)); + //$imagearray holds width and height parameters of the image + //$imagearray[0] is width - $imagearray[1] is height + + if($imagearray[1] > $imagearray[0]){ + if(isset($maxwidth) && $maxwidth!='' && $imagearray[1] > $maxwidth){ + $width = round(($maxwidth*$imagearray[0])/$imagearray[1],0); + $height = $maxwidth; + }else{ + $width = $imagearray[0]; + $height = $imagearray[1]; + } + }else{ + if(isset($maxwidth) && $maxwidth!='' && $imagearray[0] > $maxwidth){ + $width = $maxwidth; + $height = round(($maxwidth*$imagearray[1])/$imagearray[0],0); + }else{ + $width = $imagearray[0]; + $height = $imagearray[1]; + } + } + $iconwidth = ($title == "help" ? "" : ($iconwidth ? "width:".intval($iconwidth)."px;" : "width:100px;") ); + + $width = intval($width); + $search = array("'", '$', '"', '$',''', '\'); + $replace = array("\'", '\$', '"', '\$', "\'", '\\'); + $title = str_replace($search, $replace, $title); + $text = str_replace($search, $replace, $text); + + $popup = "

    "; + + }else{ + $popup = ""; + } + return $popup; + } +} + +?> \ No newline at end of file diff --git a/e107_handlers/pref_class.php b/e107_handlers/pref_class.php new file mode 100644 index 000000000..678d525a9 --- /dev/null +++ b/e107_handlers/pref_class.php @@ -0,0 +1,190 @@ +DefaultRows; + } + if(is_array($RowList)) + { + foreach($RowList as $v) + { + $Args .= ($Args ? " OR e107_name='{$v}'" : "e107_name='{$v}'"); + } + } + $sql->db_Select('core', '*', $Args, 'default'); + while ($row = $sql->db_Fetch()) + { + $this->prefVals['core'][$row['e107_name']] = $row['e107_value']; + } + } + + /** + * Return current pref string $name from $table (only core for now) + * + * - @param string $name -- name of pref row + * - @param string $table -- "core" + * - @return string pref value, slashes already stripped + * - @access public + */ + function get($Name) { + if(isset($this->prefVals['core'][$Name])){ + if($this->prefVals['core'][$Name] != '### ROW CACHE FALSE ###'){ + return $this->prefVals['core'][$Name]; + } else { + return false; + } + } + + $get_sql = new db; // required so sql loops don't break using $tp->toHTML(). + if($get_sql->db_Select('core', '*', "`e107_name` = '{$Name}'", 'default')) { + $row = $get_sql->db_Fetch(); + $this->prefVals['core'][$Name] = $row['e107_value']; + return $this->prefVals['core'][$Name]; + } else { + $this->prefVals['core'][$Name] = '### ROW CACHE FALSE ###'; + return false; + } + } + + /** + * Return current array from pref string $name in $table (core only for now) + * + * - @param: string $name -- name of pref row + * - @param string $table -- "core" only now + * - @return array pref values + * - @access public + */ + // retrieve prefs as an array of values + function getArray($name) { + return unserialize($this->get($name)); + } + + + /** + * Update pref set and cache + * + * @param string val -- pre-serialized string + * @param string $name -- name of pref row + * @param string $table -- "core" or "user" + * @global $$name + * @access public + * + * set("val") == 'core', 'pref' + * set("val","rowname") == 'core', rowname + * set("val","","user") == 'user', 'user_pref' for current user + * set("val","","user",uid) == 'user', 'user_pref' for user uid + * set("val","fieldname","user") == 'user', fieldname + * + */ + function set($val, $name = "", $table = "core", $uid = USERID) { + global $sql; + if (!strlen($name)) { + switch ($table) { + case 'core': + $name = "pref"; + break; + case 'user': + $name = "user_pref"; + break; + } + } + $val = addslashes($val); + + switch ($table ) { + case 'core': + if(!$sql->db_Update($table, "e107_value='$val' WHERE e107_name='$name'")) + { + $sql->db_Insert($table, "'{$name}', '{$val}'"); + } + $this->prefVals[$table][$name] = $val; + unset($this->prefArrays[$table][$name]); + break; + case 'user': + $sql->db_Update($table, "user_prefs='$val' WHERE user_id=$uid"); + break; + } + } + + + /** + * Update pref set and cache + * + * - @param string $name -- name of pref row + * - @param string $table -- "core" or "user" + * - @global $$name + * - @access public + * + * set() == core, pref + * set("rowname") == core, rowname + * set("","user") == user, user_pref for current user + * set("","user",uid) == user, user_pref for user uid + * set("fieldname","user") == user, fieldname + * + * all pref sets other than menu_pref get toDB() + */ + function setArray($name = "", $table = "core", $uid = USERID) { + global $tp; + + if (!strlen($name)) { + switch ($table) { + case 'core': + $name = "pref"; + break; + case 'user': + $name = "user_pref"; + break; + } + } + + global $$name; + if ($name != "menu_pref") { + foreach($$name as $key => $prefvalue) { + $$name[$key] = $tp->toDB($prefvalue); + } + } + + $tmp = serialize($$name); + $this->set($tmp, $name, $table, $uid); + } +} +?> \ No newline at end of file diff --git a/e107_handlers/preset_class.php b/e107_handlers/preset_class.php new file mode 100644 index 000000000..7b8dc89a3 --- /dev/null +++ b/e107_handlers/preset_class.php @@ -0,0 +1,80 @@ +id) ? $this->id : array($this->id); + $uid = $qry[1]; + + if($_POST && $qry[0] =="savepreset"){ + foreach($_POST as $key => $value){ + $value = $tp->toDB($value); + if ($sql -> db_Update("preset", "preset_value='$value' WHERE preset_name ='".$unique_id[$uid]."' AND preset_field ='$key' ")){ + + } elseif ($value !="" && !$sql -> db_Select("preset","*","preset_name ='".$unique_id[$uid]."' AND preset_field ='$key' ")){ + $sql -> db_Insert("preset", "0, '".$unique_id[$uid]."', '$key', '$value' "); + } + + if($value == ""){ + $sql -> db_Delete("preset", "preset_field ='".$key."' "); + } + + } + $ns -> tablerender(LAN_SAVED, LAN_PRESET_SAVED); + } + + if ($_POST['delete_preset'] && e_QUERY=="clr_preset"){ + $del = $_POST['del_id']; + $text = ($sql -> db_Delete("preset", "preset_name ='".$unique_id[$del]."' ")) ? LAN_DELETED : LAN_DELETED_FAILED; + $ns -> tablerender($text, LAN_PRESET_DELETED); + } + + } + +// ------------------------------------------------------------------------ + + function read_preset($unique_id){ + global $sql,$tp; + if (!$_POST){ + if ($sql -> db_Select("preset", "*", "preset_name ='$unique_id' ")){ + while ($row = $sql-> db_Fetch()){ + extract($row); + $val[$preset_field] = $tp->toForm($preset_value); + $_POST[$preset_field] = $tp->toForm($preset_value); + } + return $val; + } + } + } + +// --------------------------------------------------- + + +} + +?> \ No newline at end of file diff --git a/e107_handlers/profanity_filter.php b/e107_handlers/profanity_filter.php new file mode 100644 index 000000000..4bdb75b8c --- /dev/null +++ b/e107_handlers/profanity_filter.php @@ -0,0 +1,69 @@ +profanityList = implode("\b|\b", $word_array); + } + unset($words); + return TRUE; + } + + function filterProfanities($text) { + global $pref; + if (!$this->profanityList) { + return $text; + } + if ($pref['profanity_replace']) { + return preg_replace("#\b".$this->profanityList."\b#is", $pref['profanity_replace'], $text); + } else { + return preg_replace_callback("#\b".$this->profanityList."\b#is", array($this, 'replaceProfanities'), $text); + } + } + + function replaceProfanities($matches) { + /*! + @function replaceProfanities callback + @abstract replaces vowels in profanity words with stars + @param text string - text string to be filtered + @result filtered text + */ + + return preg_replace("#a|e|i|o|u#i", "*" , $matches[0]); + } +} + +?> diff --git a/e107_handlers/rate_class.php b/e107_handlers/rate_class.php new file mode 100644 index 000000000..70b9e21b7 --- /dev/null +++ b/e107_handlers/rate_class.php @@ -0,0 +1,227 @@ + + + + + + + + + + + + + "; + return $str; + } + + function rateradio($table, $id) { + + $table = preg_replace('/\W/', '', $table); + $id = intval($id); + + $str = " + 1 + 2  + 3  + 4  + 5  + 6  + 7  + 8  + 9  + 10"; + return $str; + } + + function checkrated($table, $id) { + + $table = preg_replace('/\W/', '', $table); + $id = intval($id); + + $sql = new db; + if (!$sql->db_Select("rate", "*", "rate_table = '{$table}' AND rate_itemid = '{$id}' ")) { + return FALSE; + } else { + $row = $sql->db_Fetch(); + + if (preg_match("/\.".USERID."\./", $row['rate_voters'])) { + return TRUE; + //added option to split an individual users rating + }else if (preg_match("/\.".USERID.chr(1)."([0-9]{1,2})\./", $row['rate_voters'])) { + return TRUE; + } else { + return FALSE; + } + } + } + + function getrating($table, $id, $userid=FALSE) { + //userid : boolean, get rating for a single user, or get general total rating of the item + + $table = preg_replace('/\W/', '', $table); + $id = intval($id); + + $sql = new db; + if (!$sql->db_Select("rate", "*", "rate_table = '{$table}' AND rate_itemid = '{$id}' ")) { + return FALSE; + } else { + $rowgr = $sql->db_Fetch(); + if($userid==TRUE){ + $rating = ""; + $rateusers = explode(".", $rowgr['rate_voters']); + for($i=0;$i 10 || $qs[3] < 1) { + header("location:".e_BASE."index.php"); + exit; + } + + $table = $tp -> toDB($qs[0], true); + $itemid = intval($qs[1]); + $rate = intval($qs[3]); + + //rating is now stored as userid-rating (to retain individual users rating) + //$sep = "^"; + $sep = chr(1); + $voter = USERID.$sep.intval($qs[3]); + + if ($sql->db_Select("rate", "*", "rate_table='$table' AND rate_itemid='$itemid' ")) { + $row = $sql->db_Fetch(); + $rate_voters = $row['rate_voters'].".".$voter."."; + $sql->db_Update("rate", "rate_votes=rate_votes+1, rate_rating=rate_rating+'$rate', rate_voters='$rate_voters' WHERE rate_itemid='$itemid' "); + } else { + $sql->db_Insert("rate", " 0, '$table', '$itemid', '$rate', '1', '.".$voter.".' "); + } + } + + function composerating($table, $id, $enter=TRUE, $userid=FALSE, $nojump=FALSE){ + //enter : boolean to show (rateselect box + textual info) or not + //userid : used to calculate a users given rating + //nojump : boolean, if present no urljump will be used (needed in comment_rating system) + + $rate = ""; + if($ratearray = $this -> getrating($table, $id, $userid)){ + if($ratearray[1] > 0){ + for($c=1; $c<= $ratearray[1]; $c++){ + $rate .= ""; + } + if($ratearray[1] < 10){ + for($c=9; $c>=$ratearray[1]; $c--){ + $rate .= ""; + } + } + $rate .= ""; + if($ratearray[2] == ""){ $ratearray[2] = 0; } + $rate .= " ".$ratearray[1].".".$ratearray[2]; + if(!$userid){ + $rate .= " - ".$ratearray[0]." "; + $rate .= ($ratearray[0] == 1 ? RATELAN_0 : RATELAN_1); + } + } + }else{ + if($enter===TRUE){ + $rate .= RATELAN_4; + } + } + if($enter===TRUE){ + if(!isset($ratearray[1]) || $ratearray[1] > 0){ + $rate .= " - "; + } + if(!$this -> checkrated($table, $id) && USER){ + $rate .= $this -> rateselect(RATELAN_2, $table, $id, $nojump); + + }else if(USER){ + $rate .= RATELAN_3; + } + } + + return $rate; + + } + + function delete_ratings($table, $id) + { + global $tp, $sql; + $table = $tp->toDB($table, true); + $id = intval($id); + return $sql -> db_Delete("rate", "rate_itemid='{$id}' AND rate_table='{$table}'"); + } +} +?> diff --git a/e107_handlers/ren_help.php b/e107_handlers/ren_help.php new file mode 100644 index 000000000..a1948abb7 --- /dev/null +++ b/e107_handlers/ren_help.php @@ -0,0 +1,328 @@ +".$BBCODE_TEMPLATE; + + if($temp[$mode]) + { + $BBCODE_TEMPLATE = $temp[$mode]; + } + if(is_readable(e_FILE."shortcode/batch/bbcode_shortcodes.php")) + { + require_once(e_FILE."shortcode/batch/bbcode_shortcodes.php"); + return $tp->parseTemplate($BBCODE_TEMPLATE, FALSE, $bbcode_shortcodes); + } + else + { + return "ERROR: ".e_FILE."shortcode/batch/bbcode_shortcodes.php IS NOT READABLE."; + } + +} + + +function Size_Select($formid='size_selector') { + $text =" + \n"; + + return $text; +} + + +function Color_Select($formid='col_selector') { + + $text = " + + "; + + return $text; +} + + +function PreImage_Select($formid) { + global $fl, $tp, $bbcode_imagedir; + + $path = ($bbcode_imagedir) ? $bbcode_imagedir : e_IMAGE."newspost_images/"; + $formid = ($formid) ? ($formid) : "preimage_selector"; + + + if(!is_object($fl)){ + require_once(e_HANDLER."file_class.php"); + $fl = new e_file; + } + + $rejecthumb = array('$.','$..','/','CVS','thumbs.db','*._$', 'index', 'null*'); + $imagelist = $fl->get_files($path,"",$rejecthumb,2); + sort($imagelist); + + $text =" + \n\n"; + return $text; +} + +function PreFile_Select($formid='prefile_selector',$bbcode_filedir) { + require_once(e_HANDLER."userclass_class.php"); + global $IMAGES_DIRECTORY, $fl, $sql; + $rejecthumb = array('$.','$..','/','CVS','thumbs.db','*._$', 'index', 'null*'); + + $filelist = array(); + $downloadList = array(); + + $sql->db_Select("download", "*", "download_class != ".e_UC_NOBODY); + while ($row = $sql->db_Fetch()) { + extract($row); + if($download_url) + { + $filelist[] = array("id" => $download_id, "name" => $download_name, "url" => $download_url, "class" => $download_class); + $downloadList[] = $download_url; + } + } + + $tmp = $fl->get_files(e_FILE."downloads/","",$rejecthumb); + foreach($tmp as $value) + { + if(!in_array($value['fname'], $downloadList)) + { + $filelist[] = array("id" => 0, "name" => $value['fname'], "url" => $value['fname']); + } + } + $text =" + \n\n"; + return $text; +} + +function Emoticon_Select($formid='emoticon_selector') { + require_once(e_HANDLER."emote.php"); + $text =" + \n\n"; + return $text; +} + +?> \ No newline at end of file diff --git a/e107_handlers/resize_handler.php b/e107_handlers/resize_handler.php new file mode 100644 index 000000000..bd55bd316 --- /dev/null +++ b/e107_handlers/resize_handler.php @@ -0,0 +1,155 @@ +DEBUG image_stats are null
    "; + return false; + } + + if ($image_stats[2] != 1 && $image_stats[2] != 2 && $image_stats[2] != 3 && ($mode == 'gd1' || $mode == 'gd2')) { + echo "DEBUG Wrong image type
    "; + return FALSE; + } + $imagewidth = $image_stats[0]; + $imageheight = $image_stats[1]; + if ($imagewidth <= $new_size && ($imageheight <= $new_height || $new_height == 0)) { + return TRUE; + } + $ratio = ($imagewidth / $new_size); + $new_imageheight = round($imageheight / $ratio); + if (($new_height <= $new_imageheight) && $new_height > 0) { + $ratio = $new_imageheight / $new_height; + $new_imageheight = $new_height; + $new_size = round($new_size / $ratio); + + } + if ($mode == "ImageMagick") { + if ($destination_file == "stdout") { + /* if destination is stdout, output directly to the browser */ + $destination_file = "jpg:-"; + header("Content-type: image/jpeg"); + passthru ($pref['im_path']."convert -quality ".$im_quality." -antialias -geometry ".$new_size."x".$new_imageheight." ".escapeshellarg($source_file)." '".$destination_file."'"); + } else { + /* otherwise output to file */ + if ($model == "copy") { + $name = substr($destination_file, (strrpos($destination_file, "/")+1)); + $name2 = "thumb_".$name; + $destination_file = str_replace($name, $name2, $destination_file); + } + exec ($pref['im_path']."convert -quality ".$im_quality." -antialias -geometry ".$new_size."x".$new_imageheight." ".escapeshellarg($source_file)." '".$destination_file."'"); + + } + } + else if($mode == "gd1") { + if ($image_stats[2] == 2) + $src_img = imagecreatefromjpeg($source_file); + else + $src_img = imagecreatefrompng($source_file); + if (!$src_img) { + return FALSE; + } + $dst_img = imagecreate($new_size, $new_imageheight); + imagecopyresized($dst_img, $src_img, 0, 0, 0, 0, $new_size, $new_imageheight, $imagewidth, $imageheight); + if ($model == "copy") { + $name = substr($destination_file, (strrpos($destination_file, "/")+1)); + $name2 = "thumb_".$name; + $destination_file = str_replace($name, $name2, $destination_file); + } + + if ($destination_file == "stdout") { + header("Content-type: image/jpeg"); + imagejpeg($dst_img, '', $im_quality); + } else { + imagejpeg($dst_img, $destination_file, $im_quality); + imagedestroy($src_img); + imagedestroy($dst_img); + } + + } + else if($mode == "gd2") { + + if ($image_stats[2] == 2) + $src_img = imagecreatefromjpeg($source_file); + else + $src_img = imagecreatefrompng($source_file); + if (!$src_img) { + return FALSE; + } + + $dst_img = imagecreatetruecolor($new_size, $new_imageheight); + imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $new_size, $new_imageheight, $imagewidth, $imageheight); + + if ($model == "copy") { + $name = substr($destination_file, (strrpos($destination_file, "/")+1)); + $name2 = "thumb_".$name; + $destination_file = str_replace($name, $name2, $destination_file); + } + if ($destination_file == "stdout") { + header("Content-type: image/jpeg"); + imagejpeg($dst_img, '', $im_quality); + } else { + imagejpeg($dst_img, $destination_file, $im_quality); + imagedestroy($src_img); + imagedestroy($dst_img); + } + } + + @chmod($destination_file, 0644); + if ($pref['image_owner']) { + @chown($destination_file, $pref['image_owner']); + } + + $image_stats = getimagesize($destination_file); + if ($image_stats == null) { + // @unlink($source_file); + return FALSE; + } else { + return TRUE; + } +} +?> \ No newline at end of file diff --git a/e107_handlers/search/advanced_comment.php b/e107_handlers/search/advanced_comment.php new file mode 100644 index 000000000..2e2512d17 --- /dev/null +++ b/e107_handlers/search/advanced_comment.php @@ -0,0 +1,44 @@ + 'all', 'title' => LAN_SEARCH_58); + +$advanced_caption['id'] = 'type'; +$advanced_caption['title']['all'] = LAN_SEARCH_59; + +foreach ($search_prefs['comments_handlers'] as $h_key => $value) { + if (check_class($value['class'])) { + $path = ($value['dir'] == 'core') ? e_HANDLER.'search/comments_'.$h_key.'.php' : e_PLUGIN.$value['dir'].'/search/search_comments.php'; + require_once($path); + $advanced['type']['list'][] = array('id' => 's_'.$value['id'], 'title' => $comments_title); + $advanced_caption['title']['s_'.$value['id']] = LAN_SEARCH_60.' '.$comments_title; + } +} + +$advanced['date']['type'] = 'date'; +$advanced['date']['text'] = LAN_SEARCH_50.':'; + +$advanced['author']['type'] = 'author'; +$advanced['author']['text'] = LAN_SEARCH_61.':'; + +?> \ No newline at end of file diff --git a/e107_handlers/search/advanced_download.php b/e107_handlers/search/advanced_download.php new file mode 100644 index 000000000..766971384 --- /dev/null +++ b/e107_handlers/search/advanced_download.php @@ -0,0 +1,47 @@ + 'all', 'title' => LAN_SEARCH_51); + +$advanced_caption['id'] = 'cat'; +$advanced_caption['title']['all'] = LAN_SEARCH_64; + +if ($sql -> db_Select_gen("SELECT download_category_id, download_category_name FROM #download_category WHERE download_category_parent != 0 AND download_category_class IN (".USERCLASS_LIST.")")) { + while ($row = $sql -> db_Fetch()) { + $advanced['cat']['list'][] = array('id' => $row['download_category_id'], 'title' => $row['download_category_name']); + $advanced_caption['title'][$row['download_category_id']] = LAN_SEARCH_65.' -> '.$row['download_category_name']; + } +} + +$advanced['date']['type'] = 'date'; +$advanced['date']['text'] = LAN_SEARCH_66.':'; + +$advanced['author']['type'] = 'author'; +$advanced['author']['text'] = LAN_SEARCH_61.':'; + +$advanced['match']['type'] = 'dropdown'; +$advanced['match']['text'] = LAN_SEARCH_52.':'; +$advanced['match']['list'][] = array('id' => 0, 'title' => LAN_SEARCH_67); +$advanced['match']['list'][] = array('id' => 1, 'title' => LAN_SEARCH_54); + +?> \ No newline at end of file diff --git a/e107_handlers/search/advanced_news.php b/e107_handlers/search/advanced_news.php new file mode 100644 index 000000000..6cf8c3c26 --- /dev/null +++ b/e107_handlers/search/advanced_news.php @@ -0,0 +1,44 @@ + 'all', 'title' => LAN_SEARCH_51); + +$advanced_caption['id'] = 'cat'; +$advanced_caption['title']['all'] = LAN_SEARCH_56; + +if ($sql -> db_Select("news_category", "category_id, category_name")) { + while($row = $sql -> db_Fetch()) { + $advanced['cat']['list'][] = array('id' => $row['category_id'], 'title' => $row['category_name']); + $advanced_caption['title'][$row['category_id']] = 'News -> '.$row['category_name']; + } +} + +$advanced['date']['type'] = 'date'; +$advanced['date']['text'] = LAN_SEARCH_50.':'; + +$advanced['match']['type'] = 'dropdown'; +$advanced['match']['text'] = LAN_SEARCH_52.':'; +$advanced['match']['list'][] = array('id' => 0, 'title' => LAN_SEARCH_53); +$advanced['match']['list'][] = array('id' => 1, 'title' => LAN_SEARCH_54); + +?> \ No newline at end of file diff --git a/e107_handlers/search/advanced_pages.php b/e107_handlers/search/advanced_pages.php new file mode 100644 index 000000000..375327b1e --- /dev/null +++ b/e107_handlers/search/advanced_pages.php @@ -0,0 +1,25 @@ + \ No newline at end of file diff --git a/e107_handlers/search/advanced_user.php b/e107_handlers/search/advanced_user.php new file mode 100644 index 000000000..3044237c7 --- /dev/null +++ b/e107_handlers/search/advanced_user.php @@ -0,0 +1,25 @@ + \ No newline at end of file diff --git a/e107_handlers/search/comments_download.php b/e107_handlers/search/comments_download.php new file mode 100644 index 000000000..bda8122a7 --- /dev/null +++ b/e107_handlers/search/comments_download.php @@ -0,0 +1,38 @@ + convert_date($row['comment_datestamp'], "long"); + $res['link'] = "download.php?view.".$row['download_id']; + $res['pre_title'] = $row['download_name'] ? LAN_SEARCH_70.": " : ""; + $res['title'] = $row['download_name'] ? $row['download_name'] : LAN_SEARCH_9; + $res['summary'] = $row['comment_comment']; + preg_match("/([0-9]+)\.(.*)/", $row['comment_author'], $user); + $res['detail'] = LAN_SEARCH_7."".$user[2]."".LAN_SEARCH_8.$datestamp; + return $res; +} + +?> \ No newline at end of file diff --git a/e107_handlers/search/comments_news.php b/e107_handlers/search/comments_news.php new file mode 100644 index 000000000..4258b7cb9 --- /dev/null +++ b/e107_handlers/search/comments_news.php @@ -0,0 +1,38 @@ + convert_date($row['comment_datestamp'], "long"); + $res['link'] = "comment.php?comment.news.".$row['comment_item_id']; + $res['pre_title'] = $row['news_title'] ? LAN_SEARCH_71.": " : ""; + $res['title'] = $row['news_title'] ? $row['news_title'] : LAN_SEARCH_9; + $res['summary'] = $row['comment_comment']; + preg_match("/([0-9]+)\.(.*)/", $row['comment_author'], $user); + $res['detail'] = LAN_SEARCH_7."".$user[2]."".LAN_SEARCH_8.$datestamp; + return $res; +} + +?> \ No newline at end of file diff --git a/e107_handlers/search/comments_page.php b/e107_handlers/search/comments_page.php new file mode 100644 index 000000000..1d67bdc65 --- /dev/null +++ b/e107_handlers/search/comments_page.php @@ -0,0 +1,38 @@ + convert_date($row['comment_datestamp'], "long"); + $res['link'] = "page.php?".$row['page_id']; + $res['pre_title'] = LAN_SEARCH_76.": "; + $res['title'] = $row['page_title']; + $res['summary'] = $row['comment_comment']; + preg_match("/([0-9]+)\.(.*)/", $row['comment_author'], $user); + $res['detail'] = LAN_SEARCH_7."".$user[2]."".LAN_SEARCH_8.$datestamp; + return $res; +} + +?> \ No newline at end of file diff --git a/e107_handlers/search/comments_user.php b/e107_handlers/search/comments_user.php new file mode 100644 index 000000000..d87ac0e17 --- /dev/null +++ b/e107_handlers/search/comments_user.php @@ -0,0 +1,38 @@ + convert_date($row['comment_datestamp'], "long"); + $res['link'] = "user.php?id.".$row['comment_item_id']; + $res['pre_title'] = LAN_SEARCH_77.": "; + $res['title'] = $row['user_name']; + $res['summary'] = $row['comment_comment']; + preg_match("/([0-9]+)\.(.*)/", $row['comment_author'], $user); + $res['detail'] = LAN_SEARCH_7."".$user[2]."".LAN_SEARCH_8.$datestamp; + return $res; +} + +?> \ No newline at end of file diff --git a/e107_handlers/search/index.html b/e107_handlers/search/index.html new file mode 100644 index 000000000..e69de29bb diff --git a/e107_handlers/search/search_comment.php b/e107_handlers/search/search_comment.php new file mode 100644 index 000000000..35f77d0c5 --- /dev/null +++ b/e107_handlers/search/search_comment.php @@ -0,0 +1,70 @@ + toDB($_GET['type'])))."' AND"; +} + +if (isset($_GET['time']) && is_numeric($_GET['time'])) { + $advanced_where .= " c.comment_datestamp ".($_GET['on'] == 'new' ? '>=' : '<=')." '".(time() - $_GET['time'])."' AND"; +} + +if (isset($_GET['author']) && $_GET['author'] != '') { + $advanced_where .= " c.comment_author LIKE '%".$tp -> toDB($_GET['author'])."%' AND"; +} + +//basic +$return_fields = 'c.comment_item_id, c.comment_author, c.comment_datestamp, c.comment_comment, c.comment_type'; + +foreach ($search_prefs['comments_handlers'] as $h_key => $value) { + if (check_class($value['class'])) { + $path = ($value['dir'] == 'core') ? e_HANDLER.'search/comments_'.$h_key.'.php' : e_PLUGIN.$value['dir'].'/search/search_comments.php'; + if (is_readable($path)) { + require_once($path); + $in[] = "'".$value['id']."'"; + $join[] = $comments_table[$h_key]; + $return_fields .= ', '.$comments_return[$h_key]; + } + + } +} + +$search_fields = array('c.comment_comment', 'c.comment_author'); +$weights = array('1.2', '0.6'); +$no_results = LAN_198; +$where = "comment_type IN (".implode(',', $in).") AND".$advanced_where; +$order = array('comment_datestamp' => DESC); +$table = "comments AS c ".implode(' ', $join); + +$ps = $sch -> parsesearch($table, $return_fields, $search_fields, $weights, 'search_comment', $no_results, $where, $order); +$text .= $ps['text']; +$results = $ps['results']; + +function search_comment($row) { + if (is_callable('com_search_'.$row['comment_type'])) { + $res = call_user_func('com_search_'.$row['comment_type'], $row); + return $res; + } +} + +?> \ No newline at end of file diff --git a/e107_handlers/search/search_download.php b/e107_handlers/search/search_download.php new file mode 100644 index 000000000..9d751c81c --- /dev/null +++ b/e107_handlers/search/search_download.php @@ -0,0 +1,66 @@ +=' : '<=')." '".(time() - $_GET['time'])."' AND"; +} + +if (isset($_GET['author']) && $_GET['author'] != '') { + $advanced_where .= " (d.download_author = '".$tp -> toDB($_GET['author'])."') AND"; +} + +if (isset($_GET['match']) && $_GET['match']) { + $search_fields = array('d.download_name'); +} else { + $search_fields = array('d.download_name', 'd.download_url', 'd.download_description', 'd.download_author', 'd.download_author_website'); +} + +// basic +$return_fields = 'd.download_id, d.download_category, download_category_id, d.download_name, d.download_description, d.download_author, d.download_author_website, d.download_datestamp, d.download_class, c.download_category_name, c.download_category_class'; +$weights = array('1.2', '0.9', '0.6', '0.6', '0.4'); +$no_results = LAN_198; +$where = "download_active = '1' AND d.download_visible IN (".USERCLASS_LIST.") AND c.download_category_class IN (".USERCLASS_LIST.") AND".$advanced_where; +$order = array('download_datestamp' => DESC); +$table = "download AS d LEFT JOIN #download_category AS c ON d.download_category = c.download_category_id"; + +$ps = $sch -> parsesearch($table, $return_fields, $search_fields, $weights, 'search_downloads', $no_results, $where, $order); +$text .= $ps['text']; +$results = $ps['results']; + +function search_downloads($row) { + global $con; + $datestamp = $con -> convert_date($row['download_datestamp'], "long"); + $res['link'] = "download.php?view.".$row['download_id']; + $res['pre_title'] = $row['download_category_name']." | "; + $res['title'] = $row['download_name']; + $res['pre_summary'] = ""; + $res['summary'] = $row['download_description']; + $res['detail'] = LAN_SEARCH_15." ".$row['download_author']." | ".LAN_SEARCH_66.": ".$datestamp; + return $res; +} + +?> \ No newline at end of file diff --git a/e107_handlers/search/search_event.php b/e107_handlers/search/search_event.php new file mode 100644 index 000000000..89be8dd65 --- /dev/null +++ b/e107_handlers/search/search_event.php @@ -0,0 +1,66 @@ + toDB($query); +$results = $sql->db_Select("event", "*", "event_stake REGEXP('".$query."') OR event_ward REGEXP('".$query."') OR event_organisation REGEXP('".$query."') OR event_title REGEXP('".$query."') + OR event_location REGEXP('".$query."') OR event_details REGEXP('".$query."') OR event_thread REGEXP('".$query."') "); +while (list($event_id, $event_stake, $event_ward, $event_organisation, $event_start, $event_end, $event_allday, , , $event_title, $event_location, $event_details, $event_author, $event_contact, $event_category, $event_url ) = $sql->db_Fetch()) { + + $sql2->db_select("event_cat", "event_cat_name, event_cat_icon", "event_cat_id='".$event_category."' "); + list($event_cat_name, $event_cat_icon ) = $sql2->db_Fetch(); + + $event_stake_ = parsesearch($event_stake, $query); + if (!$event_stake_) { + $event_stake_ = $event_stake; + } + + $event_ward_ = parsesearch($event_ward, $query); + if (!$event_ward_) { + $event_ward_ = $event_ward; + } + + $event_organisation_ = parsesearch($event_organisation, $query); + if (!$event_organisation_) { + $event_organisation_ = $event_organisation; + } + + $event_title_ = parsesearch($event_title, $query); + if (!$event_title_) { + $event_title_ = $event_title; + } + + $event_details_ = parsesearch($event_details, $query); + if (!$event_details_) { + $event_details_ = $event_details; + } + + $event_cat_name_ = parsesearch($event_cat_name, $query); + if (!$event_cat_name_) { + $event_cat_name_ = $event_cat_name; + } + $event_threat_ = parsesearch($event_threat, $query); + if (!$event_url_) { + $event_threat_ = $event_threat; + } + $text .= "bullet {$event_title}{$event_details}
    "; +} +$qtype = LAN_911; +?> \ No newline at end of file diff --git a/e107_handlers/search/search_news.php b/e107_handlers/search/search_news.php new file mode 100644 index 000000000..41dd9f9e0 --- /dev/null +++ b/e107_handlers/search/search_news.php @@ -0,0 +1,62 @@ +=' : '<=')." '".(time() - $_GET['time'])."' AND"; +} + +if (isset($_GET['match']) && $_GET['match']) { + $search_fields = array('news_title'); +} else { + $search_fields = array('news_title', 'news_body', 'news_extended'); +} + +// basic +$return_fields = 'n.news_id, n.news_title, n.news_body, n.news_extended, n.news_allow_comments, n.news_datestamp, n.news_category, c.category_name'; +$weights = array('1.2', '0.6', '0.6'); +$no_results = LAN_198; +$time = time(); + +$where = "(news_start < ".$time.") AND (news_end=0 OR news_end > ".$time.") AND news_class IN (".USERCLASS_LIST.") AND".$advanced_where; +$order = array('news_datestamp' => DESC); +$table = "news AS n LEFT JOIN #news_category AS c ON n.news_category = c.category_id"; + +$ps = $sch -> parsesearch($table, $return_fields, $search_fields, $weights, 'search_news', $no_results, $where, $order); +$text .= $ps['text']; +$results = $ps['results']; + +function search_news($row) { + global $con; + $res['link'] = $row['news_allow_comments'] ? "news.php?item.".$row['news_id'] : "comment.php?comment.news.".$row['news_id']; + $res['pre_title'] = $row['category_name']." | "; + $res['title'] = $row['news_title']; + $res['summary'] = $row['news_body'].' '.$row['news_extended']; + $res['detail'] = LAN_SEARCH_3.$con -> convert_date($row['news_datestamp'], "long"); + return $res; +} + +?> \ No newline at end of file diff --git a/e107_handlers/search/search_pages.php b/e107_handlers/search/search_pages.php new file mode 100644 index 000000000..3d78c355b --- /dev/null +++ b/e107_handlers/search/search_pages.php @@ -0,0 +1,52 @@ +=' : '<=')." '".(time() - $_GET['time'])."' AND"; +} + +// basic +$return_fields = 'page_id, page_title, page_text, page_datestamp'; +$search_fields = array('page_title', 'page_text'); +$weights = array('1.2', '0.6'); +$no_results = LAN_198; + +$where = "page_class IN (".USERCLASS_LIST.") AND".$advanced_where; +$order = array('page_datestamp' => DESC); +$table = "page"; + +$ps = $sch -> parsesearch($table, $return_fields, $search_fields, $weights, 'search_pages', $no_results, $where, $order); +$text .= $ps['text']; +$results = $ps['results']; + +function search_pages($row) { + global $con; + $res['link'] = "page.php?".$row['page_id']; + $res['pre_title'] = ""; + $res['title'] = $row['page_title']; + $res['summary'] = $row['page_text']; + $res['detail'] = LAN_SEARCH_3.$con -> convert_date($row['page_datestamp'], "long"); + return $res; +} + +?> \ No newline at end of file diff --git a/e107_handlers/search/search_user.php b/e107_handlers/search/search_user.php new file mode 100644 index 000000000..24f020c8b --- /dev/null +++ b/e107_handlers/search/search_user.php @@ -0,0 +1,50 @@ +=' : '<=')." '".(time() - $_GET['time'])."' AND"; +} + +// basic +$return_fields = 'user_id, user_name, user_email, user_signature, user_join'; +$search_fields = array('user_name', 'user_email', 'user_signature'); +$weights = array('1.2', '0.6', '0.6', '0.6', '0.6'); +$no_results = LAN_198; +$where = $advanced_where; +$order = array('user_join' => DESC); + +$ps = $sch -> parsesearch('user', $return_fields, $search_fields, $weights, 'search_user', $no_results, $where, $order); +$text .= $ps['text']; +$results = $ps['results']; + +function search_user($row) { + global $con; + $res['link'] = "user.php?id.".$row['user_id']; + $res['pre_title'] = $row['user_id']." | "; + $res['title'] = $row['user_name']; + $res['summary'] = $row['user_signature'] ? LAN_SEARCH_72.": ".$row['user_signature'] : LAN_SEARCH_73; + $res['detail'] = LAN_SEARCH_74.": ".$con -> convert_date($row['user_join'], "long"); + return $res; +} + +?> \ No newline at end of file diff --git a/e107_handlers/search_class.php b/e107_handlers/search_class.php new file mode 100644 index 000000000..8e7671f78 --- /dev/null +++ b/e107_handlers/search_class.php @@ -0,0 +1,307 @@ + query = $query; + $this -> bullet = (defined("BULLET") ? "" : ""); + preg_match_all('/(\W?".*?")|(.*?)(\s|$)/', $this -> query, $boolean_keys); + sort($this -> keywords['split'] = array_unique(array_filter(str_replace('"', '', array_merge($boolean_keys[1], $boolean_keys[2]))))); + foreach ($this -> keywords['split'] as $k_key => $key) { + if (!$this -> stopword($key)) { + if ($key{(strlen($key) - 1)} == '*') { + $this -> keywords['wildcard'][$k_key] = TRUE; + $key = substr($key, 0, -1); + } else { + $this -> keywords['wildcard'][$k_key] = FALSE; + } + if ($key{0} == '+') { + $this -> keywords['boolean'][$k_key] = '+'; + $this -> keywords['match'][$k_key] = substr($key, 1); + } else if ($key{0} == '-') { + $this -> keywords['boolean'][$k_key] = '-'; + $this -> keywords['match'][$k_key] = substr($key, 1); + } else { + $this -> keywords['boolean'][$k_key] = FALSE; + $this -> keywords['match'][$k_key] = $key; + } + $this -> keywords['exact'][$k_key] = (strpos($key, ' ') !== FALSE) ? TRUE : FALSE; + $this -> keywords['match'][$k_key] = $tp -> toDB($this -> keywords['match'][$k_key]); + } else { + unset ($this -> keywords['split'][$k_key]); + } + } + } + + function parsesearch($table, $return_fields, $search_fields, $weights, $handler, $no_results, $where, $order) { + global $sql, $query, $tp, $search_prefs, $pre_title, $search_chars, $search_res, $result_flag; + $this -> query = $tp -> toDB($query); + if (!$search_prefs['mysql_sort']) { + $field_operator = 'AND '; + foreach ($this -> keywords['match'] as $k_key => $key) { + $boolean_regex = ''; + if ($this -> keywords['boolean'][$k_key] == '+') { + $key_operator = 'OR '; + $break = TRUE; + $no_exact = TRUE; + } else if ($this -> keywords['boolean'][$k_key] == '-') { + foreach ($this -> keywords as $unset_key => $unset_value) { + unset($this -> keywords[$unset_key][$k_key]); + } + $key_operator = 'AND '; + $boolean_regex = 'NOT'; + $no_exact = TRUE; + } else if (!isset($break)) { + $key_operator = 'OR '; + if (isset($switch)) { + $field_operator = 'OR '; + } + $switch = TRUE; + } else { + break; + } + $match_query .= isset($uninitial_field) ? " ".$field_operator." (" : "("; + $uninitial_field = TRUE; + if ($this -> keywords['wildcard'][$k_key] || !$search_prefs['boundary']) { + $wildcard = ''; + } else { + $wildcard = '[[:>:]]'; + } + $key_count = 1; + foreach ($search_fields as $field) { + $regexp = $search_prefs['boundary'] ? "[[:<:]]".$key.$wildcard : $key; + $match_query .= " ".$field." ".$boolean_regex." REGEXP '".$regexp."' "; + if ($key_count != count($search_fields)) { + $match_query .= $key_operator; + } + $key_count++; + } + $match_query .= ")"; + } + if ($order) { + $sql_order = 'ORDER BY '; + $order_count = count($order); + $i = 1; + foreach ($order as $sort_key => $sort_value) { + $sql_order .= $sort_key.' '.$sort_value; + if ($i != $order_count) { + $sql_order .= ', '; + } + $i++; + } + } else { + $sql_order = ''; + } + $limit = $search_prefs['php_limit'] ? ' LIMIT 0,'.$search_prefs['php_limit'] : ''; + $sql_query = "SELECT ".$return_fields." FROM #".$table." WHERE ".$where." (".$match_query.") ".$sql_order.$limit.";"; + if ((($keycount = count($this -> keywords['split'])) > 1) && (strpos($query, '"') === FALSE) && (!isset($no_exact))) { + $exact_query[] = $query; + $this -> keywords['split'] = array_merge($exact_query, $this -> keywords['split']); + } + } else { + $this -> query = str_replace('"', '"', $this -> query); + $field_query = implode(',', $search_fields); + foreach ($search_fields as $field_key => $field) { + $search_query[] = "(".$weights[$field_key]." * (MATCH(".$field.") AGAINST ('".$this -> query."' IN BOOLEAN MODE)))"; + } + $match_query = implode(' + ', $search_query); + $sql_order = ''; + foreach ($order as $sort_key => $sort_value) { + $sql_order .= ', '.$sort_key.' '.$sort_value; + } + $limit = " LIMIT ".$result_flag.",".$search_res; + $sql_query = "SELECT SQL_CALC_FOUND_ROWS ".$return_fields.", (".$match_query.") AS relevance FROM #".$table." WHERE ".$where." ( MATCH(".$field_query.") AGAINST ('".$this -> query."' IN BOOLEAN MODE) ) HAVING relevance > 0 ORDER BY relevance DESC ".$sql_order.$limit.";"; + } + + if ($ps['results'] = $sql -> db_Select_gen($sql_query)) { + if (!$search_prefs['mysql_sort']) { + $x = 0; + foreach ($search_fields as $field_key => $field) { + $crop_fields[] = preg_replace('/(.*?)\./', '', $field); + } + while ($row = $sql -> db_Fetch()) { + $weight = 0; + foreach ($crop_fields as $field_key => $field) { + $this -> text = $row[$field]; + foreach ($this -> keywords['match'] as $k_key => $this -> query) { + if (stristr($this -> text, $this -> query) !== FALSE) { + if ($this -> keywords['exact'][$k_key] || $this -> keywords['boolean'][$k_key]) { + $weight += (($weights[$field_key] * 2) * ($keycount)); + $endweight = TRUE; + } else if (!$endweight) { + $weight += $weights[$field_key]; + } + } + } + $endweight = FALSE; + + } + foreach ($row as $r_key => $r_value) { + $qrow[$x][$r_key] = $r_value; + $qrow[$x]['relevance'] = $weight; + $qrow[$x]['search_id'] = $x; + } + $x++; + } + + foreach($qrow as $info) { + $sortarr[] = $info['relevance']; + } + array_multisort($sortarr, SORT_DESC, $qrow, SORT_DESC); + + $result_number = ($x < ($result_flag + $search_res)) ? $x : $result_flag + $search_res; + for ($i = $result_flag; $i < $result_number; $i++) { + $display_row[] = $qrow[$i]; + } + + } else { + $x = 0; + while ($row = $sql -> db_Fetch()) { + $display_row[] = $row; + $x++; + } + } + + foreach ($display_row as $row) { + $res = call_user_func($handler, $row); + if (!$res['omit_result']) { + $matches = array($res['title'], $res['summary']); + $endcrop = FALSE; + $output = ''; + $title = TRUE; + foreach ($matches as $this -> text) { + $this -> text = nl2br($this -> text); + $t_search = $tp -> search; + $t_replace = $tp -> replace; + $s_search = array('
    ', '[', ']'); + $s_replace = array(' ', '<', '>'); + $search = array_merge($t_search, $s_search); + $replace = array_merge($t_replace, $s_replace); + $this -> text = strip_tags(str_replace($search, $replace, $this -> text)); + foreach ($this -> keywords['match'] as $match_id => $this -> query) { + $boundary = $search_prefs['boundary'] ? '\b' : ''; + if ($this -> keywords['wildcard'][$match_id]) { + $regex_append = ".*?".$boundary.")"; + } else { + $regex_append = $boundary.")"; + } + if (($match_start = stristr($this -> text, $this -> query)) !== FALSE) { + $this -> pos = strlen($this -> text) - strlen($match_start); + if (!$endcrop && !$title) { + $this -> parsesearch_crop(); + $endcrop = TRUE; + } + $key = substr($this -> text, $this -> pos, strlen($this -> query)); + $this -> text = preg_replace("#(".$boundary.$this -> query.$regex_append."#i", "\\1", $this -> text); + } + } + if ($title) { + if ($pre_title == 0) { + $pre_title_output = ""; + } else if ($pre_title == 1) { + $pre_title_output = $res['pre_title']; + } else if ($pre_title == 2) { + $pre_title_output = $pre_title; + } + $this -> text = $this -> bullet." ".$pre_title_output.$this -> text."
    ".$res['pre_summary']; + } else if (!$endcrop) { + $this -> parsesearch_crop(); + } + $output .= $this -> text; + $title = FALSE; + } + $display_rel = $search_prefs['relevance'] ? " | ".LAN_SEARCH_69.": ".round($row['relevance'], 1) : ""; + $output_array['text'][] = $output.$res['post_summary']."
    ".$res['detail'].$display_rel."

    "; + } else { + $ps['results']--; + $res['omit_result'] = FALSE; + } + } + $ps_limit = $output_array['text']; + $result_number = ($x < $search_res) ? $x : $search_res; + for ($i = 0; $i < $result_number; $i++) { + $ps['text'] .= $ps_limit[$i]; + } + } else { + $ps['text'] = $no_results; + } + if ($search_prefs['mysql_sort']) { + $sql -> db_Query("SELECT FOUND_ROWS()"); + $frows = $sql -> db_Fetch(); + $ps['results'] = $frows[0]; + } + return $ps; + } + + function parsesearch_crop() { + global $search_chars; + if (strlen($this -> text) > $search_chars) { + if ($this -> pos < ($search_chars - strlen($this -> query))) { + $this -> text = substr($this -> text, 0, $search_chars)."..."; + } else if ($this -> pos > (strlen($this -> text) - ($search_chars - strlen($this -> query)))) { + $this -> text = "...".substr($this -> text, (strlen($this -> text) - ($search_chars - strlen($this -> query)))); + } else { + $this -> text = "...".substr($this -> text, ($this -> pos - round(($search_chars / 3))), $search_chars)."..."; + } + $match_start = stristr($this -> text, $this -> query); + $this -> pos = strlen($this -> text) - strlen($match_start); + } + } + + function stopword($key) { + global $search_prefs; + if ($search_prefs['mysql_sort'] && ($key{0} == '+')) { + $key = substr($key, 1); + } + if (($key{(strlen($key) - 1)} != '*') && ($key{0} != '+')) { + if (strlen($key) > 2) { + if ($search_prefs['mysql_sort']) { + $stopword_list = $this -> stopwords_mysql; + } else { + $stopword_list = $this -> stopwords_php; + } + if (strpos($stopword_list, '|'.$key.'|') !== FALSE) { + $this -> stop_keys[] = $key; + return TRUE; + } else { + return FALSE; + } + } else { + $this -> stop_keys[] = $key; + return TRUE; + } + } else { + return FALSE; + } + } +} + +?> \ No newline at end of file diff --git a/e107_handlers/secure_img_handler.php b/e107_handlers/secure_img_handler.php new file mode 100644 index 000000000..818cf2216 --- /dev/null +++ b/e107_handlers/secure_img_handler.php @@ -0,0 +1,69 @@ +random_number = str_replace(".", "", $sec.$usec); + } + + function create_code() { + global $pref, $sql, $IMAGES_DIRECTORY, $HANDLERS_DIRECTORY; + + require_once('e107_class.php'); + $e107 = new e107(false, false); + $e107->set_paths(); + + $imgpy = str_replace($HANDLERS_DIRECTORY, "", $e107->file_path); + + $imgp = $imgpy.$IMAGES_DIRECTORY; + mt_srand ((double)microtime() * 1000000); + $maxran = 1000000; + $rand_num = mt_rand(0, $maxran); + $datekey = date("r"); + $rcode = hexdec(md5($_SERVER['HTTP_USER_AGENT'] . serialize($pref). $rand_num . $datekey)); + $code = substr($rcode, 2, 6); + $recnum = $this->random_number; + $del_time = time()+1200; + $sql->db_Insert("tmp", "'{$recnum}',{$del_time},'{$code},{$imgp}'"); + return $recnum; + } + + function verify_code($rec_num, $checkstr) { + global $sql, $tp; + if ($sql->db_Select("tmp", "tmp_info", "tmp_ip = '".$tp -> toDB($rec_num)."'")) { + $row = $sql->db_Fetch(); + $sql->db_Delete("tmp", "tmp_ip = '".$tp -> toDB($rec_num)."'"); + list($code, $path) = explode(",", $row[0]); + return ($checkstr == $code); + } + return FALSE; + } + + function r_image() { + global $HANDLERS_DIRECTORY; + $code = $this->create_code(); + return ""; + } +} +?> diff --git a/e107_handlers/secure_img_render.php b/e107_handlers/secure_img_render.php new file mode 100644 index 000000000..32cd3b99d --- /dev/null +++ b/e107_handlers/secure_img_render.php @@ -0,0 +1,145 @@ + \ No newline at end of file diff --git a/e107_handlers/session_handler.php b/e107_handlers/session_handler.php new file mode 100644 index 000000000..9c0cc2176 --- /dev/null +++ b/e107_handlers/session_handler.php @@ -0,0 +1,118 @@ + " . time(), $session_connection)) { + $session_read = mysql_fetch_assoc($result); + return $session_read['session_data']; + } else { + return FALSE; + } +} + +function sess_write($session_id, $session_data) { + if (!$session_data) { + return FALSE; + } + global $session_connection, $session_lifetime, $mySQLprefix, $session_read; + $expiry = time() + $session_lifetime; + if ($session_read && $session_read['session_ip'] != get_full_ip()) { + session_destroy(); + die("Invalid session ID"); + } + $_session_data = mysql_real_escape_string($session_data); + if ($session_read) { + $query = "UPDATE ".$mySQLprefix."session SET session_expire = $expiry, session_data = '$_session_data' WHERE session_id = '$session_id' AND session_expire > " . time(); + $result = mysql_query($query, $session_connection); + } else { + $query = "INSERT INTO ".$mySQLprefix."session VALUES ('$session_id', $expiry, ".time().", '".get_full_ip()."', '$_session_data')"; + $result = mysql_query($query, $session_connection); + } + return TRUE; +} + +function sess_destroy($session_id) { + global $session_connection, $mySQLprefix; + $query = "DELETE FROM ".$mySQLprefix."session WHERE session_id = '$session_id'"; + $result = mysql_query($query, $session_connection); + return TRUE; +} + +function sess_gc($session_lifetime) { + global $session_connection, $mySQLprefix; + $query = "DELETE FROM ".$mySQLprefix."session WHERE session_expire < " . time(); + $result = mysql_query($query, $session_connection); + return mysql_affected_rows($session_connection); +} + +function get_full_ip() { + global $e107; + $ip_addr = $e107->getip(); + $tmp = $_SERVER['REMOTE_ADDR']; + $ip_resolved = $e107->get_host_name($tmp); + $tmp2 = ($tmp != $ip_resolved && $ip_resolved ? $tmp." - ". $ip_resolved : $tmp2 = $tmp); + $full_ip = ($ip_addr != $tmp ? "$ip_addr | $tmp2" : $tmp2); + return $full_ip; +} + +session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc"); + +e107_ini_set ("session.save_handler", "user" ); +$session_cookie_lifetime = 0; +$session_cookie_path = '/'; +$session_cookie_domain = ''; +$session_cache_expire = 60 * 24 * 30; +//$session_lifetime = ini_get("session.gc_maxlifetime"); +$session_lifetime = 60 * 24 * 30; +session_name("PHPSESSID"); +if ($_SERVER["HTTPS"] == "on") { + $session_cookie_secure = true; +} +session_set_cookie_params($session_cookie_lifetime, $session_cookie_path, $session_cookie_domain, $session_cookie_secure); +if (version_compare(phpversion(), "4.3.0", ">=")) e107_ini_set ("session.use_only_cookies", $session_use_only_cookies ); +if (version_compare(phpversion(), "4.2.0", ">=")) session_cache_expire ($session_cache_expire); +e107_ini_set ("session.url_rewriter.tags", 'a=href,area=href,frame=src,input=src,form=fakeentry'); + +if ($sql->db_Select("session", "session_id", "session_ip='".get_full_ip()."' ")) { + $row = $sql->db_Fetch(); + session_id($row['session_id']); +} + +session_start(); + +?> \ No newline at end of file diff --git a/e107_handlers/shortcode_handler.php b/e107_handlers/shortcode_handler.php new file mode 100644 index 000000000..70eb57088 --- /dev/null +++ b/e107_handlers/shortcode_handler.php @@ -0,0 +1,202 @@ + e_sc)) { + $tp->e_sc = new e_shortcode; +} + +class e_shortcode { + var $scList; + var $parseSCFiles; + var $addedCodes; + var $registered_codes; + + function e_shortcode() + { + global $pref, $register_sc; + + if($pref['shortcode_list'] != '') + { + foreach($pref['shortcode_list'] as $path=>$namearray) + { + foreach($namearray as $code=>$uclass) + { + $code = strtoupper($code); + $this->registered_codes[$code]['type'] = 'plugin'; + $this->registered_codes[$code]['path'] = $path; + // $this->registered_codes[$code]['perms'] = $uclass; + } + } + } + + if(isset($register_sc) && is_array($register_sc)) + { + foreach($register_sc as $code) + { + $this->registered_codes[$code]['type'] = 'theme'; + } + } + } + + function parseCodes($text, $useSCFiles = TRUE, $extraCodes = '') { + $this->parseSCFiles = $useSCFiles; + $ret = ''; + if (is_array($extraCodes)) { + foreach($extraCodes as $sc => $code) { + $this->scList[$sc] = $code; + } + } + $tmp = explode("\n", $text); + foreach($tmp as $line) { + if (preg_match("/{.+?}/", $line, $match)) { + $ret .= preg_replace_callback("#\{(\S[^\x02]*?\S)\}#", array($this, 'doCode'), $line); + } else { + $ret .= $line; + } + } + return $ret; + } + + function doCode($matches) + { + global $pref, $e107cache, $menu_pref, $sc_style, $parm; + + if(strpos($matches[1], E_NL) !== false) + { + return $matches[0]; + } + + if (strpos($matches[1], '=')) + { + list($code, $parm) = explode("=", $matches[1], 2); + } + else + { + $code = $matches[1]; + $parm = ''; + } + $parm = trim($parm); + + if (E107_DEBUG_LEVEL) + { + global $db_debug; + $db_debug->logCode(2, $code, $parm, ""); + } + + if (is_array($this->scList) && array_key_exists($code, $this->scList)) + { + $shortcode = $this->scList[$code]; + } + else + { + if ($this->parseSCFiles == TRUE) + { + if (is_array($this -> registered_codes) && array_key_exists($code, $this->registered_codes)) + { + if($this->registered_codes[$code]['type'] == 'plugin') + { + $scFile = e_PLUGIN.strtolower($this->registered_codes[$code]['path']).'/'.strtolower($code).'.sc'; + } + else + { + $scFile = THEME.strtolower($code).'.sc'; + } + } + else + { + $scFile = e_FILE."shortcode/".strtolower($code).".sc"; + } + if (file_exists($scFile)) { + $shortcode = file_get_contents($scFile); + $this->scList[$code] = $shortcode; + } + } + } + + if(E107_DBG_SC){ + echo " sc= ".str_replace(e_FILE."shortcode/","",$scFile)."
    "; + } + + if(E107_DBG_BBSC) + { + trigger_error("starting shortcode {".$code."}", E_USER_ERROR); + } + $ret = (isset($shortcode) ? eval($shortcode) : ""); + + if($ret != '' || is_numeric($ret)) + { + if(isset($sc_style) && is_array($sc_style) && array_key_exists($code,$sc_style)) + { + if(isset($sc_style[$code]['pre'])) + { + $ret = $sc_style[$code]['pre'].$ret; + } + if(isset($sc_style[$code]['post'])) + { + $ret = $ret.$sc_style[$code]['post']; + } + } + } + return $ret; + } + + function parse_scbatch($fname, $type = 'file') { + $ret = array(); + if($type == 'file') + { + $sc_batch = file($fname); + } + else + { + $sc_batch = $fname; + } + $cur_sc = ''; + foreach($sc_batch as $line) { + if (trim($line) == 'SC_END') { + $cur_sc = ''; + } + if ($cur_sc && !$override) { + $ret[$cur_sc] .= $line; + } + if (preg_match("#^SC_BEGIN (\w*).*#", $line, $matches)) { + $cur_sc = $matches[1]; + $ret[$cur_sc]=''; + if (is_array($this -> registered_codes) && array_key_exists($cur_sc, $this -> registered_codes)) { + if ($this -> registered_codes[$cur_sc]['type'] == 'plugin') { + $scFile = e_PLUGIN.strtolower($this -> registered_codes[$cur_sc]['path']).'/'.strtolower($cur_sc).'.sc'; + } else { + $scFile = THEME.strtolower($cur_sc).'.sc'; + } + if (is_readable($scFile)) { + $ret[$cur_sc] = file_get_contents($scFile); + } + $override = TRUE; + } else { + $override = FALSE; + } + } + } + return $ret; + } +} + +?> diff --git a/e107_handlers/sitelinks_class.php b/e107_handlers/sitelinks_class.php new file mode 100644 index 000000000..9edbe5818 --- /dev/null +++ b/e107_handlers/sitelinks_class.php @@ -0,0 +1,382 @@ +db_Select('links', '*', "link_category = ".intval($cat)." and link_class IN (".USERCLASS_LIST.") ORDER BY link_order ASC")){ + while ($row = $sql->db_Fetch()) + { + // if (substr($row['link_name'], 0, 8) == 'submenu.'){ + // $tmp=explode('.', $row['link_name'], 3); + // $this->eLinkList[$tmp[1]][]=$row; + if (isset($row['link_parent']) && $row['link_parent'] != 0){ + $this->eLinkList['sub_'.$row['link_parent']][]=$row; + }else{ + $this->eLinkList['head_menu'][] = $row; + } + } + } + + } + + function get($cat=1, $style='', $css_class = false) + { + global $pref, $ns, $e107cache, $linkstyle; + $usecache = ((trim(defset('LINKSTART_HILITE')) != "" || trim(defset('LINKCLASS_HILITE')) != "") ? false : true); + + if ($usecache && !strpos(e_SELF, e_ADMIN) & ($data = $e107cache->retrieve('sitelinks_'.$cat.md5($linkstyle.e_PAGE.e_QUERY)))) { + return $data; + } + + if (LINKDISPLAY == 4) { + require_once(e_PLUGIN.'ypslide_menu/ypslide_menu.php'); + return; + } + + $this->getlinks($cat); + + // are these defines used at all ? + + if(!defined('PRELINKTITLE')){ + define('PRELINKTITLE', ''); + } + if(!defined('PRELINKTITLE')){ + define('POSTLINKTITLE', ''); + } + // ----------------------------- + + // where did link alignment go? + if (!defined('LINKALIGN')) { define(LINKALIGN, ''); } + + if(!$style){ + $style['prelink'] = defined('PRELINK') ? PRELINK : ''; + $style['postlink'] = defined('POSTLINK') ? POSTLINK : ''; + $style['linkclass'] = defined('LINKCLASS') ? LINKCLASS : ""; + $style['linkclass_hilite'] = defined('LINKCLASS_HILITE') ? LINKCLASS_HILITE : ""; + $style['linkstart_hilite'] = defined('LINKSTART_HILITE') ? LINKSTART_HILITE : ""; + $style['linkstart'] = defined('LINKSTART') ? LINKSTART : ''; + $style['linkdisplay'] = defined('LINKDISPLAY') ? LINKDISPLAY : ''; + $style['linkend'] = defined('LINKEND') ? LINKEND : ''; + $style['linkseparator'] = defined('LINKSEPARATOR') ? LINKSEPARATOR : ''; + } + + // Sublink styles.- replacing the tree-menu. + if(isset($style['sublinkdisplay']) || isset($style['subindent']) || isset($style['sublinkclass']) || isset($style['sublinkstart']) || isset($style['sublinkend']) || isset($style['subpostlink'])){ + foreach($style as $key=>$val){ + $aSubStyle[$key] = ($style["sub".$key]) ? $style["sub".$key] : $style[$key]; + } + }else{ + $style['subindent'] = "  "; + $aSubStyle = $style; + } + + $text = "\n\n\n\n\n\n".$style['prelink']; + + if ($style['linkdisplay'] != 3) { + foreach ($this->eLinkList['head_menu'] as $key => $link){ + $main_linkid = "sub_".$link['link_id']; + + $link['link_expand'] = ((isset($pref['sitelinks_expandsub']) && $pref['sitelinks_expandsub']) && !$style['linkmainonly'] && !defined("LINKSRENDERONLYMAIN") && isset($this->eLinkList[$main_linkid]) && is_array($this->eLinkList[$main_linkid])) ? TRUE : FALSE; + + $render_link[$key] = $this->makeLink($link,'', $style, $css_class); + + if(!defined("LINKSRENDERONLYMAIN") && $style['linkmainonly']!= TRUE) /* if this is defined in theme.php only main links will be rendered */ + { + + // if there's a submenu. : + if (isset($this->eLinkList[$main_linkid]) && is_array($this->eLinkList[$main_linkid])){ + $substyle = (strpos(e_SELF, $link['link_url']) !== FALSE || strpos(e_SELF, $link['link_name']) !== FALSE || $link['link_expand'] == FALSE) ? "compact" : "none"; // expanding sub-menus. + $render_link[$key] .= "\n\n\n\n"; + } + } + } + $text .= implode($style['linkseparator'], $render_link); + $text .= $style['postlink']; + if ($style['linkdisplay'] == 2) { + $text = $ns->tablerender(LAN_SITELINKS_183, $text, 'sitelinks', TRUE); + } + } + else + { + foreach($this->eLinkList['head_menu'] as $link) + { + if (!count($this->eLinkList['sub_'.$link['link_id']])) + { + $text .= $this->makeLink($link,'', $style, $css_class); + } + $text .= $style['postlink']; + } + $text = $ns->tablerender(LAN_SITELINKS_183, $text, 'sitelinks_main', TRUE); + foreach(array_keys($this->eLinkList) as $k) + { + $mnu = $style['prelink']; + foreach($this->eLinkList[$k] as $link) + { + if ($k != 'head_menu') + { + $mnu .= $this->makeLink($link, TRUE, $style, $css_class); + } + } + $mnu .= $style['postlink']; + $text .= $ns->tablerender($k, $mnu, 'sitelinks_sub', TRUE); + } + } + $text .= "\n\n\n\n\n\n"; + if($usecache) + { + $e107cache->set('sitelinks_'.$cat.md5($linkstyle.e_PAGE.e_QUERY), $text); + } + return $text; + } + + function makeLink($linkInfo, $submenu = FALSE, $style='', $css_class = false) + { + global $pref,$tp; + + // Start with an empty link + $linkstart = $indent = $linkadd = $screentip = $href = $link_append = ''; + + // If submenu: Fix Name, Add Indentation. + if ($submenu == TRUE) { + if(substr($linkInfo['link_name'],0,8) == "submenu."){ + $tmp = explode('.', $linkInfo['link_name'], 3); + $linkInfo['link_name'] = $tmp[2]; + } + $indent = ($style['linkdisplay'] != 3) ? $style['subindent'] : ""; + } + + $linkInfo['link_url'] = $tp -> replaceConstants($linkInfo['link_url'],TRUE); // replace {e_xxxx} + + if(strpos($linkInfo['link_url'],"{") !== FALSE){ + $linkInfo['link_url'] = $tp->parseTemplate($linkInfo['link_url'], TRUE); // shortcode in URL support - dynamic urls for multilanguage. + } + // By default links are not highlighted. + $linkstart = $style['linkstart']; + $linkadd = ($style['linkclass']) ? " class='".$style['linkclass']."'" : ""; + $linkadd = ($css_class) ? " class='".$css_class."'" : $linkadd; + + // Check for screentip regardless of URL. + if (isset($pref['linkpage_screentip']) && $pref['linkpage_screentip'] && $linkInfo['link_description']){ + $screentip = " title = \"".$tp->toHTML($linkInfo['link_description'],"","value emotes_off defs no_hook")."\""; + } + + // Check if its expandable first. It should override its URL. + if (isset($linkInfo['link_expand']) && $linkInfo['link_expand']){ + $href = " href=\"javascript:expandit('sub_".$linkInfo['link_id']."')\""; + } elseif ($linkInfo['link_url']){ + + // Only add the e_BASE if it actually has an URL. + $linkInfo['link_url'] = (strpos($linkInfo['link_url'], '://') === FALSE && strpos($linkInfo['link_url'], 'mailto:') !== 0 ? e_HTTP.$linkInfo['link_url'] : $linkInfo['link_url']); + + // Only check if its highlighted if it has an URL + if ($this->hilite($linkInfo['link_url'], $style['linkstart_hilite'])== TRUE) { + $linkstart = (isset($style['linkstart_hilite'])) ? $style['linkstart_hilite'] : ""; + $highlighted = TRUE; + } + if ($this->hilite($linkInfo['link_url'], $style['linkclass_hilite'])== TRUE) { + $linkadd = (isset($style['linkclass_hilite'])) ? " class='".$style['linkclass_hilite']."'" : ""; + $highlighted = TRUE; + } + + if ($linkInfo['link_open'] == 4 || $linkInfo['link_open'] == 5){ + $dimen = ($linkInfo['link_open'] == 4) ? "600,400" : "800,600"; + $href = " href=\"javascript:open_window('".$linkInfo['link_url']."',{$dimen})\""; + } else { + $href = " href='".$linkInfo['link_url']."'"; + } + + // Open link in a new window. (equivalent of target='_blank' ) + $link_append = ($linkInfo['link_open'] == 1) ? " rel='external'" : ""; + } + + // Remove default images if its a button and add new image at the start. + if ($linkInfo['link_button']){ + $linkstart = preg_replace('/\/si', '', $linkstart); + $linkstart .= ""; + } + + // mobile phone support. + $accesskey = (isset($style['accesskey']) && $style['accesskey']==TRUE) ? " accesskey='".$linkInfo['link_order']."' " : ""; + $accessdigit = (isset($style['accessdigit'],$style['accesskey']) && $style['accessdigit']==TRUE && $style['accesskey']==TRUE) ? $linkInfo['link_order'].". " : ""; + + // If its a link.. make a link + $_link = ""; + $_link .= $accessdigit; + if (!empty($href) && (($style['hilite_nolink'] && $highlighted)!=TRUE)){ + $_link .= "".$tp->toHTML($linkInfo['link_name'],"","emotes_off defs no_hook").""; + // If its not a link, but has a class or screentip do span: + }elseif (!empty($linkadd) || !empty($screentip)){ + $_link .= "".$tp->toHTML($linkInfo['link_name'],"","emotes_off defs no_hook")."
    "; + // Else just the name: + }else { + $_link .= $tp->toHTML($linkInfo['link_name'],"","emotes_off defs no_hook"); + } + + $_link = $linkstart.$indent.$_link; + + return $_link.$style['linkend']."\n"; + } + + + + + +function hilite($link,$enabled=''){ + global $PLUGINS_DIRECTORY,$tp,$pref; + if(!$enabled){ return FALSE; } + + $link = $tp->replaceConstants($link,TRUE); + $tmp = explode("?",$link); + $link_qry = (isset($tmp[1])) ? $tmp[1] : ""; + $link_slf = (isset($tmp[0])) ? $tmp[0] : ""; + $link_pge = basename($link_slf); + $link_match = strpos(e_SELF,$tmp[0]); + + if(e_MENU == "debug" && getperms('0')) + { + echo "
    link= ".$link; + echo "
    link_q= ".$link_qry; + echo "
    url= ".e_PAGE; + echo "
    url_query= ".e_QUERY."
    "; + + } + +// ----------- highlight overriding - set the link matching in the page itself. + + if(defined("HILITE")){ + if(strpos($link,HILITE)){ + return TRUE; + } + } + + +// --------------- highlighting for 'HOME'. ---------------- + global $pref; + list($fp,$fp_q) = explode("?",$pref['frontpage']['all']."?"); + if(strpos(e_SELF,"/".$pref['frontpage']['all'])!== FALSE && $fp_q == $tmp[1] && $link == e_HTTP."index.php"){ + return TRUE; + } + +// --------------- highlighting for plugins. ---------------- + if(stristr($link, $PLUGINS_DIRECTORY) !== FALSE && stristr($link, "custompages") === FALSE){ + + if($link_qry) + { // plugin links with queries + $subq = explode("?",$link); + if(strpos(e_SELF,$subq[0]) && e_QUERY == $subq[1]){ + return TRUE; + }else{ + return FALSE; + } + } + else + { // plugin links without queries + $link = str_replace("../", "", $link); + if(stristr(dirname(e_SELF), dirname($link)) !== FALSE){ + return TRUE; + } + } + return FALSE; + } + +// --------------- highlight for news items.---------------- +// eg. news.php, news.php?list.1 or news.php?cat.2 etc + if(substr(basename($link),0,8) == "news.php") + { + if (strpos($link, "news.php?") !== FALSE && strpos(e_SELF,"/news.php")!==FALSE) { + + $lnk = explode(".",$link_qry); // link queries. + $qry = explode(".",e_QUERY); // current page queries. + + if($qry[0] == "item"){ + return ($qry[2] == $lnk[1]) ? TRUE : FALSE; + } + + if($lnk[0] == $qry[0] && $lnk[1] == $qry[1]){ + return TRUE; + } + + } + elseif (!e_QUERY && e_PAGE == "news.php") + { + + return TRUE; + } + return FALSE; + + } +// --------------- highlight for Custom Pages.---------------- +// eg. page.php?1 + + if (strpos($link, "page.php?") !== FALSE && strpos(e_SELF,"/page.php")) { + list($custom,$page) = explode(".",$link_qry); + list($q_custom,$q_page) = explode(".",e_QUERY); + if($custom == $q_custom){ + return TRUE; + }else{ + return FALSE; + } + } + +// --------------- highlight default ---------------- + if(strpos($link, "?") !== FALSE){ + + $thelink = str_replace("../", "", $link); + if((strpos(e_SELF,$thelink) !== false) && (strpos(e_QUERY,$link_qry) !== false)){ + return true; + } + } + if(!preg_match("/all|item|cat|list/", e_QUERY) && (strpos(e_SELF, str_replace("../", "",$link)) !== false)){ + return true; + } + + if((!$link_qry && !e_QUERY) && (strpos(e_SELF,$link) !== FALSE)){ + return TRUE; + } + + if(($link_slf == e_SELF && !link_qry) || (e_QUERY && strpos(e_SELF."?".e_QUERY,$link)!== FALSE) ){ + return TRUE; + } + + return FALSE; + } +} +?> diff --git a/e107_handlers/smtp.php b/e107_handlers/smtp.php new file mode 100644 index 000000000..16537ecca --- /dev/null +++ b/e107_handlers/smtp.php @@ -0,0 +1,210 @@ + 1) { + $headers = join("\r\n", $headers); + } else { + $headers = $headers[0]; + } + } + $headers = chop($headers); + + // + // Make sure there are no bare linefeeds in the headers + // + $headers = preg_replace("/(?$errno: $errstr"); + return FALSE; + } + server_parse($socket, "220"); + $myIP = gethostbyname ($_SERVER['SERVER_NAME']); + $myServer = $e107->get_host_name($myIP); + + if (!empty($pref['smtp_username']) && !empty($pref['smtp_password']) ) { + // Send the RFC2554 specified EHLO. + // This improved as provided by SirSir to accomodate + // both SMTP AND ESMTP capable servers + fputs($socket, "EHLO " . $myServer . "\r\n"); + server_parse($socket, "250"); + + fputs($socket, "AUTH LOGIN\r\n"); + server_parse($socket, "334"); + fputs($socket, base64_encode($pref['smtp_username']) . "\r\n"); + server_parse($socket, "334"); + fputs($socket, base64_encode($pref['smtp_password']) . "\r\n"); + server_parse($socket, "235"); + } else { + // Send the RFC821 specified HELO. + fputs($socket, "HELO " . $myServer . "\r\n"); + server_parse($socket, "250"); + } + + // From this point onward most server response codes should be 250 + // Specify who the mail is from.... + fputs($socket, "MAIL FROM: <" . $pref['siteadminemail'] . ">\r\n"); + server_parse($socket, "250"); + + // Specify each user to send to and build to header. + $to_header = "To: "; + @reset($mail_to_array ); + while (list(, $mail_to_address ) = each($mail_to_array )) { + // + // Add an additional bit of error checking to the To field. + // + $mail_to_address = trim($mail_to_address); + if (preg_match('/[^ ]+\@[^ ]+/', $mail_to_address) ) { + fputs($socket, "RCPT TO: <$mail_to_address>\r\n" ); + server_parse($socket, "250" ); + } + $to_header .= "<$mail_to_address>"; + } + // Ok now do the CC and BCC fields... + @reset($bcc ); + while (list(, $bcc_address ) = each($bcc )) { + // + // Add an additional bit of error checking to bcc header... + // + $bcc_address = trim($bcc_address ); + if (preg_match('/[^ ]+\@[^ ]+/', $bcc_address) ) { + fputs($socket, "RCPT TO: <$bcc_address>\r\n" ); + server_parse($socket, "250" ); + } + } + @reset($cc ); + while (list(, $cc_address ) = each($cc )) { + // + // Add an additional bit of error checking to cc header + // + $cc_address = trim($cc_address ); + if (preg_match('/[^ ]+\@[^ ]+/', $cc_address) ) { + fputs($socket, "RCPT TO: <$cc_address>\r\n"); + server_parse($socket, "250"); + } + } + // Ok now we tell the server we are ready to start sending data + fputs($socket, "DATA\r\n"); + + // This is the last response code we look for until the end of the message. + server_parse($socket, "354"); + + // Send the Subject Line... + fputs($socket, "Subject: $subject\r\n"); + + // Now the To Header. + fputs($socket, "$to_header\r\n"); + + // Now any custom headers.... + fputs($socket, "$headers\r\n\r\n"); + + // Ok now we are ready for the message... + fputs($socket, "$message\r\n"); + + // Ok the all the ingredients are mixed in let's cook this puppy... + fputs($socket, ".\r\n"); + server_parse($socket, "250"); + + // Now tell the server we are done and close the socket... + fputs($socket, "QUIT\r\n"); + fclose($socket); + + return TRUE; + +} + +?> \ No newline at end of file diff --git a/e107_handlers/theme_handler.php b/e107_handlers/theme_handler.php new file mode 100644 index 000000000..ccfd7013e --- /dev/null +++ b/e107_handlers/theme_handler.php @@ -0,0 +1,468 @@ + themeUpload(); + } + + $this -> themeArray = $this -> getThemes(); + + foreach($_POST as $key => $post) + { + if(strstr($key,"preview")) + { + $this -> id = str_replace("preview_", "", $key); + $this -> themePreview(); + } + if(strstr($key,"selectmain")) + { + $this -> id = str_replace("selectmain_", "", $key); + $this -> setTheme(); + } + + if(strstr($key,"selectadmin")) + { + $this -> id = str_replace("selectadmin_", "", $key); + $this -> setAdminTheme(); + } + } + + if(isset($_POST['submit_adminstyle'])) + { + $this -> setAdminStyle(); + } + + if(isset($_POST['submit_style'])) + { + $this -> setStyle(); + } + + } + + function getThemes($mode=FALSE) + { + $themeArray = array(); + $tloop = 1; + $handle = opendir(e_THEME); + while (false !== ($file = readdir($handle))) { + if ($file != "." && $file != ".." && $file != "CVS" && $file != "templates" && is_dir(e_THEME.$file) && file_exists(e_THEME.$file."/theme.php")) { + if($mode == "id") { + $themeArray[$tloop] = $file; + } else { + $themeArray[$file]['id'] = $tloop; + } + $tloop++; + $STYLESHEET = FALSE; + if(!$mode) { + $handle2 = opendir(e_THEME.$file."/"); + while (false !== ($file2 = readdir($handle2))) { + if ($file2 != "." && $file2 != ".." && $file != "CVS" && !is_dir(e_THEME.$file."/".$file2)) { + $themeArray[$file]['files'][] = $file2; + if(strstr($file2, "preview.")) { + $themeArray[$file]['preview'] = e_THEME.$file."/".$file2; + } + if(strstr($file2, "css") && !strstr($file2, "menu.css") && strpos($file2, "e_") !== 0 && strpos($file2, "admin_") !== 0) + { + /* get information string */ + $fp=fopen(e_THEME.$file."/".$file2, "r"); + $cssContents = fread ($fp, filesize(e_THEME.$file."/".$file2)); + fclose($fp); + $nonadmin = preg_match('/\* Non-Admin(.*?)\*\//', $cssContents) ? true : false; + preg_match('/\* info:(.*?)\*\//', $cssContents, $match); + $themeArray[$file]['css'][] = array("name" => $file2, "info" => $match[1], "nonadmin" => $nonadmin); + if($STYLESHEET) + { + $themeArray[$file]['multipleStylesheets'] = TRUE; + } + else + { + $STYLESHEET = TRUE; + } + + } + } + $fp=fopen(e_THEME.$file."/theme.php", "r"); + $themeContents = fread ($fp, filesize(e_THEME.$file."/theme.php")); + fclose($fp); + preg_match('/themename(\s*?=\s*?)("|\')(.*?)("|\');/si', $themeContents, $match); + $themeArray[$file]['name'] = $match[3]; + preg_match('/themeversion(\s*?=\s*?)("|\')(.*?)("|\');/si', $themeContents, $match); + $themeArray[$file]['version'] = $match[3]; + preg_match('/themeauthor(\s*?=\s*?)("|\')(.*?)("|\');/si', $themeContents, $match); + $themeArray[$file]['author'] = $match[3]; + preg_match('/themeemail(\s*?=\s*?)("|\')(.*?)("|\');/si', $themeContents, $match); + $themeArray[$file]['email'] = $match[3]; + preg_match('/themewebsite(\s*?=\s*?)("|\')(.*?)("|\');/si', $themeContents, $match); + $themeArray[$file]['website'] = $match[3]; + preg_match('/themedate(\s*?=\s*?)("|\')(.*?)("|\');/si', $themeContents, $match); + $themeArray[$file]['date'] = $match[3]; + preg_match('/themeinfo(\s*?=\s*?)("|\')(.*?)("|\');/si', $themeContents, $match); + $themeArray[$file]['info'] = $match[3]; + + preg_match('/xhtmlcompliant(\s*?=\s*?)(\S*?);/si', $themeContents, $match); + $xhtml = strtolower($match[2]); + $themeArray[$file]['xhtmlcompliant'] = ($xhtml == "true" ? true : false); + + preg_match('/csscompliant(\s*?=\s*?)(\S*?);/si', $themeContents, $match); + $css = strtolower($match[2]); + $themeArray[$file]['csscompliant'] = ($css == "true" ? true : false); + + if (!$themeArray[$file]['name']) + { + unset($themeArray[$file]); + } + } + closedir($handle2); + } + } + } + closedir($handle); + return $themeArray; + } + + function themeUpload() + { + if (!$_POST['ac'] == md5(ADMINPWCHANGE)) { + exit; + } + global $ns; + extract($_FILES); + if(!is_writable(e_THEME)) { + $ns->tablerender(TPVLAN_16, TPVLAN_20); + } else { + require_once(e_HANDLER."upload_handler.php"); + $fileName = $file_userfile['name'][0]; + $fileSize = $file_userfile['size'][0]; + $fileType = $file_userfile['type'][0]; + + if(strstr($file_userfile['type'][0], "gzip")) { + $fileType = "tar"; + } else if (strstr($file_userfile['type'][0], "zip")) { + $fileType = "zip"; + } else { + $ns->tablerender(TPVLAN_16, TPVLAN_17); + require_once("footer.php"); + exit; + } + + if ($fileSize) { + + $uploaded = file_upload(e_THEME); + + $archiveName = $uploaded[0]['name']; + + + if($fileType == "zip") { + require_once(e_HANDLER."pclzip.lib.php"); + $archive = new PclZip(e_THEME.$archiveName); + $unarc = ($fileList = $archive -> extract(PCLZIP_OPT_PATH, e_THEME)); + $unarc = ($fileList = $archive -> extract(PCLZIP_OPT_PATH, e_THEME, PCLZIP_OPT_SET_CHMOD, 0666)); + } else { + require_once(e_HANDLER."pcltar.lib.php"); + $unarc = ($fileList = PclTarExtract($archiveName, e_THEME)); + } + + if(!$unarc) { + if($fileType == "zip") { + $error = "PCLZIP extract error: '".$archive -> errorName(TRUE)."'"; + } else { + $error = "PCLTAR extract error: ".PclErrorString().", code: ".intval(PclErrorCode()); + } + $ns->tablerender(TPVLAN_16, TPVLAN_18." ".$archiveName." ".$error); + require_once("footer.php"); + exit; + } + + $folderName = substr($fileList[0]['stored_filename'], 0, (strpos($fileList[0]['stored_filename'], "/"))); + $ns->tablerender(TPVLAN_16, "
    ".TPVLAN_19."
    "); + + @unlink(e_THEME.$archiveName); + } + } + } + + function showThemes() + { + global $ns, $pref; + echo "
    +
    \n"; + + foreach($this -> themeArray as $key => $theme) + { + if($key == $pref['sitetheme']) + { + $text = $this -> renderTheme(1, $theme); + } + } + + $ns->tablerender(TPVLAN_26." :: ".TPVLAN_33, $text); + + foreach($this -> themeArray as $key => $theme) + { + if($key == $pref['admintheme']) + { + $text = $this -> renderTheme(2, $theme); + } + } + $ns->tablerender(TPVLAN_26." :: ".TPVLAN_34, $text); + + + if(!is_writable(e_THEME)) { + $ns->tablerender(TPVLAN_16, TPVLAN_15); + $text = ""; + } else { + $text = "
    + + + + + + + + +
    ".TPVLAN_13." + + + +
    + +
    +
    \n"; + } + + $ns->tablerender(TPVLAN_26." :: ".TPVLAN_38, $text); + $text = ""; + foreach($this -> themeArray as $key => $theme) + { + if($key != $pref['admintheme'] && $key != $pref['sitetheme']) + { + $text .= $this -> renderTheme(FALSE, $theme); + } + } + + + + $ns->tablerender(TPVLAN_26." :: ".TPVLAN_39, $text); + echo "
    \n
    \n"; + } + + + + + function renderTheme($mode=FALSE, $theme) + { + + /* + mode = 0 :: normal + mode = 1 :: selected site theme + mode = 2 :: selected admin theme + */ + + global $ns, $pref; + + $author = ($theme['email'] ? "".$theme['author']."" : $theme['author']); + $website = ($theme['website'] ? "".$theme['website']."" : ""); + $preview = "".($theme['preview'] ? "" : "").""; + $selectmainbutton = ($mode != 1 ? "" : ""); + $selectadminbutton = ($mode != 2 ? "" : ""); + $previewbutton = (!$mode ? " " : ""); + + $text = "
    + + + + " : ""; + $itext .= $website ? "" : ""; + $itext .= $theme['date'] ? "" : ""; + $itext .= $theme['info'] ? "" : ""; + $itext .= !$mode ? "" : ""; + + + if ($itext) { + $text .= "
    $preview +
    +
    + ".$theme['name']."
    ".TPVLAN_11." ".$theme['version']." +
    +
    "; + + $itext .= $author ? "
    ".TPVLAN_4.":".$author."
    ".TPVLAN_5.":".$website."
    ".TPVLAN_6.":".$theme['date']."
    ".TPVLAN_7.":".$theme['info']."
    ".TPVLAN_8.":".$previewbutton.$selectmainbutton.$selectadminbutton."
    ".$itext."
    "; + } + + if(array_key_exists("multipleStylesheets", $theme)) + { + if($mode) + { + $text .= " +
    ".TPVLAN_27.":\n"; + foreach($theme['css'] as $css) + { + + if($mode == 2) + { + if (!$css['nonadmin']) { + $text .= " + ".$css['name'].":
    ".($css['info'] ? $css['info'] : ($css['name'] == "style.css" ? TPVLAN_23 : TPVLAN_24))."
    \n"; + } + } + + if($mode == 1) + { + $text .= " + ".$css['name'].":
    ".($css['info'] ? $css['info'] : ($css['name'] == "style.css" ? TPVLAN_23 : TPVLAN_24))."
    \n"; + } + } + $text .= "
    "; + + } + else + { + $text .= "
    "; + foreach($theme['css'] as $css) + { + $text .= "\n"; + } + $text .= "
    ".TPVLAN_22.":
    ".$css['name'].": ".($css['info'] ? $css['info'] : ($css['name'] == "style.css" ? TPVLAN_23 : TPVLAN_24))."

    \n"; + } + } + + if($mode == 1) + { + $text .= " + + + + + +
    ".TPVLAN_30." + ".TPVLAN_28."   + ".TPVLAN_29." +
    + ".$selectadminbutton." +
    "; + } + + if($mode == 2) + { + + $astext = ""; + require_once(e_HANDLER."file_class.php"); + $file = new e_file; + + $adminstyles = $file -> get_files(e_ADMIN."includes"); + + $astext = ""; + + $text .= "

    + +
    ".TPVLAN_41.":$astext
    + ".$selectmainbutton." +
    \n"; + } + + if($theme['xhtmlcompliant'] || $theme['xhtmlcompliant']) + { + $text .= "
    "; + $text .= ($theme['xhtmlcompliant']) ? " ": ""; + $text .= ($theme['csscompliant']) ? " " : ""; + $text .= "
    "; + } + + $text .= "
    \n"; + return $text; + + } + + function themePreview() + { + echo "\n"; + exit; + } + + function showPreview() + { + @include_once(e_LANGUAGE."admin/lan_theme.php"); + @include_once(e_LANGUAGEDIR.e_LANGUAGE."/admin/lan_theme.php"); + $text = "
    ".TPVLAN_1.".

    "; + global $ns; + $ns->tablerender(TPVLAN_2, $text); + } + + function setTheme() + { + global $pref, $e107cache, $ns; + $themeArray = $this -> getThemes("id"); + $pref['sitetheme'] = $themeArray[$this -> id]; + $pref['themecss'] ='style.css'; + $e107cache->clear(); + save_prefs(); + $ns->tablerender("Admin Message", "
    ".TPVLAN_3." '".$themeArray[$this -> id]."'.

    "); + } + + function setAdminTheme() + { + global $pref, $e107cache, $ns; + $themeArray = $this -> getThemes("id"); + $pref['admintheme'] = $themeArray[$this -> id]; + $pref['admincss'] = file_exists(THEME.'admin_style.css') ? 'admin_style.css' : 'style.css'; + $e107cache->clear(); + save_prefs(); + $ns->tablerender("Admin Message", "
    ".TPVLAN_40." '".$themeArray[$this -> id]."'.

    "); + } + + function setStyle() + { + global $pref, $e107cache, $ns; + $pref['themecss'] = $_POST['themecss']; + $pref['image_preload'] = $_POST['image_preload']; + $e107cache->clear(); + save_prefs(); + $ns->tablerender(TPVLAN_36, "
    ".TPVLAN_37.".

    "); + } + + function setAdminStyle() + { + global $pref, $e107cache, $ns; + $pref['admincss'] = $_POST['admincss']; + $pref['adminstyle'] = $_POST['adminstyle']; + $e107cache->clear(); + save_prefs(); + $ns->tablerender(TPVLAN_36, "
    ".TPVLAN_43.".

    "); + } + +} \ No newline at end of file diff --git a/e107_handlers/tiny_mce/blank.htm b/e107_handlers/tiny_mce/blank.htm new file mode 100644 index 000000000..c1ff8352b --- /dev/null +++ b/e107_handlers/tiny_mce/blank.htm @@ -0,0 +1,9 @@ + + + blank_page + + + + + + diff --git a/e107_handlers/tiny_mce/filelist.php b/e107_handlers/tiny_mce/filelist.php new file mode 100644 index 000000000..f7672f8c7 --- /dev/null +++ b/e107_handlers/tiny_mce/filelist.php @@ -0,0 +1,33 @@ +get_files(e_IMAGE."newspost_images/","",$rejecthumb); + +$sql->db_Select("download"); + $c = 0; + while ($row = $sql->db_Fetch()) { + extract($row); + $filelist['id'][$c] = $download_id; + $filelist['url'][$c] = $download_url; + $filelist['name'][$c] = $download_name; + $c++; + } + +echo "var tinyMCELinkList = new Array("; +for ($i=0; $i \ No newline at end of file diff --git a/e107_handlers/tiny_mce/index.html b/e107_handlers/tiny_mce/index.html new file mode 100644 index 000000000..e69de29bb diff --git a/e107_handlers/tiny_mce/langs/en.js b/e107_handlers/tiny_mce/langs/en.js new file mode 100644 index 000000000..c7faa2432 --- /dev/null +++ b/e107_handlers/tiny_mce/langs/en.js @@ -0,0 +1,41 @@ +// UK lang variables + +tinyMCE.addToLang('',{ +bold_desc : 'Bold (Ctrl+B)', +italic_desc : 'Italic (Ctrl+I)', +underline_desc : 'Underline (Ctrl+U)', +striketrough_desc : 'Strikethrough', +justifyleft_desc : 'Align left', +justifycenter_desc : 'Align center', +justifyright_desc : 'Align right', +justifyfull_desc : 'Align full', +bullist_desc : 'Unordered list', +numlist_desc : 'Ordered list', +outdent_desc : 'Outdent', +indent_desc : 'Indent', +undo_desc : 'Undo (Ctrl+Z)', +redo_desc : 'Redo (Ctrl+Y)', +link_desc : 'Insert/edit link', +unlink_desc : 'Unlink', +image_desc : 'Insert/edit image', +cleanup_desc : 'Cleanup messy code', +focus_alert : 'A editor instance must be focused before using this command.', +edit_confirm : 'Do you want to use the WYSIWYG mode for this textarea?', +insert_link_title : 'Insert/edit link', +insert : 'Insert', +update : 'Update', +cancel : 'Cancel', +insert_link_url : 'Link URL', +insert_link_target : 'Target', +insert_link_target_same : 'Open link in the same window', +insert_link_target_blank : 'Open link in a new window', +insert_image_title : 'Insert/edit image', +insert_image_src : 'Image URL', +insert_image_alt : 'Image description', +help_desc : 'Help', +bold_img : "bold.gif", +italic_img : "italic.gif", +underline_img : "underline.gif", +clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?', +popup_blocked : 'Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.' +}); diff --git a/e107_handlers/tiny_mce/plugins/contextmenu/contextmenu.css b/e107_handlers/tiny_mce/plugins/contextmenu/contextmenu.css new file mode 100644 index 000000000..1466e0e89 --- /dev/null +++ b/e107_handlers/tiny_mce/plugins/contextmenu/contextmenu.css @@ -0,0 +1,60 @@ +.contextMenuIEPopup { + padding: 0px; + margin: 0px; + border: 0px; + overflow: hidden; +} + +.contextMenu { + position: absolute; + cursor: default; + z-index: 1000; + border: 1px solid #D4D0C8; + background-color: #FFFFFF; +} + +.contextMenuItem, .contextMenuItemOver { +} + +.contextMenuItemOver { + background-color: #B6BDD2; +} + +.contextMenuSeparator { + width: 100%; + background-color: #D4D0C8; + border: 0px; +} + +.contextMenuImage, .contextMenuItemDisabled { + border: 0px; +} + +.contextMenuIcon { + background-color: #F0F0EE; +} + +.contextMenuItemOver .contextMenuIcon { + background-color: #B6BDD2; +} + +.contextMenuIcon { + background-color: #F0F0EE; +} + +.contextMenuItemDisabled img { + filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30); + -moz-opacity:0.3; + opacity: 0.3; +} + +.contextMenuText { + font-family: Tahoma, Verdana, Arial, Helvetica; + font-size: 11px; + margin-left: 5px; + margin-right: 10px; +} + +.contextMenuItemDisabled { + color: #AAAAAA; +} diff --git a/e107_handlers/tiny_mce/plugins/contextmenu/css/contextmenu.css b/e107_handlers/tiny_mce/plugins/contextmenu/css/contextmenu.css new file mode 100644 index 000000000..a4ad1e9b7 --- /dev/null +++ b/e107_handlers/tiny_mce/plugins/contextmenu/css/contextmenu.css @@ -0,0 +1,74 @@ +.contextMenuIEPopup { + padding: 0; + margin: 0; + border: 0; + overflow: hidden; +} + +.contextMenu { + position: absolute; + cursor: default; + z-index: 1000; + border: 1px solid #D4D0C8; + background-color: #FFFFFF; +} + +.contextMenuItem, .contextMenuItemOver { +} + +.contextMenuSeparator { + width: 100%; + background-color: #D4D0C8; + border: 0; +} + +.contextMenuImage, .contextMenuItemDisabled { + border: 0; +} + +.contextMenuIcon { + background-color: #F0F0EE; +} + +.contextMenuItemOver .contextMenuIcon { + background-color: #B6BDD2; +} + +.contextMenuIcon { + background-color: #F0F0EE; +} + +.contextMenuItemDisabled img { + filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30); + -moz-opacity:0.3; + opacity: 0.3; +} + +.contextMenuText { + font-family: Tahoma, Verdana, Arial, Helvetica; + font-size: 11px; + line-height: 20px; +} + +.contextMenuItemDisabled { + color: #AAAAAA; +} + +.contextMenuText a { + display: block; + line-height: 20px; + width: 100%; + text-decoration: none; + color: black; + font-weight: normal; + margin: 0; + padding: 0; +} + +.contextMenuText a:hover { + background-color: #B6BDD2; + text-decoration: none !important; + font-weight: normal; + margin: 0; + padding: 0; +} diff --git a/e107_handlers/tiny_mce/plugins/contextmenu/editor_plugin.js b/e107_handlers/tiny_mce/plugins/contextmenu/editor_plugin.js new file mode 100644 index 000000000..cd65ef8d4 --- /dev/null +++ b/e107_handlers/tiny_mce/plugins/contextmenu/editor_plugin.js @@ -0,0 +1 @@ +if(!tinyMCE.settings['contextmenu_skip_plugin_css']){tinyMCE.loadCSS(tinyMCE.baseURL+"/plugins/contextmenu/css/contextmenu.css")}var TinyMCE_ContextMenuPlugin={_contextMenu:null,getInfo:function(){return{longname:'Context menus',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_contextmenu.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},initInstance:function(inst){if(tinyMCE.isMSIE5_0&&tinyMCE.isOpera)return;TinyMCE_ContextMenuPlugin._contextMenu=new TinyMCE_ContextMenu({commandhandler:"TinyMCE_ContextMenuPlugin._commandHandler",spacer_image:tinyMCE.baseURL+"/plugins/contextmenu/images/spacer.gif"});tinyMCE.addEvent(inst.getDoc(),"click",TinyMCE_ContextMenuPlugin._hideContextMenu);tinyMCE.addEvent(inst.getDoc(),"keypress",TinyMCE_ContextMenuPlugin._hideContextMenu);tinyMCE.addEvent(inst.getDoc(),"keydown",TinyMCE_ContextMenuPlugin._hideContextMenu);tinyMCE.addEvent(document,"click",TinyMCE_ContextMenuPlugin._hideContextMenu);tinyMCE.addEvent(document,"keypress",TinyMCE_ContextMenuPlugin._hideContextMenu);tinyMCE.addEvent(document,"keydown",TinyMCE_ContextMenuPlugin._hideContextMenu);if(tinyMCE.isGecko){tinyMCE.addEvent(inst.getDoc(),"contextmenu",function(e){TinyMCE_ContextMenuPlugin._showContextMenu(tinyMCE.isMSIE?inst.contentWindow.event:e,inst)})}else tinyMCE.addEvent(inst.getDoc(),"contextmenu",TinyMCE_ContextMenuPlugin._onContextMenu)},_onContextMenu:function(e){var elm=tinyMCE.isMSIE?e.srcElement:e.target;var targetInst,body;if((body=tinyMCE.getParentElement(elm,"body"))!=null){for(var n in tinyMCE.instances){var inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;if(body==inst.getBody()){targetInst=inst;break}}return TinyMCE_ContextMenuPlugin._showContextMenu(tinyMCE.isMSIE?targetInst.contentWindow.event:e,targetInst)}},_showContextMenu:function(e,inst){function getAttrib(elm,name){return elm.getAttribute(name)?elm.getAttribute(name):""}var x,y,elm,contextMenu;var pos=tinyMCE.getAbsPosition(inst.iframeElement);x=tinyMCE.isMSIE?e.screenX:pos.absLeft+(e.pageX-inst.getBody().scrollLeft);y=tinyMCE.isMSIE?e.screenY:pos.absTop+(e.pageY-inst.getBody().scrollTop);elm=tinyMCE.isMSIE?e.srcElement:e.target;contextMenu=this._contextMenu;contextMenu.inst=inst;window.setTimeout(function(){var theme=tinyMCE.getParam("theme");contextMenu.clearAll();var sel=inst.selection.getSelectedText().length!=0||elm.nodeName=="IMG";contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/cut.gif","$lang_cut_desc","Cut","",!sel);contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/copy.gif","$lang_copy_desc","Copy","",!sel);contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/paste.gif","$lang_paste_desc","Paste","",false);if(sel||(elm?(elm.nodeName=='A')||(elm.nodeName=='IMG'):false)){contextMenu.addSeparator();contextMenu.addItem(tinyMCE.baseURL+"/themes/advanced/images/link.gif","$lang_link_desc",inst.hasPlugin("advlink")?"mceAdvLink":"mceLink");contextMenu.addItem(tinyMCE.baseURL+"/themes/advanced/images/unlink.gif","$lang_unlink_desc","unlink","",(elm?(elm.nodeName!='A')&&(elm.nodeName!='IMG'):true))}elm=tinyMCE.getParentElement(elm,"img,table,td"+(inst.hasPlugin("advhr")?',hr':''));if(elm){switch(elm.nodeName){case"IMG":contextMenu.addSeparator();if(tinyMCE.hasPlugin('flash')&&tinyMCE.getAttrib(elm,'class').indexOf('mceItemFlash')!=-1)contextMenu.addItem(tinyMCE.baseURL+"/plugins/flash/images/flash.gif","$lang_flash_props","mceFlash");else if(tinyMCE.hasPlugin('media')&&/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(tinyMCE.getAttrib(elm,'class')))contextMenu.addItem(tinyMCE.baseURL+"/plugins/flash/images/flash.gif","$lang_media_title","mceMedia");else contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/image.gif","$lang_image_props_desc",inst.hasPlugin("advimage")?"mceAdvImage":"mceImage");break;case"HR":contextMenu.addSeparator();contextMenu.addItem(tinyMCE.baseURL+"/plugins/advhr/images/advhr.gif","$lang_insert_advhr_desc","mceAdvancedHr");break;case"TABLE":case"TD":if(inst.hasPlugin("table")){var colspan=(elm.nodeName=="TABLE")?"":getAttrib(elm,"colspan");var rowspan=(elm.nodeName=="TABLE")?"":getAttrib(elm,"rowspan");colspan=colspan==""?"1":colspan;rowspan=rowspan==""?"1":rowspan;contextMenu.addSeparator();contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/cut.gif","$lang_table_cut_row_desc","mceTableCutRow");contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/copy.gif","$lang_table_copy_row_desc","mceTableCopyRow");contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/paste.gif","$lang_table_paste_row_before_desc","mceTablePasteRowBefore","",inst.tableRowClipboard==null);contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/paste.gif","$lang_table_paste_row_after_desc","mceTablePasteRowAfter","",inst.tableRowClipboard==null);contextMenu.addSeparator();contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table.gif","$lang_table_desc","mceInsertTable","insert");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table.gif","$lang_table_props_desc","mceInsertTable");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_cell_props.gif","$lang_table_cell_desc","mceTableCellProps");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_delete.gif","$lang_table_del","mceTableDelete");contextMenu.addSeparator();contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_row_props.gif","$lang_table_row_desc","mceTableRowProps");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_insert_row_before.gif","$lang_table_row_before_desc","mceTableInsertRowBefore");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_insert_row_after.gif","$lang_table_row_after_desc","mceTableInsertRowAfter");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_delete_row.gif","$lang_table_delete_row_desc","mceTableDeleteRow");contextMenu.addSeparator();contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_insert_col_before.gif","$lang_table_col_before_desc","mceTableInsertColBefore");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_insert_col_after.gif","$lang_table_col_after_desc","mceTableInsertColAfter");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_delete_col.gif","$lang_table_delete_col_desc","mceTableDeleteCol");contextMenu.addSeparator();contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_split_cells.gif","$lang_table_split_cells_desc","mceTableSplitCells","",(colspan=="1"&&rowspan=="1"));contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_merge_cells.gif","$lang_table_merge_cells_desc","mceTableMergeCells","",false)}break}}else{if(inst.hasPlugin("table")){contextMenu.addSeparator();contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table.gif","$lang_table_desc","mceInsertTable","insert")}}contextMenu.show(x,y)},10);tinyMCE.cancelEvent(e);return false},_hideContextMenu:function(){if(TinyMCE_ContextMenuPlugin._contextMenu)TinyMCE_ContextMenuPlugin._contextMenu.hide()},_commandHandler:function(command,value){var cm=TinyMCE_ContextMenuPlugin._contextMenu;cm.hide();var ui=false;if(command=="mceInsertTable"||command=="mceTableCellProps"||command=="mceTableRowProps"||command=="mceTableMergeCells")ui=true;if(command=="Paste")value=null;if(tinyMCE.getParam("dialog_type")=="modal"&&tinyMCE.isMSIE){window.setTimeout(function(){cm.inst.execCommand(command,ui,value)},100)}else cm.inst.execCommand(command,ui,value)}};tinyMCE.addPlugin("contextmenu",TinyMCE_ContextMenuPlugin);function TinyMCE_ContextMenu(settings){var doc,self=this;function defParam(key,def_val){settings[key]=typeof(settings[key])!="undefined"?settings[key]:def_val}this.isMSIE=(navigator.appName=="Microsoft Internet Explorer");this.contextMenuDiv=document.createElement("div");this.contextMenuDiv.className="contextMenu";this.contextMenuDiv.setAttribute("class","contextMenu");this.contextMenuDiv.style.display="none";this.contextMenuDiv.style.position='absolute';this.contextMenuDiv.style.zindex=1000;this.contextMenuDiv.style.left='0';this.contextMenuDiv.style.top='0';this.contextMenuDiv.unselectable="on";document.body.appendChild(this.contextMenuDiv);defParam("commandhandler","");defParam("spacer_image","images/spacer.gif");this.items=new Array();this.settings=settings;this.html="";if(tinyMCE.isMSIE&&!tinyMCE.isMSIE5_0&&!tinyMCE.isOpera){this.pop=window.createPopup();doc=this.pop.document;doc.open();doc.write('');doc.close()}};TinyMCE_ContextMenu.prototype={clearAll:function(){this.html="";this.contextMenuDiv.innerHTML=""},addSeparator:function(){this.html+=''},addItem:function(icon,title,command,value,disabled){if(title.charAt(0)=='$')title=tinyMCE.getLang(title.substring(1));var onMouseDown='';var html='';if(tinyMCE.isMSIE&&!tinyMCE.isMSIE5_0)onMouseDown='contextMenu.execCommand(\''+command+'\', \''+value+'\');return false;';else onMouseDown=this.settings['commandhandler']+'(\''+command+'\', \''+value+'\');return false;';if(icon=="")icon=this.settings['spacer_image'];if(!disabled)html+='';else html+='';html+='';html+='
    ';html+=' ';html+=title;html+=' ';html+='
    ';html+='';this.html+=html},show:function(x,y){var vp,width,height,yo;if(this.html=="")return;var html='';html+='';html+=this.html;html+='
    ';this.contextMenuDiv.innerHTML=html;this.contextMenuDiv.style.display="block";width=this.contextMenuDiv.offsetWidth;height=this.contextMenuDiv.offsetHeight;this.contextMenuDiv.style.display="none";if(tinyMCE.isMSIE&&!tinyMCE.isMSIE5_0&&!tinyMCE.isOpera){this.pop.document.body.innerHTML='
    '+html+"
    ";this.pop.document.tinyMCE=tinyMCE;this.pop.document.contextMenu=this;this.pop.show(x,y,width,height)}else{vp=this.getViewPort();yo=tinyMCE.isMSIE5_0?document.body.scrollTop:self.pageYOffset;this.contextMenuDiv.style.left=(x>vp.left+vp.width-width?vp.left+vp.width-width:x)+'px';this.contextMenuDiv.style.top=(y>vp.top+vp.height-height?vp.top+vp.height-height:y)+'px';this.contextMenuDiv.style.display="block"}},getViewPort:function(){return{left:self.pageXOffset||self.document.documentElement.scrollLeft||self.document.body.scrollLeft,top:self.pageYOffset||self.document.documentElement.scrollTop||self.document.body.scrollTop,width:document.documentElement.offsetWidth||document.body.offsetWidth,height:self.innerHeight||document.documentElement.clientHeight||document.body.clientHeight}},hide:function(){if(tinyMCE.isMSIE&&!tinyMCE.isMSIE5_0&&!tinyMCE.isOpera)this.pop.hide();else this.contextMenuDiv.style.display="none"},execCommand:function(command,value){eval(this.settings['commandhandler']+"(command, value);")}}; \ No newline at end of file diff --git a/e107_handlers/tiny_mce/plugins/contextmenu/editor_plugin_src.js b/e107_handlers/tiny_mce/plugins/contextmenu/editor_plugin_src.js new file mode 100644 index 000000000..1f4119f43 --- /dev/null +++ b/e107_handlers/tiny_mce/plugins/contextmenu/editor_plugin_src.js @@ -0,0 +1,357 @@ +/** + * $Id: editor_plugin_src.js,v 1.1.1.1 2006-12-02 04:34:14 mcfly_e107 Exp $ + * + * @author Moxiecode + * @copyright Copyright 2004-2006, Moxiecode Systems AB, All rights reserved. + */ + +/* Import plugin specific language pack */ +if (!tinyMCE.settings['contextmenu_skip_plugin_css']) { + tinyMCE.loadCSS(tinyMCE.baseURL + "/plugins/contextmenu/css/contextmenu.css"); +} + +var TinyMCE_ContextMenuPlugin = { + // Private fields + _contextMenu : null, + + getInfo : function() { + return { + longname : 'Context menus', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_contextmenu.html', + version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion + }; + }, + + initInstance : function(inst) { + // Is not working on MSIE 5.0 or Opera no contextmenu event + if (tinyMCE.isMSIE5_0 && tinyMCE.isOpera) + return; + + TinyMCE_ContextMenuPlugin._contextMenu = new TinyMCE_ContextMenu({ + commandhandler : "TinyMCE_ContextMenuPlugin._commandHandler", + spacer_image : tinyMCE.baseURL + "/plugins/contextmenu/images/spacer.gif" + }); + + // Add hide event handles + tinyMCE.addEvent(inst.getDoc(), "click", TinyMCE_ContextMenuPlugin._hideContextMenu); + tinyMCE.addEvent(inst.getDoc(), "keypress", TinyMCE_ContextMenuPlugin._hideContextMenu); + tinyMCE.addEvent(inst.getDoc(), "keydown", TinyMCE_ContextMenuPlugin._hideContextMenu); + tinyMCE.addEvent(document, "click", TinyMCE_ContextMenuPlugin._hideContextMenu); + tinyMCE.addEvent(document, "keypress", TinyMCE_ContextMenuPlugin._hideContextMenu); + tinyMCE.addEvent(document, "keydown", TinyMCE_ContextMenuPlugin._hideContextMenu); + + // Attach contextmenu event + if (tinyMCE.isGecko) { + tinyMCE.addEvent(inst.getDoc(), "contextmenu", function(e) {TinyMCE_ContextMenuPlugin._showContextMenu(tinyMCE.isMSIE ? inst.contentWindow.event : e, inst);}); + } else + tinyMCE.addEvent(inst.getDoc(), "contextmenu", TinyMCE_ContextMenuPlugin._onContextMenu); + }, + + // Private plugin internal methods + + _onContextMenu : function(e) { + var elm = tinyMCE.isMSIE ? e.srcElement : e.target; + var targetInst, body; + + // Find instance + if ((body = tinyMCE.getParentElement(elm, "body")) != null) { + for (var n in tinyMCE.instances) { + var inst = tinyMCE.instances[n]; + if (!tinyMCE.isInstance(inst)) + continue; + + if (body == inst.getBody()) { + targetInst = inst; + break; + } + } + + return TinyMCE_ContextMenuPlugin._showContextMenu(tinyMCE.isMSIE ? targetInst.contentWindow.event : e, targetInst); + } + }, + + _showContextMenu : function(e, inst) { + function getAttrib(elm, name) { + return elm.getAttribute(name) ? elm.getAttribute(name) : ""; + } + + var x, y, elm, contextMenu; + var pos = tinyMCE.getAbsPosition(inst.iframeElement); + + x = tinyMCE.isMSIE ? e.screenX : pos.absLeft + (e.pageX - inst.getBody().scrollLeft); + y = tinyMCE.isMSIE ? e.screenY : pos.absTop + (e.pageY - inst.getBody().scrollTop); + elm = tinyMCE.isMSIE ? e.srcElement : e.target; + + contextMenu = this._contextMenu; + contextMenu.inst = inst; + + // Mozilla needs some time + window.setTimeout(function () { + var theme = tinyMCE.getParam("theme"); + + contextMenu.clearAll(); + var sel = inst.selection.getSelectedText().length != 0 || elm.nodeName == "IMG"; + + // Default items + contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/cut.gif", "$lang_cut_desc", "Cut", "", !sel); + contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/copy.gif", "$lang_copy_desc", "Copy", "", !sel); + contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/paste.gif", "$lang_paste_desc", "Paste", "", false); + + if (sel || (elm ? (elm.nodeName == 'A') || (elm.nodeName == 'IMG') : false)) { + contextMenu.addSeparator(); + contextMenu.addItem(tinyMCE.baseURL + "/themes/advanced/images/link.gif", "$lang_link_desc", inst.hasPlugin("advlink") ? "mceAdvLink" : "mceLink"); + contextMenu.addItem(tinyMCE.baseURL + "/themes/advanced/images/unlink.gif", "$lang_unlink_desc", "unlink", "", (elm ? (elm.nodeName != 'A') && (elm.nodeName != 'IMG') : true)); + } + + // Get element + elm = tinyMCE.getParentElement(elm, "img,table,td" + (inst.hasPlugin("advhr") ? ',hr' : '')); + if (elm) { + switch (elm.nodeName) { + case "IMG": + contextMenu.addSeparator(); + + // If flash + if (tinyMCE.hasPlugin('flash') && tinyMCE.getAttrib(elm, 'class').indexOf('mceItemFlash') != -1) + contextMenu.addItem(tinyMCE.baseURL + "/plugins/flash/images/flash.gif", "$lang_flash_props", "mceFlash"); + else if (tinyMCE.hasPlugin('media') && /mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(tinyMCE.getAttrib(elm, 'class'))) + contextMenu.addItem(tinyMCE.baseURL + "/plugins/flash/images/flash.gif", "$lang_media_title", "mceMedia"); + else + contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/image.gif", "$lang_image_props_desc", inst.hasPlugin("advimage") ? "mceAdvImage" : "mceImage"); + break; + + case "HR": + contextMenu.addSeparator(); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/advhr/images/advhr.gif", "$lang_insert_advhr_desc", "mceAdvancedHr"); + break; + + case "TABLE": + case "TD": + // Is table plugin loaded + if (inst.hasPlugin("table")) { + var colspan = (elm.nodeName == "TABLE") ? "" : getAttrib(elm, "colspan"); + var rowspan = (elm.nodeName == "TABLE") ? "" : getAttrib(elm, "rowspan"); + + colspan = colspan == "" ? "1" : colspan; + rowspan = rowspan == "" ? "1" : rowspan; + + contextMenu.addSeparator(); + contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/cut.gif", "$lang_table_cut_row_desc", "mceTableCutRow"); + contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/copy.gif", "$lang_table_copy_row_desc", "mceTableCopyRow"); + contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/paste.gif", "$lang_table_paste_row_before_desc", "mceTablePasteRowBefore", "", inst.tableRowClipboard == null); + contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/paste.gif", "$lang_table_paste_row_after_desc", "mceTablePasteRowAfter", "", inst.tableRowClipboard == null); + + /* contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/justifyleft.gif", "$lang_justifyleft_desc", "JustifyLeft", "", false); + contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/justifycenter.gif", "$lang_justifycenter_desc", "JustifyCenter", "", false); + contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/justifyright.gif", "$lang_justifyright_desc", "JustifyRight", "", false); + contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/justifyfull.gif", "$lang_justifyfull_desc", "JustifyFull", "", false);*/ + contextMenu.addSeparator(); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table.gif", "$lang_table_desc", "mceInsertTable", "insert"); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table.gif", "$lang_table_props_desc", "mceInsertTable"); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_cell_props.gif", "$lang_table_cell_desc", "mceTableCellProps"); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_delete.gif", "$lang_table_del", "mceTableDelete"); + contextMenu.addSeparator(); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_row_props.gif", "$lang_table_row_desc", "mceTableRowProps"); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_insert_row_before.gif", "$lang_table_row_before_desc", "mceTableInsertRowBefore"); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_insert_row_after.gif", "$lang_table_row_after_desc", "mceTableInsertRowAfter"); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_delete_row.gif", "$lang_table_delete_row_desc", "mceTableDeleteRow"); + contextMenu.addSeparator(); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_insert_col_before.gif", "$lang_table_col_before_desc", "mceTableInsertColBefore"); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_insert_col_after.gif", "$lang_table_col_after_desc", "mceTableInsertColAfter"); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_delete_col.gif", "$lang_table_delete_col_desc", "mceTableDeleteCol"); + contextMenu.addSeparator(); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_split_cells.gif", "$lang_table_split_cells_desc", "mceTableSplitCells", "", (colspan == "1" && rowspan == "1")); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_merge_cells.gif", "$lang_table_merge_cells_desc", "mceTableMergeCells", "", false); + } + break; + } + } else { + // Add table specific + if (inst.hasPlugin("table")) { + contextMenu.addSeparator(); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table.gif", "$lang_table_desc", "mceInsertTable", "insert"); + } + } + + contextMenu.show(x, y); + }, 10); + + // Cancel default handeling + tinyMCE.cancelEvent(e); + return false; + }, + + _hideContextMenu : function() { + if (TinyMCE_ContextMenuPlugin._contextMenu) + TinyMCE_ContextMenuPlugin._contextMenu.hide(); + }, + + _commandHandler : function(command, value) { + var cm = TinyMCE_ContextMenuPlugin._contextMenu; + + cm.hide(); + + // UI must be true on these + var ui = false; + if (command == "mceInsertTable" || command == "mceTableCellProps" || command == "mceTableRowProps" || command == "mceTableMergeCells") + ui = true; + + if (command == "Paste") + value = null; + + if (tinyMCE.getParam("dialog_type") == "modal" && tinyMCE.isMSIE) { + // Cell properties will generate access denied error is this isn't done?! + window.setTimeout(function() { + cm.inst.execCommand(command, ui, value); + }, 100); + } else + cm.inst.execCommand(command, ui, value); + } +}; + +tinyMCE.addPlugin("contextmenu", TinyMCE_ContextMenuPlugin); + +// Context menu class + +function TinyMCE_ContextMenu(settings) { + var doc, self = this; + + // Default value function + function defParam(key, def_val) { + settings[key] = typeof(settings[key]) != "undefined" ? settings[key] : def_val; + } + + this.isMSIE = (navigator.appName == "Microsoft Internet Explorer"); + + // Setup contextmenu div + this.contextMenuDiv = document.createElement("div"); + this.contextMenuDiv.className = "contextMenu"; + this.contextMenuDiv.setAttribute("class", "contextMenu"); + this.contextMenuDiv.style.display = "none"; + this.contextMenuDiv.style.position = 'absolute'; + this.contextMenuDiv.style.zindex = 1000; + this.contextMenuDiv.style.left = '0'; + this.contextMenuDiv.style.top = '0'; + this.contextMenuDiv.unselectable = "on"; + + document.body.appendChild(this.contextMenuDiv); + + // Setup default values + defParam("commandhandler", ""); + defParam("spacer_image", "images/spacer.gif"); + + this.items = new Array(); + this.settings = settings; + this.html = ""; + + // IE Popup + if (tinyMCE.isMSIE && !tinyMCE.isMSIE5_0 && !tinyMCE.isOpera) { + this.pop = window.createPopup(); + doc = this.pop.document; + doc.open(); + doc.write(''); + doc.close(); + } +}; + +TinyMCE_ContextMenu.prototype = { + clearAll : function() { + this.html = ""; + this.contextMenuDiv.innerHTML = ""; + }, + + addSeparator : function() { + this.html += ''; + }, + + addItem : function(icon, title, command, value, disabled) { + if (title.charAt(0) == '$') + title = tinyMCE.getLang(title.substring(1)); + + var onMouseDown = ''; + var html = ''; + + if (tinyMCE.isMSIE && !tinyMCE.isMSIE5_0) + onMouseDown = 'contextMenu.execCommand(\'' + command + '\', \'' + value + '\');return false;'; + else + onMouseDown = this.settings['commandhandler'] + '(\'' + command + '\', \'' + value + '\');return false;'; + + if (icon == "") + icon = this.settings['spacer_image']; + + if (!disabled) + html += ''; + else + html += ''; + + html += ''; + html += ''; + html += ''; + + // Add to main + this.html += html; + }, + + show : function(x, y) { + var vp, width, height, yo; + + if (this.html == "") + return; + + var html = ''; + + html += ''; + html += this.html; + html += '
    '; + + this.contextMenuDiv.innerHTML = html; + + // Get dimensions + this.contextMenuDiv.style.display = "block"; + width = this.contextMenuDiv.offsetWidth; + height = this.contextMenuDiv.offsetHeight; + this.contextMenuDiv.style.display = "none"; + + if (tinyMCE.isMSIE && !tinyMCE.isMSIE5_0 && !tinyMCE.isOpera) { + // Setup popup and show + this.pop.document.body.innerHTML = '
    ' + html + "
    "; + this.pop.document.tinyMCE = tinyMCE; + this.pop.document.contextMenu = this; + this.pop.show(x, y, width, height); + } else { + vp = this.getViewPort(); + yo = tinyMCE.isMSIE5_0 ? document.body.scrollTop : self.pageYOffset; + this.contextMenuDiv.style.left = (x > vp.left + vp.width - width ? vp.left + vp.width - width : x) + 'px'; + this.contextMenuDiv.style.top = (y > vp.top + vp.height - height ? vp.top + vp.height - height : y) + 'px'; + this.contextMenuDiv.style.display = "block"; + } + }, + + getViewPort : function() { + return { + left : self.pageXOffset || self.document.documentElement.scrollLeft || self.document.body.scrollLeft, + top: self.pageYOffset || self.document.documentElement.scrollTop || self.document.body.scrollTop, + width : document.documentElement.offsetWidth || document.body.offsetWidth, + height : self.innerHeight || document.documentElement.clientHeight || document.body.clientHeight + }; + }, + + hide : function() { + if (tinyMCE.isMSIE && !tinyMCE.isMSIE5_0 && !tinyMCE.isOpera) + this.pop.hide(); + else + this.contextMenuDiv.style.display = "none"; + }, + + execCommand : function(command, value) { + eval(this.settings['commandhandler'] + "(command, value);"); + } +}; diff --git a/e107_handlers/tiny_mce/plugins/contextmenu/images/spacer.gif b/e107_handlers/tiny_mce/plugins/contextmenu/images/spacer.gif new file mode 100644 index 0000000000000000000000000000000000000000..388486517fa8da13ebd150e8f65d5096c3e10c3a GIT binary patch literal 43 ncmZ?wbhEHbWMp7un7{x9ia%KxMSyG_5FaGNz{KRj$Y2csb)f_x literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/plugins/emoticons/editor_plugin.js b/e107_handlers/tiny_mce/plugins/emoticons/editor_plugin.js new file mode 100644 index 000000000..f05bc502d --- /dev/null +++ b/e107_handlers/tiny_mce/plugins/emoticons/editor_plugin.js @@ -0,0 +1,56 @@ + +tinyMCE.importPluginLanguagePack('emoticons', 'en'); + +// Plucin static class +var TinyMCE_emoticonsPlugin = { + getInfo : function() { + return { + longname : 'emoticons', + author : 'CaMer0n', + authorurl : 'http://e107coders.org', + infourl : 'http://www.e107.org', + version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion + }; + }, + + /** + * Returns the HTML contents of the emoticons control. + */ + getControlHTML : function(cn) { + switch (cn) { + case "emoticons": + return tinyMCE.getButtonHTML(cn, 'lang_emoticons_desc', '{$pluginurl}/images/emoticons.png', 'mceEmotion'); + } + + return ""; + }, + + /** + * Executes the mceEmotion command. + */ + execCommand : function(editor_id, element, command, user_interface, value) { + // Handle commands + switch (command) { + case "mceEmotion": + var template = new Array(); + + template['file'] = '../../plugins/emoticons/emoticons.php'; // Relative to theme + template['width'] = 200; + template['height'] = 200; + + // Language specific width and height addons + template['width'] += tinyMCE.getLang('lang_emoticons_delta_width', 0); + template['height'] += tinyMCE.getLang('lang_emoticons_delta_height', 0); + + tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"}); + + return true; + } + + // Pass to next handler in chain + return false; + } +}; + +// Register plugin +tinyMCE.addPlugin('emoticons', TinyMCE_emoticonsPlugin); \ No newline at end of file diff --git a/e107_handlers/tiny_mce/plugins/emoticons/emoticons.php b/e107_handlers/tiny_mce/plugins/emoticons/emoticons.php new file mode 100644 index 000000000..c24041b91 --- /dev/null +++ b/e107_handlers/tiny_mce/plugins/emoticons/emoticons.php @@ -0,0 +1,48 @@ +getArray("emote_".$pref['emotepack']); + $str = "
    "; + foreach($emotes as $key => $value){ + $key = str_replace("!", ".", $key); + $key = preg_replace("#_(\w{3})$#", ".\\1", $key); + $value2 = substr($value, 0, strpos($value, " ")); + $value = ($value2 ? $value2 : $value); + $str .= "\n\"\" "; + } + + $str .= "
    "; + + echo $str; + +function headerjs(){ + global $pref; + $js = ""; + $js .= " "; + return $js; + +} + +echo ""; + + +?> \ No newline at end of file diff --git a/e107_handlers/tiny_mce/plugins/emoticons/images/emoticons.png b/e107_handlers/tiny_mce/plugins/emoticons/images/emoticons.png new file mode 100644 index 0000000000000000000000000000000000000000..f82a4ce008299e53c6c3e135edfc05dbfa691426 GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc3?z4jzqJQaEa{HEjtmUzPnffIy#(?l0(?ST z|NsA=T)tZ)ud#|+|dp@OQO7h(#3vZwr#*!evUFG^s|7@fcw|x_y+A)E>bH(mv^Y(-3B`bgMJ$iA|#x8!vqh5)tvkH|LOq9Ce5&W|A z_>}x5yhqH|=?9*8*(PWzCLGC{6DhiR)v7R0=^It6LXyOSlP?-&z5nBPDe-8Ue$`W^ YKW|xDI5h9G03E^L>FVdQ&MBb@06uSNqyPW_ literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/plugins/emoticons/index.html b/e107_handlers/tiny_mce/plugins/emoticons/index.html new file mode 100644 index 000000000..e69de29bb diff --git a/e107_handlers/tiny_mce/plugins/emoticons/langs/en.js b/e107_handlers/tiny_mce/plugins/emoticons/langs/en.js new file mode 100644 index 000000000..b88cc6352 --- /dev/null +++ b/e107_handlers/tiny_mce/plugins/emoticons/langs/en.js @@ -0,0 +1,5 @@ +// UK lang variables + +tinyMCELang['lang_insert_emoticons_title'] = 'Insert emotion'; +tinyMCELang['lang_emoticons_desc'] = 'Emotions'; + diff --git a/e107_handlers/tiny_mce/plugins/ibrowser/config.php b/e107_handlers/tiny_mce/plugins/ibrowser/config.php new file mode 100644 index 000000000..5475bef9c --- /dev/null +++ b/e107_handlers/tiny_mce/plugins/ibrowser/config.php @@ -0,0 +1,59 @@ + $IMAGES_DIRECTORY, + 'text' => 'Images Root', + ), + array( + 'value' => $IMAGES_DIRECTORY."newspost_images/", + 'text' => 'Newspost Images', + ), + array( + 'value' => $IMAGES_DIRECTORY."custom/", + 'text' => 'Custom Images', + ), + array( + 'value' => $IMAGES_DIRECTORY."icons/", + 'text' => 'Icons', + ), + array( + 'value' => $IMAGES_DIRECTORY."banners/", + 'text' => 'Banners', + ), + array( + 'value' => $IMAGES_DIRECTORY."generic/", + 'text' => 'Generic', + ), +); +// file to include in img_library.php (useful for setting $tinyMCE_imglibs dynamically +// $tinyMCE_imglib_include = ''; +?> \ No newline at end of file diff --git a/e107_handlers/tiny_mce/plugins/ibrowser/editor_plugin.js b/e107_handlers/tiny_mce/plugins/ibrowser/editor_plugin.js new file mode 100644 index 000000000..ac6cdbb3e --- /dev/null +++ b/e107_handlers/tiny_mce/plugins/ibrowser/editor_plugin.js @@ -0,0 +1,92 @@ +// Import theme specific language pack +// $Source: /cvs_backup/e107_0.8/e107_handlers/tiny_mce/plugins/ibrowser/editor_plugin.js,v $ +// $Revision: 1.1.1.1 $ +// $Date: 2006-12-02 04:34:14 $ +// $Author: mcfly_e107 $ + +tinyMCE.importPluginLanguagePack('ibrowser', 'en,es,da,de,fr,nl,pl,sv,ru'); + +// Returns the HTML contents of the ibrowser control. + +var TinyMCE_ibrowserPlugin = { + getInfo : function() { + return { + longname : 'ibrowser', + author : 'Your name', + authorurl : '', + infourl : '', + version : "1.1" + }; + }, + + getControlHTML : function(cn) { + switch (cn) { + case "ibrowser": + return tinyMCE.getButtonHTML(cn, 'lang_ibrowser_desc', '{$pluginurl}/images/ibrowser.gif', 'mceBrowseImage', true); + } + + return ""; + }, + + + execCommand : function(editor_id, element, command, user_interface, value) { + // Handle commands + switch (command) { + case "mceBrowseImage": + var template = new Array(); + + template['file'] = '../../plugins/ibrowser/ibrowser.php'; // Relative to theme location + template['width'] = 480; + template['height'] = 670; + + var src = "", alt = "", border = "", hspace = "", vspace = "", width = "", height = "", align = ""; + var margin_left = ""; + var margin_right = ""; + var margin_top = ""; + var margin_bottom = ""; + + if (tinyMCE.selectedElement != null && tinyMCE.selectedElement.nodeName.toLowerCase() == "img") + tinyMCE.imgElement = tinyMCE.selectedElement; + + if (tinyMCE.imgElement) { + src = tinyMCE.imgElement.getAttribute('src') ? tinyMCE.imgElement.getAttribute('src') : ""; + alt = tinyMCE.imgElement.getAttribute('alt') ? tinyMCE.imgElement.getAttribute('alt') : ""; + } + /* + + border = tinyMCE.imgElement.style.border ? tinyMCE.imgElement.style.border : ""; + hspace = tinyMCE.imgElement.getAttribute('hspace') ? tinyMCE.imgElement.getAttribute('hspace') : ""; + vspace = tinyMCE.imgElement.getAttribute('vspace') ? tinyMCE.imgElement.getAttribute('vspace') : ""; + width = tinyMCE.imgElement.style.width ? tinyMCE.imgElement.style.width.replace('px','') : ""; + height = tinyMCE.imgElement.style.height ? tinyMCE.imgElement.style.height.replace('px','') : ""; + align = tinyMCE.imgElement.getAttribute('align') ? tinyMCE.imgElement.getAttribute('align') : ""; + + margin_left = tinyMCE.imgElement.style.marginLeft ? tinyMCE.imgElement.style.marginLeft.replace('px','') : ""; + margin_right = tinyMCE.imgElement.style.marginRight ? tinyMCE.imgElement.style.marginRight.replace('px','') : ""; + margin_top = tinyMCE.imgElement.style.marginTop ? tinyMCE.imgElement.style.marginTop.replace('px','') : ""; + margin_bottom = tinyMCE.imgElement.style.marginBottom ? tinyMCE.imgElement.style.marginBottom.replace('px','') : ""; + + // Fix for drag-drop/copy paste bug in Mozilla + mceRealSrc = tinyMCE.imgElement.getAttribute('mce_real_src') ? tinyMCE.imgElement.getAttribute('mce_real_src') : ""; + if (mceRealSrc != "") + src = mceRealSrc; + + // src = eval(tinyMCE.settings['urlconvertor_callback'] + "(src, tinyMCE.imgElement, true);"); + } +*/ + tinyMCE.openWindow(template, {editor_id : editor_id, src : src, alt : alt, border : border, hspace : hspace, vspace : vspace, width : width, height : height, align : align}); + return true; + } + + // Pass to next handler in chain + return false; + } + +}; + + +tinyMCE.addPlugin("ibrowser", TinyMCE_ibrowserPlugin); + + + + diff --git a/e107_handlers/tiny_mce/plugins/ibrowser/ibrowser.php b/e107_handlers/tiny_mce/plugins/ibrowser/ibrowser.php new file mode 100644 index 000000000..23e0dc935 --- /dev/null +++ b/e107_handlers/tiny_mce/plugins/ibrowser/ibrowser.php @@ -0,0 +1,476 @@ + + + + +{$lang_ibrowser_title} + + + + + + + +
    + + +
    + {$lang_ibrowser_img_sel} + + + + +
    + + + + + + + + + + + + + + + + + + + + + +
    {$lang_ibrowser_library}: {$lang_ibrowser_preview}:
      +
    {$lang_ibrowser_images}: 
    dir=".$_root.$imglib; + $d = @dir(e_BASE.$imglib); + + ?> +  
    + + + + +
    + + +
    +
    +
    + {$lang_ibrowser_img_info} + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$lang_ibrowser_src}:
    {$lang_ibrowser_alt}:
    {$lang_ibrowser_align}:  +
    +

    Lorem + ipsum, Dolor sit amet, consectetuer adipiscing loreum ipsum + edipiscing elit, sed diam nonummy nibh euismod tincidunt ut + laoreet dolore magna aliquam erat volutpat.Loreum ipsum edipiscing + elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore + magna aliquam erat volutpat. Ut wisi enim ad minim veniam, + quis nostrud exercitation ullamcorper suscipit. Lorem ipsum, + Dolor sit amet, consectetuer adipiscing loreum ipsum edipiscing + elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore + magna aliquam erat volutpat.

    +
    +
    {$lang_ibrowser_size}: 
    {$lang_ibrowser_height}:{$lang_ibrowser_reset}  
    {$lang_ibrowser_width}: 
    {$lang_ibrowser_border}: + px +  
    Margin-left:px +  
    Margin-Right:px +  
    Margin-Top:px +  
    Margin-Bottom:px +  
    +
    + +
    + + +'.$prefix.$lib['text'].''."\n"; + } + return $buf; +} + + +// Return the human readable size of a file +// @param int $size a file size +// @param int $dec a number of decimal places + +function filesize_h($size, $dec = 1) +{ + $sizes = array('byte(s)', 'kb', 'mb', 'gb'); + $count = count($sizes); + $i = 0; + + while ($size >= 1024 && ($i < $count - 1)) { + $size /= 1024; + $i++; + } + + return round($size, $dec) . ' ' . $sizes[$i]; +} + +?> diff --git a/e107_handlers/tiny_mce/plugins/ibrowser/images/constrain.gif b/e107_handlers/tiny_mce/plugins/ibrowser/images/constrain.gif new file mode 100644 index 0000000000000000000000000000000000000000..2153c8530f210c146455f17929f9b3a6fd46ce85 GIT binary patch literal 618 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 acb!zU>toUKL&1g`63e=@%dCAF7_0$Ni7k5o literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/plugins/iespell/langs/en.js b/e107_handlers/tiny_mce/plugins/iespell/langs/en.js new file mode 100644 index 000000000..119bce9d0 --- /dev/null +++ b/e107_handlers/tiny_mce/plugins/iespell/langs/en.js @@ -0,0 +1,7 @@ +// UK lang variables + +tinyMCE.addToLang('',{ +iespell_desc : 'Run spell checking', +iespell_download : "ieSpell not detected. Click OK to go to download page." +}); + diff --git a/e107_handlers/tiny_mce/plugins/media/css/content.css b/e107_handlers/tiny_mce/plugins/media/css/content.css new file mode 100644 index 000000000..7873235e7 --- /dev/null +++ b/e107_handlers/tiny_mce/plugins/media/css/content.css @@ -0,0 +1,26 @@ +.mceItemFlash, .mceItemShockWave, .mceItemQuickTime, .mceItemWindowsMedia, .mceItemRealMedia { + border: 1px dotted #cc0000; + background-position: center; + background-repeat: no-repeat; + background-color: #ffffcc; +} + +.mceItemShockWave { + background-image: url('../images/shockwave.gif'); +} + +.mceItemFlash { + background-image: url('../images/flash.gif'); +} + +.mceItemQuickTime { + background-image: url('../images/quicktime.gif'); +} + +.mceItemWindowsMedia { + background-image: url('../images/windowsmedia.gif'); +} + +.mceItemRealMedia { + background-image: url('../images/realmedia.gif'); +} diff --git a/e107_handlers/tiny_mce/plugins/media/css/media.css b/e107_handlers/tiny_mce/plugins/media/css/media.css new file mode 100644 index 000000000..62d666a5f --- /dev/null +++ b/e107_handlers/tiny_mce/plugins/media/css/media.css @@ -0,0 +1,68 @@ +#id, #name, #hspace, #vspace, #class_name, #align { + width: 100px; +} + +#hspace, #vspace { + width: 50px; +} + +#flash_quality, #flash_align, #flash_scale, #flash_salign, #flash_wmode { + width: 100px; +} + +#flash_base, #flash_flashvars { + width: 240px; +} + +#width, #height { + width: 40px; +} + +#src, #media_type { + width: 250px; +} + +#class { + width: 120px; +} + +#prev { + margin: 0; + border: 1px solid black; + width: 99%; + height: 230px; + overflow: auto; +} + +.panel_wrapper div.current { + height: 390px; + overflow: auto; +} + +#flash_options, #shockwave_options, #qt_options, #wmp_options, #rmp_options { + display: none; +} + +.mceAddSelectValue { + background-color: #DDDDDD; +} + +#qt_starttime, #qt_endtime, #qt_fov, #qt_href, #qt_moveid, #qt_moviename, #qt_node, #qt_pan, #qt_qtsrc, #qt_qtsrcchokespeed, #qt_target, #qt_tilt, #qt_urlsubstituten, #qt_volume { + width: 70px; +} + +#wmp_balance, #wmp_baseurl, #wmp_captioningid, #wmp_currentmarker, #wmp_currentposition, #wmp_defaultframe, #wmp_playcount, #wmp_rate, #wmp_uimode, #wmp_volume { + width: 70px; +} + +#rmp_console, #rmp_numloop, #rmp_controls, #rmp_scriptcallbacks { + width: 70px; +} + +#shockwave_swvolume, #shockwave_swframe, #shockwave_swurl, #shockwave_swstretchvalign, #shockwave_swstretchhalign, #shockwave_swstretchstyle { + width: 90px; +} + +#qt_qtsrc { + width: 200px; +} diff --git a/e107_handlers/tiny_mce/plugins/media/editor_plugin.js b/e107_handlers/tiny_mce/plugins/media/editor_plugin.js new file mode 100644 index 000000000..67dc81fb3 --- /dev/null +++ b/e107_handlers/tiny_mce/plugins/media/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('media');var TinyMCE_MediaPlugin={getInfo:function(){return{longname:'Media',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_media.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},initInstance:function(inst){if(!tinyMCE.settings['media_skip_plugin_css'])tinyMCE.importCSS(inst.getDoc(),tinyMCE.baseURL+"/plugins/media/css/content.css")},getControlHTML:function(cn){switch(cn){case"media":return tinyMCE.getButtonHTML(cn,'lang_media_desc','{$pluginurl}/images/media.gif','mceMedia')}return""},execCommand:function(editor_id,element,command,user_interface,value){switch(command){case"mceMedia":tinyMCE.openWindow({file:'../../plugins/media/media.htm',width:430+tinyMCE.getLang('lang_media_delta_width',0),height:470+tinyMCE.getLang('lang_media_delta_height',0)},{editor_id:editor_id,inline:"yes"});return true}return false},cleanup:function(type,content,inst){var nl,img,i,ne,d,s,ci;switch(type){case"insert_to_editor":img=tinyMCE.getParam("theme_href")+'/images/spacer.gif';content=content.replace(/]*>\s*write(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)\(\{([^\)]*)\}\);\s*<\/script>/gi,'');content=content.replace(/]*)>/gi,'
    ');content=content.replace(/]*)>/gi,'
    ');content=content.replace(/<\/(object|embed)([^>]*)>/gi,'
    ');content=content.replace(/]*)>/gi,'
    ');content=content.replace(new RegExp('\\/ class="mceItemParam"><\\/div>','gi'),'class="mceItemParam">
    ');break;case"insert_to_editor_dom":d=inst.getDoc();nl=content.getElementsByTagName("img");for(i=0;i',startPos);attribs=TinyMCE_MediaPlugin._parseAttributes(content.substring(startPos+4,endPos));if(!/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(attribs['class']))continue;endPos+=2;at=attribs['title'];if(at){at=at.replace(/'/g,"'");at=at.replace(/&#quot;/g,'"');try{pl=eval('x={'+at+'};')}catch(ex){pl={}}}if(!tinyMCE.getParam('media_use_script',false)){switch(attribs['class']){case'mceItemFlash':ci='d27cdb6e-ae6d-11cf-96b8-444553540000';cb='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0';mt='application/x-shockwave-flash';break;case'mceItemShockWave':ci='166B1BCA-3F9C-11CF-8075-444553540000';cb='http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0';mt='application/x-director';break;case'mceItemWindowsMedia':ci=tinyMCE.getParam('media_wmp6_compatible')?'05589FA1-C356-11CE-BF01-00AA0055595A':'6BF52A52-394A-11D3-B153-00C04F79FAA6';cb='http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701';mt='application/x-mplayer2';break;case'mceItemQuickTime':ci='02BF25D5-8C17-4B23-BC80-D3488ABDDC6B';cb='http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0';mt='video/quicktime';break;case'mceItemRealMedia':ci='CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA';cb='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0';mt='audio/x-pn-realaudio-plugin';break}if(!tinyMCE.getParam("relative_urls"))pl.src=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],pl.src);embedHTML=TinyMCE_MediaPlugin._getEmbed(ci,cb,mt,pl,attribs)}else{switch(attribs['class']){case'mceItemFlash':s='writeFlash';break;case'mceItemShockWave':s='writeShockWave';break;case'mceItemWindowsMedia':s='writeWindowsMedia';break;case'mceItemQuickTime':s='writeQuickTime';break;case'mceItemRealMedia':s='writeRealMedia';break}if(attribs.width)at=at.replace(/width:[^0-9]?[0-9]+%?[^0-9]?/g,"width:'"+attribs.width+"'");if(attribs.height)at=at.replace(/height:[^0-9]?[0-9]+%?[^0-9]?/g,"height:'"+attribs.height+"'");if(!tinyMCE.getParam("relative_urls")){pl.src=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],pl.src);at=at.replace(new RegExp("src:'[^']*'","g"),"src:'"+pl.src+"'")}embedHTML=''}chunkBefore=content.substring(0,startPos);chunkAfter=content.substring(endPos);content=chunkBefore+embedHTML+chunkAfter}break}return content},handleNodeChange:function(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){if(node==null)return;do{if(node.nodeName=="IMG"&&/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(tinyMCE.getAttrib(node,'class'))){tinyMCE.switchClass(editor_id+'_media','mceButtonSelected');return true}}while((node=node.parentNode));tinyMCE.switchClass(editor_id+'_media','mceButtonNormal');return true},_createImgFromEmbed:function(n,d,cl){var ne,at,i,ti='',an;ne=d.createElement('img');ne.src=tinyMCE.getParam("theme_href")+'/images/spacer.gif';ne.width=tinyMCE.getAttrib(n,'width');ne.height=tinyMCE.getAttrib(n,'height');ne.className=cl;at=n.attributes;for(i=0;i0?ti.substring(0,ti.length-1):ti;ne.title=ti;n.parentNode.replaceChild(ne,n)},_createImg:function(cl,d,n){var i,nl,ti="",an,av,al=new Array();ne=d.createElement('img');ne.src=tinyMCE.getParam("theme_href")+'/images/spacer.gif';ne.width=tinyMCE.getAttrib(n,'width');ne.height=tinyMCE.getAttrib(n,'height');ne.className=cl;al.id=tinyMCE.getAttrib(n,'id');al.name=tinyMCE.getAttrib(n,'name');al.width=tinyMCE.getAttrib(n,'width');al.height=tinyMCE.getAttrib(n,'height');al.bgcolor=tinyMCE.getAttrib(n,'bgcolor');al.align=tinyMCE.getAttrib(n,'align');al.class_name=tinyMCE.getAttrib(n,'mce_class');nl=n.getElementsByTagName('div');for(i=0;i0?ti.substring(0,ti.length-1):ti;ne.title=ti;return ne},_getEmbed:function(cls,cb,mt,p,at){var h='',n;p.width=at.width?at.width:p.width;p.height=at.height?at.height:p.height;h+='';if(n=='src'&&p[n].indexOf('://')!=-1&&mt=='application/x-mplayer2')h+=''}}h+=']*>\s*write(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)\(\{([^\)]*)\}\);\s*<\/script>/gi, ''); + content = content.replace(/]*)>/gi, '
    '); + content = content.replace(/]*)>/gi, '
    '); + content = content.replace(/<\/(object|embed)([^>]*)>/gi, '
    '); + content = content.replace(/]*)>/gi, '
    '); + content = content.replace(new RegExp('\\/ class="mceItemParam"><\\/div>', 'gi'), 'class="mceItemParam">
    '); + break; + + case "insert_to_editor_dom": + d = inst.getDoc(); + nl = content.getElementsByTagName("img"); + for (i=0; i', startPos); + attribs = TinyMCE_MediaPlugin._parseAttributes(content.substring(startPos + 4, endPos)); + + // Is not flash, skip it + if (!/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(attribs['class'])) + continue; + + endPos += 2; + + // Parse attributes + at = attribs['title']; + if (at) { + at = at.replace(/'/g, "'"); + at = at.replace(/&#quot;/g, '"'); + + try { + pl = eval('x={' + at + '};'); + } catch (ex) { + pl = {}; + } + } + + // Use object/embed + if (!tinyMCE.getParam('media_use_script', false)) { + switch (attribs['class']) { + case 'mceItemFlash': + ci = 'd27cdb6e-ae6d-11cf-96b8-444553540000'; + cb = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0'; + mt = 'application/x-shockwave-flash'; + break; + + case 'mceItemShockWave': + ci = '166B1BCA-3F9C-11CF-8075-444553540000'; + cb = 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0'; + mt = 'application/x-director'; + break; + + case 'mceItemWindowsMedia': + ci = tinyMCE.getParam('media_wmp6_compatible') ? '05589FA1-C356-11CE-BF01-00AA0055595A' : '6BF52A52-394A-11D3-B153-00C04F79FAA6'; + cb = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701'; + mt = 'application/x-mplayer2'; + break; + + case 'mceItemQuickTime': + ci = '02BF25D5-8C17-4B23-BC80-D3488ABDDC6B'; + cb = 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0'; + mt = 'video/quicktime'; + break; + + case 'mceItemRealMedia': + ci = 'CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA'; + cb = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0'; + mt = 'audio/x-pn-realaudio-plugin'; + break; + } + + // Force absolute URL + if (!tinyMCE.getParam("relative_urls")) + pl.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], pl.src); + + embedHTML = TinyMCE_MediaPlugin._getEmbed(ci, cb, mt, pl, attribs); + } else { + // Use script version + switch (attribs['class']) { + case 'mceItemFlash': + s = 'writeFlash'; + break; + + case 'mceItemShockWave': + s = 'writeShockWave'; + break; + + case 'mceItemWindowsMedia': + s = 'writeWindowsMedia'; + break; + + case 'mceItemQuickTime': + s = 'writeQuickTime'; + break; + + case 'mceItemRealMedia': + s = 'writeRealMedia'; + break; + } + + if (attribs.width) + at = at.replace(/width:[^0-9]?[0-9]+%?[^0-9]?/g, "width:'" + attribs.width + "'"); + + if (attribs.height) + at = at.replace(/height:[^0-9]?[0-9]+%?[^0-9]?/g, "height:'" + attribs.height + "'"); + + // Force absolute URL + if (!tinyMCE.getParam("relative_urls")) { + pl.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], pl.src); + at = at.replace(new RegExp("src:'[^']*'", "g"), "src:'" + pl.src + "'"); + } + + embedHTML = ''; + } + + // Insert embed/object chunk + chunkBefore = content.substring(0, startPos); + chunkAfter = content.substring(endPos); + content = chunkBefore + embedHTML + chunkAfter; + } + break; + } + + return content; + }, + + handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) { + if (node == null) + return; + + do { + if (node.nodeName == "IMG" && /mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(tinyMCE.getAttrib(node, 'class'))) { + tinyMCE.switchClass(editor_id + '_media', 'mceButtonSelected'); + return true; + } + } while ((node = node.parentNode)); + + tinyMCE.switchClass(editor_id + '_media', 'mceButtonNormal'); + + return true; + }, + + _createImgFromEmbed : function(n, d, cl) { + var ne, at, i, ti = '', an; + + ne = d.createElement('img'); + ne.src = tinyMCE.getParam("theme_href") + '/images/spacer.gif'; + ne.width = tinyMCE.getAttrib(n, 'width'); + ne.height = tinyMCE.getAttrib(n, 'height'); + ne.className = cl; + + at = n.attributes; + for (i=0; i 0 ? ti.substring(0, ti.length - 1) : ti; + ne.title = ti; + + n.parentNode.replaceChild(ne, n); + }, + + _createImg : function(cl, d, n) { + var i, nl, ti = "", an, av, al = new Array(); + + ne = d.createElement('img'); + ne.src = tinyMCE.getParam("theme_href") + '/images/spacer.gif'; + ne.width = tinyMCE.getAttrib(n, 'width'); + ne.height = tinyMCE.getAttrib(n, 'height'); + ne.className = cl; + + al.id = tinyMCE.getAttrib(n, 'id'); + al.name = tinyMCE.getAttrib(n, 'name'); + al.width = tinyMCE.getAttrib(n, 'width'); + al.height = tinyMCE.getAttrib(n, 'height'); + al.bgcolor = tinyMCE.getAttrib(n, 'bgcolor'); + al.align = tinyMCE.getAttrib(n, 'align'); + al.class_name = tinyMCE.getAttrib(n, 'mce_class'); + + nl = n.getElementsByTagName('div'); + for (i=0; i 0 ? ti.substring(0, ti.length - 1) : ti; + ne.title = ti; + + return ne; + }, + + _getEmbed : function(cls, cb, mt, p, at) { + var h = '', n; + + p.width = at.width ? at.width : p.width; + p.height = at.height ? at.height : p.height; + + h += ''; + + // Add extra url parameter if it's an absolute URL on WMP + if (n == 'src' && p[n].indexOf('://') != -1 && mt == 'application/x-mplayer2') + h += ''; + } + } + + h += ''; + + h += ''); +} + +function init() { + var pl = "", f, val; + var type = "flash", fe, i; + + tinyMCEPopup.resizeToInnerSize(); + f = document.forms[0] + + fe = tinyMCE.selectedInstance.getFocusElement(); + if (/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(tinyMCE.getAttrib(fe, 'class'))) { + pl = "x={" + fe.title + "};"; + + switch (tinyMCE.getAttrib(fe, 'class')) { + case 'mceItemFlash': + type = 'flash'; + break; + + case 'mceItemShockWave': + type = 'shockwave'; + break; + + case 'mceItemWindowsMedia': + type = 'wmp'; + break; + + case 'mceItemQuickTime': + type = 'qt'; + break; + + case 'mceItemRealMedia': + type = 'rmp'; + break; + } + + document.forms[0].insert.value = tinyMCE.getLang('lang_update', 'Insert', true); + } + + document.getElementById('filebrowsercontainer').innerHTML = getBrowserHTML('filebrowser','src','media','media'); + document.getElementById('qtsrcfilebrowsercontainer').innerHTML = getBrowserHTML('qtsrcfilebrowser','qt_qtsrc','media','media'); + document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor'); + + var html = getMediaListHTML('filebrowser','src','media','media'); + if (html == "") + document.getElementById("linklistrow").style.display = 'none'; + else + document.getElementById("linklistcontainer").innerHTML = html; + + // Resize some elements + if (isVisible('filebrowsercontainer')) + document.getElementById('src').style.width = '230px'; + + // Setup form + if (pl != "") { + pl = eval(pl); + + switch (type) { + case "flash": + setBool(pl, 'flash', 'play'); + setBool(pl, 'flash', 'loop'); + setBool(pl, 'flash', 'menu'); + setBool(pl, 'flash', 'swliveconnect'); + setStr(pl, 'flash', 'quality'); + setStr(pl, 'flash', 'scale'); + setStr(pl, 'flash', 'salign'); + setStr(pl, 'flash', 'wmode'); + setStr(pl, 'flash', 'base'); + setStr(pl, 'flash', 'flashvars'); + break; + + case "qt": + setBool(pl, 'qt', 'loop'); + setBool(pl, 'qt', 'autoplay'); + setBool(pl, 'qt', 'cache'); + setBool(pl, 'qt', 'controller'); + setBool(pl, 'qt', 'correction'); + setBool(pl, 'qt', 'enablejavascript'); + setBool(pl, 'qt', 'kioskmode'); + setBool(pl, 'qt', 'autohref'); + setBool(pl, 'qt', 'playeveryframe'); + setBool(pl, 'qt', 'tarsetcache'); + setStr(pl, 'qt', 'scale'); + setStr(pl, 'qt', 'starttime'); + setStr(pl, 'qt', 'endtime'); + setStr(pl, 'qt', 'tarset'); + setStr(pl, 'qt', 'qtsrcchokespeed'); + setStr(pl, 'qt', 'volume'); + setStr(pl, 'qt', 'qtsrc'); + break; + + case "shockwave": + setBool(pl, 'shockwave', 'sound'); + setBool(pl, 'shockwave', 'progress'); + setBool(pl, 'shockwave', 'autostart'); + setBool(pl, 'shockwave', 'swliveconnect'); + setStr(pl, 'shockwave', 'swvolume'); + setStr(pl, 'shockwave', 'swstretchstyle'); + setStr(pl, 'shockwave', 'swstretchhalign'); + setStr(pl, 'shockwave', 'swstretchvalign'); + break; + + case "wmp": + setBool(pl, 'wmp', 'autostart'); + setBool(pl, 'wmp', 'enabled'); + setBool(pl, 'wmp', 'enablecontextmenu'); + setBool(pl, 'wmp', 'fullscreen'); + setBool(pl, 'wmp', 'invokeurls'); + setBool(pl, 'wmp', 'mute'); + setBool(pl, 'wmp', 'stretchtofit'); + setBool(pl, 'wmp', 'windowlessvideo'); + setStr(pl, 'wmp', 'balance'); + setStr(pl, 'wmp', 'baseurl'); + setStr(pl, 'wmp', 'captioningid'); + setStr(pl, 'wmp', 'currentmarker'); + setStr(pl, 'wmp', 'currentposition'); + setStr(pl, 'wmp', 'defaultframe'); + setStr(pl, 'wmp', 'playcount'); + setStr(pl, 'wmp', 'rate'); + setStr(pl, 'wmp', 'uimode'); + setStr(pl, 'wmp', 'volume'); + break; + + case "rmp": + setBool(pl, 'rmp', 'autostart'); + setBool(pl, 'rmp', 'loop'); + setBool(pl, 'rmp', 'autogotourl'); + setBool(pl, 'rmp', 'center'); + setBool(pl, 'rmp', 'imagestatus'); + setBool(pl, 'rmp', 'maintainaspect'); + setBool(pl, 'rmp', 'nojava'); + setBool(pl, 'rmp', 'prefetch'); + setBool(pl, 'rmp', 'shuffle'); + setStr(pl, 'rmp', 'console'); + setStr(pl, 'rmp', 'controls'); + setStr(pl, 'rmp', 'numloop'); + setStr(pl, 'rmp', 'scriptcallbacks'); + break; + } + + setStr(pl, null, 'src'); + setStr(pl, null, 'id'); + setStr(pl, null, 'name'); + setStr(pl, null, 'vspace'); + setStr(pl, null, 'hspace'); + setStr(pl, null, 'bgcolor'); + setStr(pl, null, 'align'); + setStr(pl, null, 'width'); + setStr(pl, null, 'height'); + + if ((val = tinyMCE.getAttrib(fe, "width")) != "") + pl.width = f.width.value = val; + + if ((val = tinyMCE.getAttrib(fe, "height")) != "") + pl.height = f.height.value = val; + + oldWidth = pl.width ? parseInt(pl.width) : 0; + oldHeight = pl.height ? parseInt(pl.height) : 0; + } else + oldWidth = oldHeight = 0; + + selectByValue(f, 'media_type', type); + changedType(type); + updateColor('bgcolor_pick', 'bgcolor'); + + TinyMCE_EditableSelects.init(); + generatePreview(); +} + +function insertMedia() { + var fe, f = document.forms[0], h; + + if (!AutoValidator.validate(f)) { + alert(tinyMCE.getLang('lang_invalid_data')); + return false; + } + + f.width.value = f.width.value == "" ? 100 : f.width.value; + f.height.value = f.height.value == "" ? 100 : f.height.value; + + fe = tinyMCE.selectedInstance.getFocusElement(); + if (fe != null && /mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(tinyMCE.getAttrib(fe, 'class'))) { + switch (f.media_type.options[f.media_type.selectedIndex].value) { + case "flash": + fe.className = "mceItemFlash"; + break; + + case "shockwave": + fe.className = "mceItemShockWave"; + break; + + case "qt": + fe.className = "mceItemQuickTime"; + break; + + case "wmp": + fe.className = "mceItemWindowsMedia"; + break; + + case "rmp": + fe.className = "mceItemRealMedia"; + break; + } + + if (fe.width != f.width.value || fe.height != f.width.height) + tinyMCE.selectedInstance.repaint(); + + fe.title = serializeParameters(); + fe.width = f.width.value; + fe.height = f.height.value; + fe.style.width = f.width.value + (f.width.value.indexOf('%') == -1 ? 'px' : ''); + fe.style.height = f.height.value + (f.height.value.indexOf('%') == -1 ? 'px' : ''); + fe.align = f.align.options[f.align.selectedIndex].value; + } else { + h = ' 0) { + var html = ""; + + html += ''; + + return html; + } + + return ""; +} + +function getType(v) { + var fo = tinyMCE.getParam("media_types", "flash=swf;shockwave=dcr;qt=mov,qt,mpg,mp3,mp4,mpeg;shockwave=dcr;wmp=avi,wmv,wm,asf,asx,wmx,wvx;rmp=rm,ra,ram").split(';'), i, c, el, x; + + for (i=0; i 0 ? s.substring(0, s.length - 1) : s; + + return s; +} + +function setBool(pl, p, n) { + if (typeof(pl[n]) == "undefined") + return; + + document.forms[0].elements[p + "_" + n].checked = pl[n]; +} + +function setStr(pl, p, n) { + var f = document.forms[0], e = f.elements[(p != null ? p + "_" : '') + n]; + + if (typeof(pl[n]) == "undefined") + return; + + if (e.type == "text") + e.value = pl[n]; + else + selectByValue(f, (p != null ? p + "_" : '') + n, pl[n]); +} + +function getBool(p, n, d, tv, fv) { + var v = document.forms[0].elements[p + "_" + n].checked; + + tv = typeof(tv) == 'undefined' ? 'true' : "'" + jsEncode(tv) + "'"; + fv = typeof(fv) == 'undefined' ? 'false' : "'" + jsEncode(fv) + "'"; + + return (v == d) ? '' : n + (v ? ':' + tv + ',' : ':' + fv + ','); +} + +function getStr(p, n, d) { + var e = document.forms[0].elements[(p != null ? p + "_" : "") + n]; + var v = e.type == "text" ? e.value : e.options[e.selectedIndex].value; + + return ((n == d || v == '') ? '' : n + ":'" + jsEncode(v) + "',"); +} + +function getInt(p, n, d) { + var e = document.forms[0].elements[(p != null ? p + "_" : "") + n]; + var v = e.type == "text" ? e.value : e.options[e.selectedIndex].value; + + return ((n == d || v == '') ? '' : n + ":" + v.replace(/[^0-9]+/g, '') + ","); +} + +function jsEncode(s) { + s = s.replace(new RegExp('\\\\', 'g'), '\\\\'); + s = s.replace(new RegExp('"', 'g'), '\\"'); + s = s.replace(new RegExp("'", 'g'), "\\'"); + + return s; +} + +function generatePreview(c) { + var f = document.forms[0], p = document.getElementById('prev'), h = '', cls, pl, n, type, codebase, wp, hp, nw, nh; + + p.innerHTML = ''; + + nw = parseInt(f.width.value); + nh = parseInt(f.height.value); + + if (f.width.value != "" && f.height.value != "") { + if (f.constrain.checked) { + if (c == 'width' && oldWidth != 0) { + wp = nw / oldWidth; + nh = Math.round(wp * nh); + f.height.value = nh; + } else if (c == 'height' && oldHeight != 0) { + hp = nh / oldHeight; + nw = Math.round(hp * nw); + f.width.value = nw; + } + } + } + + if (f.width.value != "") + oldWidth = nw; + + if (f.height.value != "") + oldHeight = nh; + + // After constrain + pl = serializeParameters(); + + switch (f.media_type.options[f.media_type.selectedIndex].value) { + case "flash": + cls = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'; + codebase = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0'; + type = 'application/x-shockwave-flash'; + break; + + case "shockwave": + cls = 'clsid:166B1BCA-3F9C-11CF-8075-444553540000'; + codebase = 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0'; + type = 'application/x-director'; + break; + + case "qt": + cls = 'clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B'; + codebase = 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0'; + type = 'video/quicktime'; + break; + + case "wmp": + cls = tinyMCE.getParam('media_wmp6_compatible') ? 'clsid:05589FA1-C356-11CE-BF01-00AA0055595A' : 'clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6'; + codebase = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701'; + type = 'application/x-mplayer2'; + break; + + case "rmp": + cls = 'clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA'; + codebase = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701'; + type = 'audio/x-pn-realaudio-plugin'; + break; + } + + if (pl == '') { + p.innerHTML = ''; + return; + } + + pl = eval('x={' + pl + '};'); + + if (!pl.src) { + p.innerHTML = ''; + return; + } + + pl.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], pl.src); + pl.width = !pl.width ? 100 : pl.width; + pl.height = !pl.height ? 100 : pl.height; + pl.id = !pl.id ? 'obj' : pl.id; + pl.name = !pl.name ? 'eobj' : pl.name; + pl.align = !pl.align ? '' : pl.align; + + h += ''; + + for (n in pl) { + h += ''; + + // Add extra url parameter if it's an absolute URL + if (n == 'src' && pl[n].indexOf('://') != -1) + h += ''; + } + + h += ' + + {$lang_media_title} + + + + + + + + + + +
    + + +
    +
    +
    + {$lang_media_general} + + + + + + + + + + + + + + + + + +
    + +
    + + + + + +
     
    +
     
    + + + + + + +
    x   
    +
    +
    + +
    + {$lang_media_preview} + +
    +
    + +
    +
    + {$lang_media_advanced} + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + +
     
    +
    +
    + +
    + {$lang_media_flash_options} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + + + + + + + +
    +
    + +
    + {$lang_media_qt_options} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    +  
    + + + + + +
     
    +
    +
    + +
    + {$lang_media_wmp_options} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    +
    + +
    + {$lang_media_rmp_options} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    +   +
    +
    + +
    + {$lang_media_shockwave_options} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    + + + + + +
    +
    +
    +
    +
    + +
    +
    + +
    + +
    + +
    +
    +
    + + diff --git a/e107_handlers/tiny_mce/plugins/table/cell.htm b/e107_handlers/tiny_mce/plugins/table/cell.htm new file mode 100644 index 000000000..14fd0d56b --- /dev/null +++ b/e107_handlers/tiny_mce/plugins/table/cell.htm @@ -0,0 +1,182 @@ + + + {$lang_table_cell_title} + + + + + + + + +
    + + +
    +
    +
    + {$lang_table_general_props} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    +
    +
    + +
    +
    + {$lang_table_advanced_props} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + + + + +
     
    +
    + + + + + +
     
    +
    + + + + + +
     
    +
    +
    +
    +
    + +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + + diff --git a/e107_handlers/tiny_mce/plugins/table/css/cell.css b/e107_handlers/tiny_mce/plugins/table/css/cell.css new file mode 100644 index 000000000..a47cc1a1e --- /dev/null +++ b/e107_handlers/tiny_mce/plugins/table/css/cell.css @@ -0,0 +1,17 @@ +/* CSS file for cell dialog in the table plugin */ + +.panel_wrapper div.current { + height: 200px; +} + +.advfield { + width: 200px; +} + +#action { + margin-bottom: 3px; +} + +#class { + width: 150px; +} \ No newline at end of file diff --git a/e107_handlers/tiny_mce/plugins/table/css/row.css b/e107_handlers/tiny_mce/plugins/table/css/row.css new file mode 100644 index 000000000..0e397db3e --- /dev/null +++ b/e107_handlers/tiny_mce/plugins/table/css/row.css @@ -0,0 +1,25 @@ +/* CSS file for row dialog in the table plugin */ + +.panel_wrapper div.current { + height: 200px; +} + +.advfield { + width: 200px; +} + +#action { + margin-bottom: 3px; +} + +#rowtype,#align,#valign,#class,#height { + width: 150px; +} + +#height { + width: 50px; +} + +.col2 { + padding-left: 20px; +} diff --git a/e107_handlers/tiny_mce/plugins/table/css/table.css b/e107_handlers/tiny_mce/plugins/table/css/table.css new file mode 100644 index 000000000..82bb548ca --- /dev/null +++ b/e107_handlers/tiny_mce/plugins/table/css/table.css @@ -0,0 +1,13 @@ +/* CSS file for table dialog in the table plugin */ + +.panel_wrapper div.current { + height: 220px; +} + +.advfield { + width: 200px; +} + +#class { + width: 150px; +} diff --git a/e107_handlers/tiny_mce/plugins/table/editor_plugin.js b/e107_handlers/tiny_mce/plugins/table/editor_plugin.js new file mode 100644 index 000000000..b476b052d --- /dev/null +++ b/e107_handlers/tiny_mce/plugins/table/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('table');var TinyMCE_TablePlugin={getInfo:function(){return{longname:'Tables',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_table.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},initInstance:function(inst){if(tinyMCE.isGecko){var doc=inst.getDoc();tinyMCE.addEvent(doc,"mouseup",TinyMCE_TablePlugin._mouseDownHandler)}inst.tableRowClipboard=null},getControlHTML:function(control_name){var controls=new Array(['table','table.gif','lang_table_desc','mceInsertTable',true],['delete_table','table_delete.gif','lang_table_del','mceTableDelete'],['delete_col','table_delete_col.gif','lang_table_delete_col_desc','mceTableDeleteCol'],['delete_row','table_delete_row.gif','lang_table_delete_row_desc','mceTableDeleteRow'],['col_after','table_insert_col_after.gif','lang_table_col_after_desc','mceTableInsertColAfter'],['col_before','table_insert_col_before.gif','lang_table_col_before_desc','mceTableInsertColBefore'],['row_after','table_insert_row_after.gif','lang_table_row_after_desc','mceTableInsertRowAfter'],['row_before','table_insert_row_before.gif','lang_table_row_before_desc','mceTableInsertRowBefore'],['row_props','table_row_props.gif','lang_table_row_desc','mceTableRowProps',true],['cell_props','table_cell_props.gif','lang_table_cell_desc','mceTableCellProps',true],['split_cells','table_split_cells.gif','lang_table_split_cells_desc','mceTableSplitCells',true],['merge_cells','table_merge_cells.gif','lang_table_merge_cells_desc','mceTableMergeCells',true]);for(var i=0;i4?but[4]:false)+(but.length>5?', \''+but[5]+'\'':'')+');return false;';if(but[0]==control_name)return tinyMCE.getButtonHTML(control_name,but[2],'{$pluginurl}/images/'+but[1],but[3],(but.length>4?but[4]:false))}if(control_name=="tablecontrols"){var html="";html+=tinyMCE.getControlHTML("table");html+=tinyMCE.getControlHTML("separator");html+=tinyMCE.getControlHTML("row_props");html+=tinyMCE.getControlHTML("cell_props");html+=tinyMCE.getControlHTML("separator");html+=tinyMCE.getControlHTML("row_before");html+=tinyMCE.getControlHTML("row_after");html+=tinyMCE.getControlHTML("delete_row");html+=tinyMCE.getControlHTML("separator");html+=tinyMCE.getControlHTML("col_before");html+=tinyMCE.getControlHTML("col_after");html+=tinyMCE.getControlHTML("delete_col");html+=tinyMCE.getControlHTML("separator");html+=tinyMCE.getControlHTML("split_cells");html+=tinyMCE.getControlHTML("merge_cells");return html}return""},execCommand:function(editor_id,element,command,user_interface,value){switch(command){case"mceInsertTable":case"mceTableRowProps":case"mceTableCellProps":case"mceTableSplitCells":case"mceTableMergeCells":case"mceTableInsertRowBefore":case"mceTableInsertRowAfter":case"mceTableDeleteRow":case"mceTableInsertColBefore":case"mceTableInsertColAfter":case"mceTableDeleteCol":case"mceTableCutRow":case"mceTableCopyRow":case"mceTablePasteRowBefore":case"mceTablePasteRowAfter":case"mceTableDelete":var inst=tinyMCE.getInstanceById(editor_id);inst.execCommand('mceBeginUndoLevel');TinyMCE_TablePlugin._doExecCommand(editor_id,element,command,user_interface,value);inst.execCommand('mceEndUndoLevel');return true}return false},handleNodeChange:function(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){var colspan="1",rowspan="1",tdElm;var inst=tinyMCE.getInstanceById(editor_id);tinyMCE.switchClass(editor_id+'_table','mceButtonNormal');tinyMCE.switchClass(editor_id+'_delete_table','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_row_props','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_cell_props','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_row_before','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_row_after','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_delete_row','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_col_before','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_col_after','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_delete_col','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_split_cells','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_merge_cells','mceButtonDisabled');if(tdElm=tinyMCE.getParentElement(node,"td,th")){tinyMCE.switchClass(editor_id+'_cell_props','mceButtonSelected');tinyMCE.switchClass(editor_id+'_delete_table','mceButtonNormal');tinyMCE.switchClass(editor_id+'_row_before','mceButtonNormal');tinyMCE.switchClass(editor_id+'_row_after','mceButtonNormal');tinyMCE.switchClass(editor_id+'_delete_row','mceButtonNormal');tinyMCE.switchClass(editor_id+'_col_before','mceButtonNormal');tinyMCE.switchClass(editor_id+'_col_after','mceButtonNormal');tinyMCE.switchClass(editor_id+'_delete_col','mceButtonNormal');colspan=tinyMCE.getAttrib(tdElm,"colspan");rowspan=tinyMCE.getAttrib(tdElm,"rowspan");colspan=colspan==""?"1":colspan;rowspan=rowspan==""?"1":rowspan;if(colspan!="1"||rowspan!="1")tinyMCE.switchClass(editor_id+'_split_cells','mceButtonNormal')}if(tinyMCE.getParentElement(node,"tr"))tinyMCE.switchClass(editor_id+'_row_props','mceButtonSelected');if(tinyMCE.getParentElement(node,"table")){tinyMCE.switchClass(editor_id+'_table','mceButtonSelected');tinyMCE.switchClass(editor_id+'_merge_cells','mceButtonNormal')}},_mouseDownHandler:function(e){var elm=tinyMCE.isMSIE?event.srcElement:e.target;var focusElm=tinyMCE.selectedInstance.getFocusElement();if(elm.nodeName=="BODY"&&(focusElm.nodeName=="TD"||focusElm.nodeName=="TH"||(focusElm.parentNode&&focusElm.parentNode.nodeName=="TD")||(focusElm.parentNode&&focusElm.parentNode.nodeName=="TH"))){window.setTimeout(function(){var tableElm=tinyMCE.getParentElement(focusElm,"table");tinyMCE.handleVisualAid(tableElm,true,tinyMCE.settings['visual'],tinyMCE.selectedInstance)},10)}},_doExecCommand:function(editor_id,element,command,user_interface,value){var inst=tinyMCE.getInstanceById(editor_id);var focusElm=inst.getFocusElement();var trElm=tinyMCE.getParentElement(focusElm,"tr");var tdElm=tinyMCE.getParentElement(focusElm,"td,th");var tableElm=tinyMCE.getParentElement(focusElm,"table");var doc=inst.contentWindow.document;var tableBorder=tableElm?tableElm.getAttribute("border"):"";if(trElm&&tdElm==null)tdElm=trElm.cells[0];function inArray(ar,v){for(var i=0;i0&&inArray(ar[i],v))return true;if(ar[i]==v)return true}return false}function makeTD(){var newTD=doc.createElement("td");newTD.innerHTML=" "}function getColRowSpan(td){var colspan=tinyMCE.getAttrib(td,"colspan");var rowspan=tinyMCE.getAttrib(td,"rowspan");colspan=colspan==""?1:parseInt(colspan);rowspan=rowspan==""?1:parseInt(rowspan);return{colspan:colspan,rowspan:rowspan}}function getCellPos(grid,td){var x,y;for(y=0;y1){for(var i=x;i1)td.rowSpan=sd.rowspan+1;lastElm=td}deleteMarked(tableElm)}}function prevElm(node,name){while((node=node.previousSibling)!=null){if(node.nodeName==name)return node}return null}function nextElm(node,names){var namesAr=names.split(',');while((node=node.nextSibling)!=null){for(var i=0;i1){do{var nexttd=nextElm(td,"TD,TH");if(td._delete)td.parentNode.removeChild(td)}while((td=nexttd)!=null)}}while((tr=next)!=null)}function addRows(td_elm,tr_elm,rowspan){td_elm.rowSpan=1;var trNext=nextElm(tr_elm,"TR");for(var i=1;i1){var newTD=cells[x].cloneNode(true);var sd=getColRowSpan(cells[x]);newTD.rowSpan=sd.rowspan-1;var nextTD=nextTR.cells[x];if(nextTD==null)nextTR.appendChild(newTD);else nextTR.insertBefore(newTD,nextTD)}}var lastTDElm=null;for(var x=0;tdElm=getCell(grid,cpos.rowindex,x);x++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd.rowspan>1){tdElm.rowSpan=sd.rowspan-1}else{trElm=tdElm.parentNode;if(trElm.parentNode)trElm._delete=true}lastTDElm=tdElm}}deleteMarked(tableElm);cpos.rowindex--;if(cpos.rowindex<0)cpos.rowindex=0;grid=getTableGrid(tableElm);inst.selection.selectNode(getCell(grid,cpos.rowindex,0),tinyMCE.isGecko,true);break;case"mceTableInsertColBefore":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);var lastTDElm=null;for(var y=0;tdElm=getCell(grid,y,cpos.cellindex);y++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['colspan']==1){var newTD=doc.createElement(tdElm.nodeName);newTD.innerHTML=" ";newTD.rowSpan=tdElm.rowSpan;tdElm.parentNode.insertBefore(newTD,tdElm)}else tdElm.colSpan++;lastTDElm=tdElm}}grid=getTableGrid(tableElm);inst.selection.selectNode(getCell(grid,cpos.rowindex,cpos.cellindex+1),tinyMCE.isGecko,true);break;case"mceTableInsertColAfter":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);var lastTDElm=null;for(var y=0;tdElm=getCell(grid,y,cpos.cellindex);y++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['colspan']==1){var newTD=doc.createElement(tdElm.nodeName);newTD.innerHTML=" ";newTD.rowSpan=tdElm.rowSpan;var nextTD=nextElm(tdElm,"TD,TH");if(nextTD==null)tdElm.parentNode.appendChild(newTD);else nextTD.parentNode.insertBefore(newTD,nextTD)}else tdElm.colSpan++;lastTDElm=tdElm}}grid=getTableGrid(tableElm);inst.selection.selectNode(getCell(grid,cpos.rowindex,cpos.cellindex),tinyMCE.isGecko,true);break;case"mceTableDeleteCol":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);var lastTDElm=null;if(grid.length>1&&grid[0].length<=1){tableElm=tinyMCE.getParentElement(tableElm,"table");tableElm.parentNode.removeChild(tableElm);return true}for(var y=0;tdElm=getCell(grid,y,cpos.cellindex);y++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['colspan']>1)tdElm.colSpan=sd['colspan']-1;else{if(tdElm.parentNode)tdElm.parentNode.removeChild(tdElm)}lastTDElm=tdElm}}cpos.cellindex--;if(cpos.cellindex<0)cpos.cellindex=0;grid=getTableGrid(tableElm);inst.selection.selectNode(getCell(grid,cpos.rowindex,0),tinyMCE.isGecko,true);break;case"mceTableSplitCells":if(!trElm||!tdElm)return true;var spandata=getColRowSpan(tdElm);var colspan=spandata["colspan"];var rowspan=spandata["rowspan"];if(colspan>1||rowspan>1){tdElm.colSpan=1;for(var i=1;i1)addRows(newTD,trElm,rowspan)}addRows(tdElm,trElm,rowspan)}tableElm=tinyMCE.getParentElement(inst.getFocusElement(),"table");break;case"mceTableMergeCells":var rows=new Array();var sel=inst.getSel();var grid=getTableGrid(tableElm);if(tinyMCE.isMSIE||sel.rangeCount==1){if(user_interface){var template=new Array();var sp=getColRowSpan(tdElm);template['file']='../../plugins/table/merge_cells.htm';template['width']=250;template['height']=105+(tinyMCE.isNS7?25:0);template['width']+=tinyMCE.getLang('lang_table_merge_cells_delta_width',0);template['height']+=tinyMCE.getLang('lang_table_merge_cells_delta_height',0);tinyMCE.openWindow(template,{editor_id:inst.editorId,inline:"yes",action:"update",numcols:sp.colspan,numrows:sp.rowspan});return true}else{var numRows=parseInt(value['numrows']);var numCols=parseInt(value['numcols']);var cpos=getCellPos(grid,tdElm);if((""+numRows)=="NaN")numRows=1;if((""+numCols)=="NaN")numCols=1;var tRows=tableElm.rows;for(var y=cpos.rowindex;y0)rows[rows.length]=rowCells}}}else{var cells=new Array();var sel=inst.getSel();var lastTR=null;var curRow=null;var x1=-1,y1=-1,x2,y2;if(sel.rangeCount<2)return true;for(var i=0;i0)rows[rows.length]=rowCells}var curRow=new Array();var lastTR=null;for(var y=0;ycolSpan)colSpan=rowColSpan;lastRowSpan=-1}var lastColSpan=-1;for(var x=0;xrowSpan)rowSpan=colRowSpan;lastColSpan=-1}tdElm=rows[0][0];tdElm.rowSpan=rowSpan;tdElm.colSpan=colSpan;for(var y=0;y0))tdElm.innerHTML+=html;if(rows[y][x]!=tdElm&&!rows[y][x]._deleted){var cpos=getCellPos(grid,rows[y][x]);var tr=rows[y][x].parentNode;tr.removeChild(rows[y][x]);rows[y][x]._deleted=true;if(!tr.hasChildNodes()){tr.parentNode.removeChild(tr);var lastCell=null;for(var x=0;cellElm=getCell(grid,cpos.rowindex,x);x++){if(cellElm!=lastCell&&cellElm.rowSpan>1)cellElm.rowSpan--;lastCell=cellElm}if(tdElm.rowSpan>1)tdElm.rowSpan--}}}}break}tableElm=tinyMCE.getParentElement(inst.getFocusElement(),"table");tinyMCE.handleVisualAid(tableElm,true,tinyMCE.settings['visual'],tinyMCE.selectedInstance);tinyMCE.triggerNodeChange();inst.repaint()}return true}return false}};tinyMCE.addPlugin("table",TinyMCE_TablePlugin); \ No newline at end of file diff --git a/e107_handlers/tiny_mce/plugins/table/editor_plugin_src.js b/e107_handlers/tiny_mce/plugins/table/editor_plugin_src.js new file mode 100644 index 000000000..39474fecd --- /dev/null +++ b/e107_handlers/tiny_mce/plugins/table/editor_plugin_src.js @@ -0,0 +1,1073 @@ +/** + * $Id: editor_plugin_src.js,v 1.1.1.1 2006-12-02 04:34:18 mcfly_e107 Exp $ + * + * @author Moxiecode + * @copyright Copyright 2004-2006, Moxiecode Systems AB, All rights reserved. + */ + +/* Import plugin specific language pack */ +tinyMCE.importPluginLanguagePack('table'); + +var TinyMCE_TablePlugin = { + getInfo : function() { + return { + longname : 'Tables', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_table.html', + version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion + }; + }, + + initInstance : function(inst) { + if (tinyMCE.isGecko) { + var doc = inst.getDoc(); + tinyMCE.addEvent(doc, "mouseup", TinyMCE_TablePlugin._mouseDownHandler); + } + + inst.tableRowClipboard = null; + }, + + /** + * Returns the HTML contents of the table control. + */ + getControlHTML : function(control_name) { + var controls = new Array( + ['table', 'table.gif', 'lang_table_desc', 'mceInsertTable', true], + ['delete_table', 'table_delete.gif', 'lang_table_del', 'mceTableDelete'], + ['delete_col', 'table_delete_col.gif', 'lang_table_delete_col_desc', 'mceTableDeleteCol'], + ['delete_row', 'table_delete_row.gif', 'lang_table_delete_row_desc', 'mceTableDeleteRow'], + ['col_after', 'table_insert_col_after.gif', 'lang_table_col_after_desc', 'mceTableInsertColAfter'], + ['col_before', 'table_insert_col_before.gif', 'lang_table_col_before_desc', 'mceTableInsertColBefore'], + ['row_after', 'table_insert_row_after.gif', 'lang_table_row_after_desc', 'mceTableInsertRowAfter'], + ['row_before', 'table_insert_row_before.gif', 'lang_table_row_before_desc', 'mceTableInsertRowBefore'], + ['row_props', 'table_row_props.gif', 'lang_table_row_desc', 'mceTableRowProps', true], + ['cell_props', 'table_cell_props.gif', 'lang_table_cell_desc', 'mceTableCellProps', true], + ['split_cells', 'table_split_cells.gif', 'lang_table_split_cells_desc', 'mceTableSplitCells', true], + ['merge_cells', 'table_merge_cells.gif', 'lang_table_merge_cells_desc', 'mceTableMergeCells', true]); + + // Render table control + for (var i=0; i 4 ? but[4] : false) + (but.length > 5 ? ', \'' + but[5] + '\'' : '') + ');return false;'; + + if (but[0] == control_name) + return tinyMCE.getButtonHTML(control_name, but[2], '{$pluginurl}/images/'+ but[1], but[3], (but.length > 4 ? but[4] : false)); + } + + // Special tablecontrols + if (control_name == "tablecontrols") { + var html = ""; + + html += tinyMCE.getControlHTML("table"); + html += tinyMCE.getControlHTML("separator"); + html += tinyMCE.getControlHTML("row_props"); + html += tinyMCE.getControlHTML("cell_props"); + html += tinyMCE.getControlHTML("separator"); + html += tinyMCE.getControlHTML("row_before"); + html += tinyMCE.getControlHTML("row_after"); + html += tinyMCE.getControlHTML("delete_row"); + html += tinyMCE.getControlHTML("separator"); + html += tinyMCE.getControlHTML("col_before"); + html += tinyMCE.getControlHTML("col_after"); + html += tinyMCE.getControlHTML("delete_col"); + html += tinyMCE.getControlHTML("separator"); + html += tinyMCE.getControlHTML("split_cells"); + html += tinyMCE.getControlHTML("merge_cells"); + + return html; + } + + return ""; + }, + + /** + * Executes the table commands. + */ + execCommand : function(editor_id, element, command, user_interface, value) { + // Is table command + switch (command) { + case "mceInsertTable": + case "mceTableRowProps": + case "mceTableCellProps": + case "mceTableSplitCells": + case "mceTableMergeCells": + case "mceTableInsertRowBefore": + case "mceTableInsertRowAfter": + case "mceTableDeleteRow": + case "mceTableInsertColBefore": + case "mceTableInsertColAfter": + case "mceTableDeleteCol": + case "mceTableCutRow": + case "mceTableCopyRow": + case "mceTablePasteRowBefore": + case "mceTablePasteRowAfter": + case "mceTableDelete": + var inst = tinyMCE.getInstanceById(editor_id); + + inst.execCommand('mceBeginUndoLevel'); + TinyMCE_TablePlugin._doExecCommand(editor_id, element, command, user_interface, value); + inst.execCommand('mceEndUndoLevel'); + + return true; + } + + // Pass to next handler in chain + return false; + }, + + handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) { + var colspan = "1", rowspan = "1", tdElm; + + var inst = tinyMCE.getInstanceById(editor_id); + + // Reset table controls + tinyMCE.switchClass(editor_id + '_table', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_delete_table', 'mceButtonDisabled'); + tinyMCE.switchClass(editor_id + '_row_props', 'mceButtonDisabled'); + tinyMCE.switchClass(editor_id + '_cell_props', 'mceButtonDisabled'); + tinyMCE.switchClass(editor_id + '_row_before', 'mceButtonDisabled'); + tinyMCE.switchClass(editor_id + '_row_after', 'mceButtonDisabled'); + tinyMCE.switchClass(editor_id + '_delete_row', 'mceButtonDisabled'); + tinyMCE.switchClass(editor_id + '_col_before', 'mceButtonDisabled'); + tinyMCE.switchClass(editor_id + '_col_after', 'mceButtonDisabled'); + tinyMCE.switchClass(editor_id + '_delete_col', 'mceButtonDisabled'); + tinyMCE.switchClass(editor_id + '_split_cells', 'mceButtonDisabled'); + tinyMCE.switchClass(editor_id + '_merge_cells', 'mceButtonDisabled'); + + // Within a td element + if (tdElm = tinyMCE.getParentElement(node, "td,th")) { + tinyMCE.switchClass(editor_id + '_cell_props', 'mceButtonSelected'); + tinyMCE.switchClass(editor_id + '_delete_table', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_row_before', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_row_after', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_delete_row', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_col_before', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_col_after', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_delete_col', 'mceButtonNormal'); + + colspan = tinyMCE.getAttrib(tdElm, "colspan"); + rowspan = tinyMCE.getAttrib(tdElm, "rowspan"); + + colspan = colspan == "" ? "1" : colspan; + rowspan = rowspan == "" ? "1" : rowspan; + + if (colspan != "1" || rowspan != "1") + tinyMCE.switchClass(editor_id + '_split_cells', 'mceButtonNormal'); + } + + // Within a tr element + if (tinyMCE.getParentElement(node, "tr")) + tinyMCE.switchClass(editor_id + '_row_props', 'mceButtonSelected'); + + // Within table + if (tinyMCE.getParentElement(node, "table")) { + tinyMCE.switchClass(editor_id + '_table', 'mceButtonSelected'); + tinyMCE.switchClass(editor_id + '_merge_cells', 'mceButtonNormal'); + } + }, + + // Private plugin internal methods + + _mouseDownHandler : function(e) { + var elm = tinyMCE.isMSIE ? event.srcElement : e.target; + var focusElm = tinyMCE.selectedInstance.getFocusElement(); + + // If press on special Mozilla create TD/TR thingie + if (elm.nodeName == "BODY" && (focusElm.nodeName == "TD" || focusElm.nodeName == "TH" || (focusElm.parentNode && focusElm.parentNode.nodeName == "TD") ||(focusElm.parentNode && focusElm.parentNode.nodeName == "TH") )) { + window.setTimeout(function() { + var tableElm = tinyMCE.getParentElement(focusElm, "table"); + tinyMCE.handleVisualAid(tableElm, true, tinyMCE.settings['visual'], tinyMCE.selectedInstance); + }, 10); + } + }, + + /** + * Executes the table commands. + */ + _doExecCommand : function(editor_id, element, command, user_interface, value) { + var inst = tinyMCE.getInstanceById(editor_id); + var focusElm = inst.getFocusElement(); + var trElm = tinyMCE.getParentElement(focusElm, "tr"); + var tdElm = tinyMCE.getParentElement(focusElm, "td,th"); + var tableElm = tinyMCE.getParentElement(focusElm, "table"); + var doc = inst.contentWindow.document; + var tableBorder = tableElm ? tableElm.getAttribute("border") : ""; + + // Get first TD if no TD found + if (trElm && tdElm == null) + tdElm = trElm.cells[0]; + + // ------- Inner functions --------- + function inArray(ar, v) { + for (var i=0; i 0 && inArray(ar[i], v)) + return true; + + // Found value + if (ar[i] == v) + return true; + } + + return false; + } + + function makeTD() { + var newTD = doc.createElement("td"); + newTD.innerHTML = " "; + } + + function getColRowSpan(td) { + var colspan = tinyMCE.getAttrib(td, "colspan"); + var rowspan = tinyMCE.getAttrib(td, "rowspan"); + + colspan = colspan == "" ? 1 : parseInt(colspan); + rowspan = rowspan == "" ? 1 : parseInt(rowspan); + + return {colspan : colspan, rowspan : rowspan}; + } + + function getCellPos(grid, td) { + var x, y; + + for (y=0; y 1) { // Remove due to colspan + for (var i=x; i 1) + td.rowSpan = sd.rowspan + 1; + + lastElm = td; + } + + deleteMarked(tableElm); + } + } + + function prevElm(node, name) { + while ((node = node.previousSibling) != null) { + if (node.nodeName == name) + return node; + } + + return null; + } + + function nextElm(node, names) { + var namesAr = names.split(','); + + while ((node = node.nextSibling) != null) { + for (var i=0; i 1) { + do { + var nexttd = nextElm(td, "TD,TH"); + + if (td._delete) + td.parentNode.removeChild(td); + } while ((td = nexttd) != null); + } + } while ((tr = next) != null); + } + + function addRows(td_elm, tr_elm, rowspan) { + // Add rows + td_elm.rowSpan = 1; + var trNext = nextElm(tr_elm, "TR"); + for (var i=1; i 1) { + var newTD = cells[x].cloneNode(true); + var sd = getColRowSpan(cells[x]); + + newTD.rowSpan = sd.rowspan - 1; + + var nextTD = nextTR.cells[x]; + + if (nextTD == null) + nextTR.appendChild(newTD); + else + nextTR.insertBefore(newTD, nextTD); + } + } + + // Delete cells + var lastTDElm = null; + for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) { + if (tdElm != lastTDElm) { + var sd = getColRowSpan(tdElm); + + if (sd.rowspan > 1) { + tdElm.rowSpan = sd.rowspan - 1; + } else { + trElm = tdElm.parentNode; + + if (trElm.parentNode) + trElm._delete = true; + } + + lastTDElm = tdElm; + } + } + + deleteMarked(tableElm); + + cpos.rowindex--; + if (cpos.rowindex < 0) + cpos.rowindex = 0; + + // Recalculate grid and select + grid = getTableGrid(tableElm); + inst.selection.selectNode(getCell(grid, cpos.rowindex, 0), tinyMCE.isGecko, true); // Only collape on gecko + break; + + case "mceTableInsertColBefore": + if (!trElm || !tdElm) + return true; + + var grid = getTableGrid(tableElm); + var cpos = getCellPos(grid, tdElm); + var lastTDElm = null; + + for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) { + if (tdElm != lastTDElm) { + var sd = getColRowSpan(tdElm); + + if (sd['colspan'] == 1) { + var newTD = doc.createElement(tdElm.nodeName); + + newTD.innerHTML = " "; + newTD.rowSpan = tdElm.rowSpan; + + tdElm.parentNode.insertBefore(newTD, tdElm); + } else + tdElm.colSpan++; + + lastTDElm = tdElm; + } + } + + grid = getTableGrid(tableElm); + inst.selection.selectNode(getCell(grid, cpos.rowindex, cpos.cellindex + 1), tinyMCE.isGecko, true); // Only collape on gecko + break; + + case "mceTableInsertColAfter": + if (!trElm || !tdElm) + return true; + + var grid = getTableGrid(tableElm); + var cpos = getCellPos(grid, tdElm); + var lastTDElm = null; + + for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) { + if (tdElm != lastTDElm) { + var sd = getColRowSpan(tdElm); + + if (sd['colspan'] == 1) { + var newTD = doc.createElement(tdElm.nodeName); + + newTD.innerHTML = " "; + newTD.rowSpan = tdElm.rowSpan; + + var nextTD = nextElm(tdElm, "TD,TH"); + if (nextTD == null) + tdElm.parentNode.appendChild(newTD); + else + nextTD.parentNode.insertBefore(newTD, nextTD); + } else + tdElm.colSpan++; + + lastTDElm = tdElm; + } + } + + grid = getTableGrid(tableElm); + inst.selection.selectNode(getCell(grid, cpos.rowindex, cpos.cellindex), tinyMCE.isGecko, true); // Only collape on gecko + break; + + case "mceTableDeleteCol": + if (!trElm || !tdElm) + return true; + + var grid = getTableGrid(tableElm); + var cpos = getCellPos(grid, tdElm); + var lastTDElm = null; + + // Only one col, remove whole table + if (grid.length > 1 && grid[0].length <= 1) { + tableElm = tinyMCE.getParentElement(tableElm, "table"); // Look for table instead of tbody + tableElm.parentNode.removeChild(tableElm); + return true; + } + + // Delete cells + for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) { + if (tdElm != lastTDElm) { + var sd = getColRowSpan(tdElm); + + if (sd['colspan'] > 1) + tdElm.colSpan = sd['colspan'] - 1; + else { + if (tdElm.parentNode) + tdElm.parentNode.removeChild(tdElm); + } + + lastTDElm = tdElm; + } + } + + cpos.cellindex--; + if (cpos.cellindex < 0) + cpos.cellindex = 0; + + // Recalculate grid and select + grid = getTableGrid(tableElm); + inst.selection.selectNode(getCell(grid, cpos.rowindex, 0), tinyMCE.isGecko, true); // Only collape on gecko + break; + + case "mceTableSplitCells": + if (!trElm || !tdElm) + return true; + + var spandata = getColRowSpan(tdElm); + + var colspan = spandata["colspan"]; + var rowspan = spandata["rowspan"]; + + // Needs splitting + if (colspan > 1 || rowspan > 1) { + // Generate cols + tdElm.colSpan = 1; + for (var i=1; i 1) + addRows(newTD, trElm, rowspan); + } + + addRows(tdElm, trElm, rowspan); + } + + // Apply visual aids + tableElm = tinyMCE.getParentElement(inst.getFocusElement(), "table"); + break; + + case "mceTableMergeCells": + var rows = new Array(); + var sel = inst.getSel(); + var grid = getTableGrid(tableElm); + + if (tinyMCE.isMSIE || sel.rangeCount == 1) { + if (user_interface) { + // Setup template + var template = new Array(); + var sp = getColRowSpan(tdElm); + + template['file'] = '../../plugins/table/merge_cells.htm'; + template['width'] = 250; + template['height'] = 105 + (tinyMCE.isNS7 ? 25 : 0); + + // Language specific width and height addons + template['width'] += tinyMCE.getLang('lang_table_merge_cells_delta_width', 0); + template['height'] += tinyMCE.getLang('lang_table_merge_cells_delta_height', 0); + + // Open window + tinyMCE.openWindow(template, {editor_id : inst.editorId, inline : "yes", action : "update", numcols : sp.colspan, numrows : sp.rowspan}); + + return true; + } else { + var numRows = parseInt(value['numrows']); + var numCols = parseInt(value['numcols']); + var cpos = getCellPos(grid, tdElm); + + if (("" + numRows) == "NaN") + numRows = 1; + + if (("" + numCols) == "NaN") + numCols = 1; + + // Get rows and cells + var tRows = tableElm.rows; + for (var y=cpos.rowindex; y 0) + rows[rows.length] = rowCells; + } + + //return true; + } + } else { + var cells = new Array(); + var sel = inst.getSel(); + var lastTR = null; + var curRow = null; + var x1 = -1, y1 = -1, x2, y2; + + // Only one cell selected, whats the point? + if (sel.rangeCount < 2) + return true; + + // Get all selected cells + for (var i=0; i 0) + rows[rows.length] = rowCells; + } + + // Find selected cells in grid and box + var curRow = new Array(); + var lastTR = null; + for (var y=0; y colSpan) + colSpan = rowColSpan; + + lastRowSpan = -1; + } + + // Validate vertical and get total rowspan + var lastColSpan = -1; + for (var x=0; x rowSpan) + rowSpan = colRowSpan; + + lastColSpan = -1; + } + + // Setup td + tdElm = rows[0][0]; + tdElm.rowSpan = rowSpan; + tdElm.colSpan = colSpan; + + // Merge cells + for (var y=0; y 0)) + tdElm.innerHTML += html; + + // Not current cell + if (rows[y][x] != tdElm && !rows[y][x]._deleted) { + var cpos = getCellPos(grid, rows[y][x]); + var tr = rows[y][x].parentNode; + + tr.removeChild(rows[y][x]); + rows[y][x]._deleted = true; + + // Empty TR, remove it + if (!tr.hasChildNodes()) { + tr.parentNode.removeChild(tr); + + var lastCell = null; + for (var x=0; cellElm = getCell(grid, cpos.rowindex, x); x++) { + if (cellElm != lastCell && cellElm.rowSpan > 1) + cellElm.rowSpan--; + + lastCell = cellElm; + } + + if (tdElm.rowSpan > 1) + tdElm.rowSpan--; + } + } + } + } + + break; + } + + tableElm = tinyMCE.getParentElement(inst.getFocusElement(), "table"); + tinyMCE.handleVisualAid(tableElm, true, tinyMCE.settings['visual'], tinyMCE.selectedInstance); + tinyMCE.triggerNodeChange(); + inst.repaint(); + } + + return true; + } + + // Pass to next handler in chain + return false; + } +}; + +tinyMCE.addPlugin("table", TinyMCE_TablePlugin); diff --git a/e107_handlers/tiny_mce/plugins/table/images/buttons.gif b/e107_handlers/tiny_mce/plugins/table/images/buttons.gif new file mode 100644 index 0000000000000000000000000000000000000000..8c09ff952c4b7108367bc11ba2bd70ca1ed104cb GIT binary patch literal 1765 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 literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/plugins/table/images/table_cell_props.gif b/e107_handlers/tiny_mce/plugins/table/images/table_cell_props.gif new file mode 100644 index 0000000000000000000000000000000000000000..bee7ed652f83476471ca0c0cfa5f2b72c6f98fc8 GIT binary patch literal 189 zcmV;u07CyqNk%w1VH5xq0K*6XGD>2SrMS}4+=8g`!qMXL>f*A!(w4mb{r>)O6%hbCQiN7b literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/plugins/table/images/table_delete.gif b/e107_handlers/tiny_mce/plugins/table/images/table_delete.gif new file mode 100644 index 0000000000000000000000000000000000000000..2a00e6ad66aa907381ff742dfcb6aa2e2ec3df17 GIT binary patch literal 372 zcmZ?wbhEHb6k!lyxXJ(m|NsC0^y%lMRiD=FywtS()2v-TmLL0b@8#d4r!Jkk_37m0 zM~gQcGWJTIwCYe$T-JmI8#W!fv~uABRt5$QCMID*=gj%{@86?GkAPN#oj^XJ z_>+Z^fkBHw2V?}uPYi4m9i|p|=t%XSSWnQADz=v_wHnRY+F7p1ZrJmz#y(t)Zk*lZk_e*Nv}? zvvK;2S*`-yoScFy1X+02@GWu?C=+Cw&cngQwa#s0G0Os;9qa<@otLayy@rR6PvG!w R-U}BmUG%+r&B>9$8UT)8gMR=3 literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/plugins/table/images/table_delete_col.gif b/e107_handlers/tiny_mce/plugins/table/images/table_delete_col.gif new file mode 100644 index 0000000000000000000000000000000000000000..91f53af02aacbe33b04f782efb164560887d3bfe GIT binary patch literal 163 zcmV;U09^k^Nk%w1VH5xq0K*Fa0s;azZ{ony{xV8pTyKn*qO$Jn>V2Z^b%c^$j^>)S z^85Syjgq3Ovcf`IasU7TA^8LW000jFEC2ui02BZe000C~@X1N5y*TU5Yg=F;j03m~ z*9S7AQZ5E+6`;WiE*xJ4;S4OrVLD zq^HC5lAo_~pYs0x{r~^~A^8LW000jFEC2ui02BZe000D7@X1N5y*TU5>G|Nna879^ z3V9~RxRnWO7y-xJIHT+-78`=#Vo@mc9)Jo^FeDZl1O#9@r7(*PC}E43Bq@Wics$6M ZU5s;*CQxUf_d3_{csz*D~813(lGjTD@2z{n9^mxAJO7)Ys5OF}UnY`dU@qbmky T#N$E3kp`{PZ$%b~i~s;TfG0;) literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/plugins/table/images/table_insert_row_after.gif b/e107_handlers/tiny_mce/plugins/table/images/table_insert_row_after.gif new file mode 100644 index 0000000000000000000000000000000000000000..b9c14466138007454958671320914d9a7d8a6db5 GIT binary patch literal 163 zcmV;U09^k^Nk%w1VH5xq0K*Od0s;b3hwZ}J{xV8pU2lbto3eVM^5XCQa(@5FN<(eWPqQV3Ig1XGua#QiUNM~QhRb*u41x>1^iLw6v{&bt_E>x1D!Tyq@xq`0#T6LwOvdL|b z(z4F}lDPhYn!-Y4ng9R*A^8LW000jFEC2ui02BZe000DY@X1N5y*TU5Y5HK87$oTl zLW8cziUMcq3atxINz(*;fcy>zVR(}yP=SSVxhOap#m7;QWHz6J=oGb%7 literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/plugins/table/images/table_row_props.gif b/e107_handlers/tiny_mce/plugins/table/images/table_row_props.gif new file mode 100644 index 0000000000000000000000000000000000000000..e5c7cc37aaded685d68a6f1d0f5f204415258489 GIT binary patch literal 187 zcmV;s07U;sNk%w1VH5xq0K*CZGD>2SrMS}5-GZj_!qMXH@&2N=(w4mbqOihJVuJnt z{^sQ3lB)8xz|uleasU7TA^8LW000jFEC2ui02BZe000DN@X1N5y*TU5EBnkKj-9KxjG%0%ik9LBwDPfF*DxWw(Ncc#J3` p0@_Nzrf3x2h<5?KWxL^Wx|%>X2mX2#XaIzThJ+o7ii;Hy06QxAQu6=+ literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/plugins/table/images/table_split_cells.gif b/e107_handlers/tiny_mce/plugins/table/images/table_split_cells.gif new file mode 100644 index 0000000000000000000000000000000000000000..8ccb1b5f89d35619c9fe7a81957305c93f3ed8fc GIT binary patch literal 210 zcmV;@04@JVNk%w1VH5xq0K)FI0=7!2VKkqmrb#i?scsvdKbY znlMRZVtuQCnZ&Zr{r~^~A^8LW000jFEC2ui02BZe000Dk@X1N5y*TU5Y5HK893<%p zLW8c%iY{mB3dRgiNz(*8!x#pIfU#7qN5Q2I~2E2l>h($ literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/plugins/table/jscripts/cell.js b/e107_handlers/tiny_mce/plugins/table/jscripts/cell.js new file mode 100644 index 000000000..d0768a04b --- /dev/null +++ b/e107_handlers/tiny_mce/plugins/table/jscripts/cell.js @@ -0,0 +1,249 @@ +function init() { + tinyMCEPopup.resizeToInnerSize(); + + document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table'); + document.getElementById('bordercolor_pickcontainer').innerHTML = getColorPickerHTML('bordercolor_pick','bordercolor'); + document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor') + + var inst = tinyMCE.selectedInstance; + var tdElm = tinyMCE.getParentElement(inst.getFocusElement(), "td,th"); + var formObj = document.forms[0]; + var st = tinyMCE.parseStyle(tinyMCE.getAttrib(tdElm, "style")); + + // Get table cell data + var celltype = tdElm.nodeName.toLowerCase(); + var align = tinyMCE.getAttrib(tdElm, 'align'); + var valign = tinyMCE.getAttrib(tdElm, 'valign'); + var width = trimSize(getStyle(tdElm, 'width', 'width')); + var height = trimSize(getStyle(tdElm, 'height', 'height')); + var bordercolor = convertRGBToHex(getStyle(tdElm, 'bordercolor', 'borderLeftColor')); + var bgcolor = convertRGBToHex(getStyle(tdElm, 'bgcolor', 'backgroundColor')); + var className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(tdElm, 'class'), false); + var backgroundimage = getStyle(tdElm, 'background', 'backgroundImage').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");; + var id = tinyMCE.getAttrib(tdElm, 'id'); + var lang = tinyMCE.getAttrib(tdElm, 'lang'); + var dir = tinyMCE.getAttrib(tdElm, 'dir'); + var scope = tinyMCE.getAttrib(tdElm, 'scope'); + + // Setup form + addClassesToList('class', 'table_cell_styles'); + formObj.bordercolor.value = bordercolor; + formObj.bgcolor.value = bgcolor; + formObj.backgroundimage.value = backgroundimage; + formObj.width.value = width; + formObj.height.value = height; + formObj.id.value = id; + formObj.lang.value = lang; + formObj.style.value = tinyMCE.serializeStyle(st); + selectByValue(formObj, 'align', align); + selectByValue(formObj, 'valign', valign); + selectByValue(formObj, 'class', className); + selectByValue(formObj, 'celltype', celltype); + selectByValue(formObj, 'dir', dir); + selectByValue(formObj, 'scope', scope); + + // Resize some elements + if (isVisible('backgroundimagebrowser')) + document.getElementById('backgroundimage').style.width = '180px'; + + updateColor('bordercolor_pick', 'bordercolor'); + updateColor('bgcolor_pick', 'bgcolor'); +} + +function updateAction() { + tinyMCEPopup.restoreSelection(); + + var inst = tinyMCE.selectedInstance; + var tdElm = tinyMCE.getParentElement(inst.getFocusElement(), "td,th"); + var trElm = tinyMCE.getParentElement(inst.getFocusElement(), "tr"); + var tableElm = tinyMCE.getParentElement(inst.getFocusElement(), "table"); + var formObj = document.forms[0]; + + inst.execCommand('mceBeginUndoLevel'); + + switch (getSelectValue(formObj, 'action')) { + case "cell": + var celltype = getSelectValue(formObj, 'celltype'); + var scope = getSelectValue(formObj, 'scope'); + + if (tinyMCE.getParam("accessibility_warnings")) { + if (celltype == "th" && scope == "") + var answer = confirm(tinyMCE.getLang('lang_table_missing_scope', '', true)); + else + var answer = true; + + if (!answer) + return; + } + + updateCell(tdElm); + break; + + case "row": + var cell = trElm.firstChild; + + if (cell.nodeName != "TD" && cell.nodeName != "TH") + cell = nextCell(cell); + + do { + cell = updateCell(cell, true); + } while ((cell = nextCell(cell)) != null); + + break; + + case "all": + var rows = tableElm.getElementsByTagName("tr"); + + for (var i=0; i colLimit) { + alert(tinyMCE.getLang('lang_table_col_limit', '', true, {cols : colLimit})); + return false; + } else if (rowLimit && rows > rowLimit) { + alert(tinyMCE.getLang('lang_table_row_limit', '', true, {rows : rowLimit})); + return false; + } else if (cellLimit && cols * rows > cellLimit) { + alert(tinyMCE.getLang('lang_table_cell_limit', '', true, {cells : cellLimit})); + return false; + } + + // Update table + if (action == "update") { + inst.execCommand('mceBeginUndoLevel'); + + tinyMCE.setAttrib(elm, 'cellPadding', cellpadding, true); + tinyMCE.setAttrib(elm, 'cellSpacing', cellspacing, true); + tinyMCE.setAttrib(elm, 'border', border, true); + tinyMCE.setAttrib(elm, 'align', align); + tinyMCE.setAttrib(elm, 'class', className); + tinyMCE.setAttrib(elm, 'style', style); + tinyMCE.setAttrib(elm, 'id', id); + tinyMCE.setAttrib(elm, 'summary', summary); + tinyMCE.setAttrib(elm, 'dir', dir); + tinyMCE.setAttrib(elm, 'lang', lang); + + // Not inline styles + if (!tinyMCE.getParam("inline_styles")) + tinyMCE.setAttrib(elm, 'width', width, true); + + // Remove these since they are not valid XHTML + tinyMCE.setAttrib(elm, 'borderColor', ''); + tinyMCE.setAttrib(elm, 'bgColor', ''); + tinyMCE.setAttrib(elm, 'background', ''); + tinyMCE.setAttrib(elm, 'height', ''); + + if (background != '') + elm.style.backgroundImage = "url('" + background + "')"; + else + elm.style.backgroundImage = ''; + + if (tinyMCE.getParam("inline_styles")) + elm.style.borderWidth = border + "px"; + + if (tinyMCE.getParam("inline_styles")) { + if (width != '') + elm.style.width = getCSSSize(width); + } + + if (bordercolor != "") { + elm.style.borderColor = bordercolor; + elm.style.borderStyle = elm.style.borderStyle == "" ? "solid" : elm.style.borderStyle; + elm.style.borderWidth = border == "" ? "1px" : border; + } else + elm.style.borderColor = ''; + + elm.style.backgroundColor = bgcolor; + elm.style.height = getCSSSize(height); + + tinyMCE.handleVisualAid(tinyMCE.tableElm, false, inst.visualAid, inst); + + // Fix for stange MSIE align bug + tinyMCE.tableElm.outerHTML = tinyMCE.tableElm.outerHTML; + + tinyMCE.handleVisualAid(inst.getBody(), true, inst.visualAid, inst); + tinyMCE.triggerNodeChange(); + inst.execCommand('mceEndUndoLevel'); + + // Repaint if dimensions changed + if (formObj.width.value != orgTableWidth || formObj.height.value != orgTableHeight) + inst.repaint(); + + tinyMCEPopup.close(); + return true; + } + + // Create new table + html += '/g, '>'); + + return ' ' + attrib + '="' + value + '"'; +} + +function init() { + tinyMCEPopup.resizeToInnerSize(); + + document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table'); + document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table'); + document.getElementById('bordercolor_pickcontainer').innerHTML = getColorPickerHTML('bordercolor_pick','bordercolor'); + document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor'); + + var cols = 2, rows = 2, border = tinyMCE.getParam('table_default_border', '0'), cellpadding = tinyMCE.getParam('table_default_cellpadding', ''), cellspacing = tinyMCE.getParam('table_default_cellspacing', ''); + var align = "", width = "", height = "", bordercolor = "", bgcolor = "", className = ""; + var id = "", summary = "", style = "", dir = "", lang = "", background = "", bgcolor = "", bordercolor = ""; + var inst = tinyMCE.selectedInstance; + var formObj = document.forms[0]; + var elm = tinyMCE.getParentElement(inst.getFocusElement(), "table"); + + tinyMCE.tableElm = elm; + action = tinyMCE.getWindowArg('action'); + if (action == null) + action = tinyMCE.tableElm ? "update" : "insert"; + + if (tinyMCE.tableElm && action != "insert") { + var rowsAr = tinyMCE.tableElm.rows; + var cols = 0; + for (var i=0; i cols) + cols = rowsAr[i].cells.length; + + cols = cols; + rows = rowsAr.length; + + st = tinyMCE.parseStyle(tinyMCE.getAttrib(tinyMCE.tableElm, "style")); + border = trimSize(getStyle(elm, 'border', 'borderWidth')); + cellpadding = tinyMCE.getAttrib(tinyMCE.tableElm, 'cellpadding', ""); + cellspacing = tinyMCE.getAttrib(tinyMCE.tableElm, 'cellspacing', ""); + width = trimSize(getStyle(elm, 'width', 'width')); + height = trimSize(getStyle(elm, 'height', 'height')); + bordercolor = convertRGBToHex(getStyle(elm, 'bordercolor', 'borderLeftColor')); + bgcolor = convertRGBToHex(getStyle(elm, 'bgcolor', 'backgroundColor')); + align = tinyMCE.getAttrib(tinyMCE.tableElm, 'align', align); + className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(tinyMCE.tableElm, 'class'), false); + id = tinyMCE.getAttrib(tinyMCE.tableElm, 'id'); + summary = tinyMCE.getAttrib(tinyMCE.tableElm, 'summary'); + style = tinyMCE.serializeStyle(st); + dir = tinyMCE.getAttrib(tinyMCE.tableElm, 'dir'); + lang = tinyMCE.getAttrib(tinyMCE.tableElm, 'lang'); + background = getStyle(elm, 'background', 'backgroundImage').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1"); + + orgTableWidth = width; + orgTableHeight = height; + + action = "update"; + } + + addClassesToList('class', "table_styles"); + + // Update form + selectByValue(formObj, 'align', align); + selectByValue(formObj, 'class', className); + formObj.cols.value = cols; + formObj.rows.value = rows; + formObj.border.value = border; + formObj.cellpadding.value = cellpadding; + formObj.cellspacing.value = cellspacing; + formObj.width.value = width; + formObj.height.value = height; + formObj.bordercolor.value = bordercolor; + formObj.bgcolor.value = bgcolor; + formObj.id.value = id; + formObj.summary.value = summary; + formObj.style.value = style; + formObj.dir.value = dir; + formObj.lang.value = lang; + formObj.backgroundimage.value = background; + formObj.insert.value = tinyMCE.getLang('lang_' + action, 'Insert', true); + + updateColor('bordercolor_pick', 'bordercolor'); + updateColor('bgcolor_pick', 'bgcolor'); + + // Resize some elements + if (isVisible('backgroundimagebrowser')) + document.getElementById('backgroundimage').style.width = '180px'; + + // Disable some fields in update mode + if (action == "update") { + formObj.cols.disabled = true; + formObj.rows.disabled = true; + } +} + +function changedSize() { + var formObj = document.forms[0]; + var st = tinyMCE.parseStyle(formObj.style.value); + + var width = formObj.width.value; + if (width != "") + st['width'] = tinyMCE.getParam("inline_styles") ? getCSSSize(width) : ""; + else + st['width'] = ""; + + var height = formObj.height.value; + if (height != "") + st['height'] = getCSSSize(height); + else + st['height'] = ""; + + formObj.style.value = tinyMCE.serializeStyle(st); +} + +function changedBackgroundImage() { + var formObj = document.forms[0]; + var st = tinyMCE.parseStyle(formObj.style.value); + + st['background-image'] = "url('" + formObj.backgroundimage.value + "')"; + + formObj.style.value = tinyMCE.serializeStyle(st); +} + +function changedBorder() { + var formObj = document.forms[0]; + var st = tinyMCE.parseStyle(formObj.style.value); + + // Update border width if the element has a color + if (formObj.border.value != "" && formObj.bordercolor.value != "") + st['border-width'] = formObj.border.value + "px"; + + formObj.style.value = tinyMCE.serializeStyle(st); +} + +function changedColor() { + var formObj = document.forms[0]; + var st = tinyMCE.parseStyle(formObj.style.value); + + st['background-color'] = formObj.bgcolor.value; + + if (formObj.bordercolor.value != "") { + st['border-color'] = formObj.bordercolor.value; + + // Add border-width if it's missing + if (!st['border-width']) + st['border-width'] = formObj.border.value == "" ? "1px" : formObj.border.value + "px"; + } + + formObj.style.value = tinyMCE.serializeStyle(st); +} + +function changedStyle() { + var formObj = document.forms[0]; + var st = tinyMCE.parseStyle(formObj.style.value); + + if (st['background-image']) + formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1"); + else + formObj.backgroundimage.value = ''; + + if (st['width']) + formObj.width.value = trimSize(st['width']); + + if (st['height']) + formObj.height.value = trimSize(st['height']); + + if (st['background-color']) { + formObj.bgcolor.value = st['background-color']; + updateColor('bgcolor_pick','bgcolor'); + } + + if (st['border-color']) { + formObj.bordercolor.value = st['border-color']; + updateColor('bordercolor_pick','bordercolor'); + } +} diff --git a/e107_handlers/tiny_mce/plugins/table/langs/en.js b/e107_handlers/tiny_mce/plugins/table/langs/en.js new file mode 100644 index 000000000..c5923ef1f --- /dev/null +++ b/e107_handlers/tiny_mce/plugins/table/langs/en.js @@ -0,0 +1,78 @@ +// UK lang variables + +tinyMCE.addToLang('table',{ +general_tab : 'General', +advanced_tab : 'Advanced', +general_props : 'General properties', +advanced_props : 'Advanced properties', +desc : 'Inserts a new table', +row_before_desc : 'Insert row before', +row_after_desc : 'Insert row after', +delete_row_desc : 'Delete row', +col_before_desc : 'Insert column before', +col_after_desc : 'Insert column after', +delete_col_desc : 'Remove column', +rowtype : 'Row in table part', +title : 'Insert/Modify table', +width : 'Width', +height : 'Height', +cols : 'Columns', +rows : 'Rows', +cellspacing : 'Cellspacing', +cellpadding : 'Cellpadding', +border : 'Border', +align : 'Alignment', +align_default : 'Default', +align_left : 'Left', +align_right : 'Right', +align_middle : 'Center', +row_title : 'Table row properties', +cell_title : 'Table cell properties', +cell_type : 'Cell type', +row_desc : 'Table row properties', +cell_desc : 'Table cell properties', +valign : 'Vertical alignment', +align_top : 'Top', +align_bottom : 'Bottom', +props_desc : 'Table properties', +bordercolor : 'Border color', +bgcolor : 'Background color', +merge_cells_title : 'Merge table cells', +split_cells_desc : 'Split table cells', +merge_cells_desc : 'Merge table cells', +cut_row_desc : 'Cut table row', +copy_row_desc : 'Copy table row', +paste_row_before_desc : 'Paste table row before', +paste_row_after_desc : 'Paste table row after', +id : 'Id', +style: 'Style', +langdir : 'Language direction', +langcode : 'Language code', +mime : 'Target MIME type', +ltr : 'Left to right', +rtl : 'Right to left', +bgimage : 'Background image', +summary : 'Summary', +td : "Data", +th : "Header", +cell_cell : 'Update current cell', +cell_row : 'Update all cells in row', +cell_all : 'Update all cells in table', +row_row : 'Update current row', +row_odd : 'Update odd rows in table', +row_even : 'Update even rows in table', +row_all : 'Update all rows in table', +thead : 'Table Head', +tbody : 'Table Body', +tfoot : 'Table Foot', +del : 'Delete table', +scope : 'Scope', +row : 'Row', +col : 'Col', +rowgroup : 'Row Group', +colgroup : 'Col Group', +col_limit : 'You\'ve exceeded the maximum number of columns of {$cols}.', +row_limit : 'You\'ve exceeded the maximum number of rows of {$rows}.', +cell_limit : 'You\'ve exceeded the maximum number of cells of {$cells}.', +missing_scope: 'Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.' +}); diff --git a/e107_handlers/tiny_mce/plugins/table/merge_cells.htm b/e107_handlers/tiny_mce/plugins/table/merge_cells.htm new file mode 100644 index 000000000..46e2a1e23 --- /dev/null +++ b/e107_handlers/tiny_mce/plugins/table/merge_cells.htm @@ -0,0 +1,38 @@ + + + {$lang_table_merge_cells_title} + + + + + + + +
    +
    + {$lang_table_merge_cells_title} + + + + + + + + + +
    {$lang_table_cols}: +
    {$lang_table_rows}:
    +
    + +
    +
    + +
    + +
    + +
    +
    +
    + + diff --git a/e107_handlers/tiny_mce/plugins/table/row.htm b/e107_handlers/tiny_mce/plugins/table/row.htm new file mode 100644 index 000000000..ea5e13ddc --- /dev/null +++ b/e107_handlers/tiny_mce/plugins/table/row.htm @@ -0,0 +1,159 @@ + + + {$lang_table_row_title} + + + + + + + + +
    + + +
    +
    +
    + {$lang_table_general_props} + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + +
    + +
    +
    +
    + +
    +
    + {$lang_table_advanced_props} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + + + + +
     
    +
    + + + + + +
     
    +
    +
    +
    +
    + +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + + diff --git a/e107_handlers/tiny_mce/plugins/table/table.htm b/e107_handlers/tiny_mce/plugins/table/table.htm new file mode 100644 index 000000000..0f9eb5e24 --- /dev/null +++ b/e107_handlers/tiny_mce/plugins/table/table.htm @@ -0,0 +1,156 @@ + + + {$lang_table_title} + + + + + + + + + +
    + + +
    +
    +
    + {$lang_table_general_props} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + +
    +
    + {$lang_table_advanced_props} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    + + + + + +
     
    +
    + + + + + +
     
    +
    + + + + + +
     
    +
    +
    +
    +
    + +
    +
    + +
    + +
    + +
    +
    +
    + + diff --git a/e107_handlers/tiny_mce/plugins/zoom/editor_plugin.js b/e107_handlers/tiny_mce/plugins/zoom/editor_plugin.js new file mode 100644 index 000000000..9ab93cf56 --- /dev/null +++ b/e107_handlers/tiny_mce/plugins/zoom/editor_plugin.js @@ -0,0 +1 @@ +var TinyMCE_ZoomPlugin={getInfo:function(){return{longname:'Zoom',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_zoom.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},getControlHTML:function(control_name){if(!tinyMCE.isMSIE||tinyMCE.isMSIE5_0||tinyMCE.isOpera)return"";switch(control_name){case"zoom":return''}return""},execCommand:function(editor_id,element,command,user_interface,value){switch(command){case"mceZoom":tinyMCE.getInstanceById(editor_id).contentDocument.body.style.zoom=value;tinyMCE.getInstanceById(editor_id).contentDocument.body.style.mozZoom=value;return true}return false}};tinyMCE.addPlugin("zoom",TinyMCE_ZoomPlugin); \ No newline at end of file diff --git a/e107_handlers/tiny_mce/plugins/zoom/editor_plugin_src.js b/e107_handlers/tiny_mce/plugins/zoom/editor_plugin_src.js new file mode 100644 index 000000000..b03897041 --- /dev/null +++ b/e107_handlers/tiny_mce/plugins/zoom/editor_plugin_src.js @@ -0,0 +1,56 @@ +/** + * $Id: editor_plugin_src.js,v 1.1.1.1 2006-12-02 04:34:19 mcfly_e107 Exp $ + * + * @author Moxiecode + * @copyright Copyright 2004-2006, Moxiecode Systems AB, All rights reserved. + */ + +var TinyMCE_ZoomPlugin = { + getInfo : function() { + return { + longname : 'Zoom', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_zoom.html', + version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion + }; + }, + + /** + * Returns the HTML contents of the zoom control. + */ + getControlHTML : function(control_name) { + if (!tinyMCE.isMSIE || tinyMCE.isMSIE5_0 || tinyMCE.isOpera) + return ""; + + switch (control_name) { + case "zoom": + return ''; + } + + return ""; + }, + + /** + * Executes the mceZoom command. + */ + execCommand : function(editor_id, element, command, user_interface, value) { + // Handle commands + switch (command) { + case "mceZoom": + tinyMCE.getInstanceById(editor_id).contentDocument.body.style.zoom = value; + tinyMCE.getInstanceById(editor_id).contentDocument.body.style.mozZoom = value; + return true; + } + + // Pass to next handler in chain + return false; + } +}; + +tinyMCE.addPlugin("zoom", TinyMCE_ZoomPlugin); diff --git a/e107_handlers/tiny_mce/themes/advanced/about.htm b/e107_handlers/tiny_mce/themes/advanced/about.htm new file mode 100644 index 000000000..2a86227fb --- /dev/null +++ b/e107_handlers/tiny_mce/themes/advanced/about.htm @@ -0,0 +1,52 @@ + + + {$lang_about_title} + + + + + + + + +
    +
    +

    {$lang_about_title}

    +

    Version: {$tinymce_version} ({$tinymce_releasedate})

    +

    TinyMCE is a platform independent web based Javascript HTML WYSIWYG editor control released as Open Source under LGPL + by Moxiecode Systems AB. It has the ability to convert HTML TEXTAREA fields or other HTML elements to editor instances.

    +

    Copyright © 2003-2006, Moxiecode Systems AB, All rights reserved.

    +

    For more information about this software visit the TinyMCE website.

    + +
    +
    + +
    +
    +

    {$lang_loaded_plugins}

    + +
    +
    + +

     

    +
    +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    + + diff --git a/e107_handlers/tiny_mce/themes/advanced/anchor.htm b/e107_handlers/tiny_mce/themes/advanced/anchor.htm new file mode 100644 index 000000000..988bcb68e --- /dev/null +++ b/e107_handlers/tiny_mce/themes/advanced/anchor.htm @@ -0,0 +1,33 @@ + + + {$lang_insert_anchor_title} + + + + + +
    + + + + + + + + + +
    {$lang_insert_anchor_title}
    {$lang_insert_anchor_name}:
    + +
    +
    + +
    + +
    + +
    +
    + +
    + + diff --git a/e107_handlers/tiny_mce/themes/advanced/charmap.htm b/e107_handlers/tiny_mce/themes/advanced/charmap.htm new file mode 100644 index 000000000..fbd472b19 --- /dev/null +++ b/e107_handlers/tiny_mce/themes/advanced/charmap.htm @@ -0,0 +1,53 @@ + + + {$lang_theme_charmap_title} + + + + + + + + + + + + + + + + + +
    {$lang_theme_charmap_title}
    + + + + + + + + + +
     
     
    +
    + + + + + + + + + + + + + + + + +
    HTML-Code
     
     
    NUM-Code
     
    +
    + + + diff --git a/e107_handlers/tiny_mce/themes/advanced/color_picker.htm b/e107_handlers/tiny_mce/themes/advanced/color_picker.htm new file mode 100644 index 000000000..e5fdc9f5d --- /dev/null +++ b/e107_handlers/tiny_mce/themes/advanced/color_picker.htm @@ -0,0 +1,13 @@ + + + {$lang_theme_colorpicker_title} + + + + + +
    + +
    + + diff --git a/e107_handlers/tiny_mce/themes/advanced/css/editor_content.css b/e107_handlers/tiny_mce/themes/advanced/css/editor_content.css new file mode 100644 index 000000000..5cbe6bbbe --- /dev/null +++ b/e107_handlers/tiny_mce/themes/advanced/css/editor_content.css @@ -0,0 +1,58 @@ +/* This file contains the CSS data for the editable area(iframe) of TinyMCE */ +/* You can extend this CSS by adding your own CSS file with the the content_css option */ + +body, td, pre { + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 10px; +} + +body { + background-color: #FFFFFF; +} + +.mceVisualAid { + border: 1px dashed #BBBBBB !important; +} + +div.mceVisualAid { + background-image:url('../images/spacer.gif'); + visibility: visible !important; +} + +.mceItemAnchor { + width: 12px; + line-height: 6px; + overflow: hidden; + padding-left: 12px; + background-image: url('../images/anchor_symbol.gif'); + background-position: bottom; + background-repeat: no-repeat; +} + +/* Important is needed in Gecko browsers inorder to style links */ +/* +a { + color: green !important; +} +*/ + +/* Style selection range colors in Gecko browsers */ +/* +::-moz-selection { + background-color: red; + color: green; +} +*/ + +/* MSIE specific */ + +* html body { + scrollbar-3dlight-color: #F0F0EE; + scrollbar-arrow-color: #676662; + scrollbar-base-color: #F0F0EE; + scrollbar-darkshadow-color: #DDDDDD; + scrollbar-face-color: #E0E0DD; + scrollbar-highlight-color: #F0F0EE; + scrollbar-shadow-color: #F0F0EE; + scrollbar-track-color: #F5F5F5; +} diff --git a/e107_handlers/tiny_mce/themes/advanced/css/editor_popup.css b/e107_handlers/tiny_mce/themes/advanced/css/editor_popup.css new file mode 100644 index 000000000..de36e719a --- /dev/null +++ b/e107_handlers/tiny_mce/themes/advanced/css/editor_popup.css @@ -0,0 +1,331 @@ +/* This file contains the CSS data for all popups in TinyMCE */ + +body { + background-color: #F0F0EE; + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 11px; + scrollbar-3dlight-color: #F0F0EE; + scrollbar-arrow-color: #676662; + scrollbar-base-color: #F0F0EE; + scrollbar-darkshadow-color: #DDDDDD; + scrollbar-face-color: #E0E0DD; + scrollbar-highlight-color: #F0F0EE; + scrollbar-shadow-color: #F0F0EE; + scrollbar-track-color: #F5F5F5; + margin: 8px; +} + +td { + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 11px; +} + +input { + background: #FFFFFF; + border: 1px solid #cccccc; +} + +td, input, select, textarea { + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 10px; +} + +input, select, textarea { + border: 1px solid #808080; +} + +.input_noborder { + border: 0; +} + +#insert, .updateButton { + font-weight: bold; + width: 90px; + height: 21px; + border: 0; + background-image: url('../images/insert_button_bg.gif'); + cursor: pointer; +} + +#cancel { + font-weight: bold; + width: 90px; + height: 21px; + border: 0; + background-image: url('../images/cancel_button_bg.gif'); + cursor: pointer; +} + +/* Mozilla only style */ +html>body #insert, html>body #cancel { + padding-bottom: 2px; +} + +.title { + font-size: 12px; + font-weight: bold; + color: #2B6FB6; +} + +table.charmap { + border-style: solid; + border-width: 1px; + border-color: #AAAAAA; +} + +td.charmap, td.charmapOver { + color: #000000; + border-color: #AAAAAA; + border-style: solid; + border-width: 1px; + text-align: center; + font-size: 12px; +} + +td.charmapOver { + background-color: #CCCCCC; + cursor: default; +} + +a.charmap { + color: #000000; + text-decoration: none +} + +.wordWrapCode { + vertical-align: middle; + border: 1px none #000000; + background-color: transparent; +} + +input.radio { + border: 1px none #000000; + background-color: transparent; + vertical-align: middle; +} + +input.checkbox { + border: 1px none #000000; + background-color: transparent; + vertical-align: middle; +} + +.mceButtonNormal, .mceButtonOver, .mceButtonDown, .mceSeparator, .mceButtonDisabled, .mceButtonSelected { + margin-left: 1px; +} + +.mceButtonNormal { + border-top: 1px solid; + border-left: 1px solid; + border-bottom: 1px solid; + border-right: 1px solid; + border-color: #F0F0EE; + cursor: default; +} + +.mceButtonOver { + border: 1px solid #0A246A; + cursor: default; + background-color: #B6BDD2; +} + +.mceButtonDown { + cursor: default; + border: 1px solid #0A246A; + background-color: #8592B5; +} + +.mceButtonDisabled { + filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30); + -moz-opacity:0.3; + opacity: 0.3; + border-top: 1px solid; + border-left: 1px solid; + border-bottom: 1px solid; + border-right: 1px solid; + border-color: #F0F0EE; + cursor: default; +} + +.mceActionPanel { + margin-top: 5px; +} + +/* Tabs classes */ + +.tabs { + float: left; + width: 100%; + line-height: normal; + background-image: url("../images/xp/tabs_bg.gif"); +} + +.tabs ul { + margin: 0; + padding: 0 0 0; + list-style: none; +} + +.tabs li { + float: left; + background: url("../images/xp/tab_bg.gif") no-repeat left top; + margin: 0; + margin-left: 0; + margin-right: 2px; + padding: 0 0 0 10px; + line-height: 18px; +} + +.tabs li.current { + background: url("../images/xp/tab_sel_bg.gif") no-repeat left top; + margin-right: 2px; +} + +.tabs span { + float: left; + display: block; + background: url("../images/xp/tab_end.gif") no-repeat right top; + padding: 0px 10px 0 0; +} + +.tabs .current span { + background: url("../images/xp/tab_sel_end.gif") no-repeat right top; +} + +.tabs a { + text-decoration: none; + font-family: Verdana, Arial; + font-size: 10px; +} + +.tabs a:link, .tabs a:visited, .tabs a:hover { + color: black; +} + +.tabs a:hover { +} + +.tabs .current { +} + +.tabs .current a, .tabs .current a:link, .tabs .current a:visited { +} + +.panel_wrapper div.panel { + display: none; +} + +.panel_wrapper div.current { + display: block; + width: 100%; + height: 300px; + overflow: visible; /* Should be auto but that breaks Safari */ +} + +.panel_wrapper { + border: 1px solid #919B9C; + border-top: 0px; + padding: 10px; + padding-top: 5px; + clear: both; + background-color: white; +} + +fieldset { + border: 1px solid #919B9C; + font-family: Verdana, Arial; + font-size: 10px; + padding: 0; + margin: 0; + padding: 4px; +} + +legend { + color: #2B6FB6; + font-weight: bold; +} + +.properties { + width: 100%; +} + +.properties .column1 { +} + +.properties .column2 { + text-align: left; +} + +a:link, a:visited { + color: black; +} + +a:hover { + color: #2B6FB6; +} + +#plugintable thead { + font-weight: bold; + background-color: #DDDDDD; +} + +#plugintable, #about #plugintable td { + border: 1px solid #919B9C; +} + +#plugintable { + width: 99%; + margin-top: 10px; +} + +#pluginscontainer { + height: 290px; + overflow: auto; +} + +/* MSIE Specific styles */ + +* html .panel_wrapper { + width: 100%; +} + +.column { + float: left; +} + +h1, h2, h3, h4 { + color: #2B6FB6; + margin: 0; + padding: 0; + padding-top: 5px; +} + +h3 { + font-size: 14px; +} + +#link .panel_wrapper, #link div.current { + height: 125px; +} + +#image .panel_wrapper, #image div.current { + height: 190px; +} + +label.msg { display: none; } +label.invalid { color: #EE0000; display: inline; } +input.invalid { border: 1px solid #EE0000; } + +/* Disables the advanced tab in the table plugin. */ +/* +#table #advanced_tab { + display: none; +} +*/ + +/* Disables the border input field and label in the table plugin. */ +/* +#table #border, #table #borderlabel { + display: none; +} +*/ diff --git a/e107_handlers/tiny_mce/themes/advanced/css/editor_ui.css b/e107_handlers/tiny_mce/themes/advanced/css/editor_ui.css new file mode 100644 index 000000000..7a809289f --- /dev/null +++ b/e107_handlers/tiny_mce/themes/advanced/css/editor_ui.css @@ -0,0 +1,97 @@ +/* This file contains the CSS data for the editor UI of TinyMCE instances */ + +.mceToolbarTop a, .mceToolbarTop a:visited, .mceToolbarTop a:hover, .mceToolbarBottom a, .mceToolbarBottom a:visited, .mceToolbarBottom a:hover {border: 0; margin: 0; padding: 0; background: transparent;} +.mceSeparatorLine {border: 0; padding: 0; margin-left: 4px; margin-right: 2px;} +.mceSelectList {font-family: 'MS Sans Serif', sans-serif, Verdana, Arial; font-size: 7pt !important; font-weight: normal; margin-top: 3px; padding: 0; display: inline; vertical-align: top; background-color: #F0F0EE;} +.mceLabel, .mceLabelDisabled {font-family: 'MS Sans Serif', sans-serif, Verdana, Arial; font-size: 9pt;} +.mceLabel {color: #000000;} +.mceLabelDisabled {cursor: text; color: #999999;} +.mceEditor {background: #F0F0EE; border: 1px solid #cccccc; padding: 0; margin: 0;} +.mceEditorArea { font-family: 'MS Sans Serif', sans-serif, Verdana, Arial; background: #FFFFFF; padding: 0; margin: 0; } +.mceToolbarTop, .mceToolbarBottom {background: #F0F0EE; line-height: 1px; font-size: 1px;} +.mceToolbarTop {border-bottom: 1px solid #cccccc; padding-bottom: 1px;} +.mceToolbarBottom {border-top: 1px solid #cccccc;} +.mceToolbarContainer {position: relative; left: 0; top: 0; display: block;} +.mceStatusbarTop, .mceStatusbarBottom, .mceStatusbar {height: 20px;} +.mceStatusbarTop .mceStatusbarPathText, .mceStatusbarBottom .mceStatusbarPathText, .mceStatusbar .mceStatusbarPathText {font-family: 'MS Sans Serif', sans-serif, Verdana, Arial; font-size: 9pt; padding: 2px; line-height: 16px; overflow: visible;} +.mceStatusbarTop {border-bottom: 1px solid #cccccc;} +.mceStatusbarBottom {border-top: 1px solid #cccccc;} +.mceStatusbar {border-bottom: 1px solid #cccccc;} +.mcePathItem, .mcePathItem:link, .mcePathItem:visited, .mcePathItem:hover {text-decoration: none; font-family: 'MS Sans Serif', sans-serif, Verdana, Arial; font-size: 9pt; color: #000000;} +.mcePathItem:hover {text-decoration: underline;} +.mceStatusbarPathText {float: left;} +.mceStatusbarResize {float: right; background-image: url('../images/statusbar_resize.gif'); background-repeat: no-repeat; width: 11px; height: 20px; cursor: se-resize;} +.mceResizeBox {width: 10px; height: 10px; display: none; border: 1px dotted gray; margin: 0; padding: 0;} +.mceEditorIframe {border: 0;} + +/* Button CSS rules */ + +a.mceButtonDisabled img, a.mceButtonNormal img, a.mceButtonSelected img {width: 20px; height: 20px; cursor: default; margin-top: 1px; margin-left: 1px;} +a.mceButtonDisabled img {border: 0 !important;} +a.mceButtonNormal img, a.mceButtonSelected img {border: 1px solid #F0F0EE !important;} +a.mceButtonSelected img {border: 1px solid #6779AA !important; background-color: #D4D5D8;} +a.mceButtonNormal img:hover, a.mceButtonSelected img:hover {border: 1px solid #0A246A !important; cursor: default; background-color: #B6BDD2;} +a.mceButtonDisabled img {-moz-opacity:0.3; opacity: 0.3; border: 1px solid #F0F0EE !important; cursor: default;} +a.mceTiledButton img {background-image: url('../images/buttons.gif'); background-repeat: no-repeat;} + +/* Menu button CSS rules */ + +span.mceMenuButton img, span.mceMenuButtonSelected img {border: 1px solid #F0F0EE; margin-left: 1px;} +span.mceMenuButtonSelected img {border: 1px solid #6779AA; background-color: #B6BDD2;} +span.mceMenuButtonSelected img.mceMenuButton {border: 1px solid #F0F0EE; background-color: transparent;} +span.mceMenuButton img.mceMenuButton, span.mceMenuButtonSelected img.mceMenuButton {border-left: 0; margin-left: 0;} +span.mceMenuButton:hover img, span.mceMenuButtonSelected:hover img {border: 1px solid #0A246A; background-color: #B6BDD2;} +span.mceMenuButton:hover img.mceMenuButton, span.mceMenuButtonSelected:hover img.mceMenuButton {border-left: 0;} +span.mceMenuButtonFocus img {border: 1px solid gray; border-right: 0; margin-left: 1px; background-color: #F5F4F2;} +span.mceMenuButtonFocus img.mceMenuButton {border: 1px solid gray; border-left: 1px solid #F5F4F2; margin-left: 0;} +span.mceMenuHover img {border: 1px solid #0A246A; background-color: #B6BDD2;} +span.mceMenuButtonSelected.mceMenuHover img.mceMenuButton {border: 1px solid #0A246A; background-color: #B6BDD2; border-left: 0;} + +/* Menu */ + +.mceMenu {position: absolute; left: 0; top: 0; display: none; z-index: 100; background-color: white; border: 1px solid gray; font-weight: normal;} +.mceMenu a, .mceMenuTitle, .mceMenuDisabled {display: block; width: 100%; text-decoration: none; background-color: white; font-family: Tahoma, Verdana, Arial, Helvetica; font-size: 11px; line-height: 20px; color: black;} +.mceMenu a:hover {background-color: #B6BDD2; color: black; text-decoration: none !important;} +.mceMenu span {padding-left: 10px; padding-right: 10px; display: block; line-height: 20px;} +.mceMenuSeparator {border-bottom: 1px solid gray; background-color: gray; height: 1px;} +.mceMenuTitle span {padding-left: 5px;} +.mceMenuTitle {background-color: #DDDDDD; font-weight: bold;} +.mceMenuDisabled {color: gray;} +span.mceMenuSelectedItem {background-image: url('../images/menu_check.gif'); background-repeat: no-repeat; background-position: 5px 8px; padding-left: 20px;} +span.mceMenuCheckItem {padding-left: 20px;} +span.mceMenuLine {display: block; position: absolute; left: 0; top: -1px; background-color: #F5F4F2; width: 30px; height: 1px; overflow: hidden; padding-left: 0; padding-right: 0;} +.mceColors table, .mceColors td {margin: 0; padding: 2px;} +a.mceMoreColors {width: 130px; margin: 0; padding: 0; margin-left: 3px; margin-bottom: 3px; text-align: center; border: 1px solid white;} +.mceColorPreview {position: absolute; left: 0; top: 0; margin-left: 3px; margin-top: 15px; width: 16px; height: 4px; background-color: red;} +a.mceMoreColors:hover {border: 1px solid #0A246A;} +.mceColors td a {width: 9px; height: 9px; overflow: hidden; border: 1px solid #808080;} + +/* MSIE 6 specific rules */ + +* html a.mceButtonNormal img, * html a.mceButtonSelected img, * html a.mceButtonDisabled img {border: 0 !important; margin-top: 2px; margin-bottom: 1px;} +* html a.mceButtonDisabled img {filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30); border: 0 !important;} +* html a.mceButtonDisabled {border: 1px solid #F0F0EE !important;} +* html a.mceButtonNormal, * html a.mceButtonSelected {border: 1px solid #F0F0EE !important; cursor: default;} +* html a.mceButtonSelected {border: 1px solid #6779AA !important; background-color: #D4D5D8;} +* html a.mceButtonNormal:hover, * html a.mceButtonSelected:hover {border: 1px solid #0A246A !important; background-color: #B6BDD2; cursor: default;} +* html .mceSelectList {margin-top: 2px;} +* html span.mceMenuButton, * html span.mceMenuButtonFocus {position: relative; left: 0; top: 0;} +* html span.mceMenuButton img, * html span.mceMenuButtonSelected img, * html span.mceMenuButtonFocus img {position: relative; top: 1px;} +* html a.mceMoreColors {width: 132px;} +* html .mceColors td a {width: 10px; height: 10px;} +* html .mceColorPreview {margin-left: 2px; margin-top: 14px;} + +/* MSIE 7 specific rules */ + +*:first-child+html a.mceButtonNormal img, *:first-child+html a.mceButtonSelected img, *:first-child+html a.mceButtonDisabled img {border: 0 !important; margin-top: 2px; margin-bottom: 1px;} +*:first-child+html a.mceButtonDisabled img {filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30); border: 0 !important;} +*:first-child+html a.mceButtonDisabled {border: 1px solid #F0F0EE !important;} +*:first-child+html a.mceButtonNormal, *:first-child+html a.mceButtonSelected {border: 1px solid #F0F0EE !important; cursor: default;} +*:first-child+html a.mceButtonSelected {border: 1px solid #6779AA !important; background-color: #D4D5D8;} +*:first-child+html a.mceButtonNormal:hover, *:first-child+html a.mceButtonSelected:hover {border: 1px solid #0A246A !important; background-color: #B6BDD2; cursor: default;} +*:first-child+html .mceSelectList {margin-top: 2px;} +*:first-child+html span.mceMenuButton, *:first-child+html span.mceMenuButtonFocus {position: relative; left: 0; top: 0;} +*:first-child+html span.mceMenuButton img, *:first-child+html span.mceMenuButtonSelected img, *:first-child+html span.mceMenuButtonFocus img {position: relative; top: 1px;} +*:first-child+html a.mceMoreColors {width: 132px;} +*:first-child+html .mceColors td a {width: 10px; height: 10px;} +*:first-child+html .mceColorPreview {margin: 0; padding-left: 4px; margin-top: 14px; width: 14px;} diff --git a/e107_handlers/tiny_mce/themes/advanced/editor_content.css b/e107_handlers/tiny_mce/themes/advanced/editor_content.css new file mode 100644 index 000000000..ac7e5a7ae --- /dev/null +++ b/e107_handlers/tiny_mce/themes/advanced/editor_content.css @@ -0,0 +1,27 @@ +body { + background-color: #FFFFFF; + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 10px; + scrollbar-3dlight-color: #F0F0EE; + scrollbar-arrow-color: #676662; + scrollbar-base-color: #F0F0EE; + scrollbar-darkshadow-color: #DDDDDD; + scrollbar-face-color: #E0E0DD; + scrollbar-highlight-color: #F0F0EE; + scrollbar-shadow-color: #F0F0EE; + scrollbar-track-color: #F5F5F5; +} + +td { + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 10px; +} + +pre { + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 10px; +} + +.mceVisualAid { + border: 1px dashed #BBBBBB; +} diff --git a/e107_handlers/tiny_mce/themes/advanced/editor_popup.css b/e107_handlers/tiny_mce/themes/advanced/editor_popup.css new file mode 100644 index 000000000..7deb40a92 --- /dev/null +++ b/e107_handlers/tiny_mce/themes/advanced/editor_popup.css @@ -0,0 +1,121 @@ +body { + background-color: #F0F0EE; + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 11px; + scrollbar-3dlight-color: #F0F0EE; + scrollbar-arrow-color: #676662; + scrollbar-base-color: #F0F0EE; + scrollbar-darkshadow-color: #DDDDDD; + scrollbar-face-color: #E0E0DD; + scrollbar-highlight-color: #F0F0EE; + scrollbar-shadow-color: #F0F0EE; + scrollbar-track-color: #F5F5F5; +} + +td { + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 11px; +} + +input { + background: #FFFFFF; + border: 1px solid #cccccc; +} + +td, input, select, textarea { + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 10px; +} + +input, select, textarea { + border: 1px solid #808080; +} + +.input_noborder { + border: 0px solid #808080; +} + +#insert { + font-weight: bold; +} + +#cancel { + font-weight: bold; +} + +.title { + font-size: 12px; + font-weight: bold; +} + +table.charmap { + border-style: solid; + border-width: 1px; + border-color: #AAAAAA; +} + +td.charmap, td.charmapOver { + color: #000000; + border-color: #AAAAAA; + border-style: solid; + border-width: 1px; + text-align: center; + font-size: 12px; +} + +td.charmapOver { + background-color: #CCCCCC; + cursor: arrow; +} + +a.charmap { + color: #000000; + text-decoration: none +} + +.wordWrapCode { + vertical-align: middle; + border: 1px none #000000; + background-color: transparent; +} + +input.radio { + border: 1px none #000000; + background-color: transparent; + vertical-align: middle; +} + +input.checkbox { + border: 1px none #000000; + background-color: transparent; + vertical-align: middle; +} + +.mceButtonNormal, .mceButtonOver, .mceButtonDown, .mceSeparator, .mceButtonDisabled, .mceButtonSelected { + margin-left: 1px; +} + +.mceButtonNormal { + border-top: 1px solid; + border-left: 1px solid; + border-bottom: 1px solid; + border-right: 1px solid; + border-color: #F0F0EE; + cursor: arrow; +} + +.mceButtonOver { + border: 1px solid #0A246A; + cursor: arrow; + background-color: #B6BDD2; +} + +.mceButtonDown { + cursor: arrow; + border: 1px solid #0A246A; + background-color: #8592B5; +} + +legend { + font-weight: bold; +} diff --git a/e107_handlers/tiny_mce/themes/advanced/editor_template.js b/e107_handlers/tiny_mce/themes/advanced/editor_template.js new file mode 100644 index 000000000..24277e61d --- /dev/null +++ b/e107_handlers/tiny_mce/themes/advanced/editor_template.js @@ -0,0 +1 @@ +tinyMCE.importThemeLanguagePack('advanced');var TinyMCE_AdvancedTheme={_defColors:"000000,993300,333300,003300,003366,000080,333399,333333,800000,FF6600,808000,008000,008080,0000FF,666699,808080,FF0000,FF9900,99CC00,339966,33CCCC,3366FF,800080,999999,FF00FF,FFCC00,FFFF00,00FF00,00FFFF,00CCFF,993366,C0C0C0,FF99CC,FFCC99,FFFF99,CCFFCC,CCFFFF,99CCFF,CC99FF,FFFFFF",_autoImportCSSClasses:true,_resizer:{},_buttons:[['bold','{$lang_bold_img}','lang_bold_desc','Bold'],['italic','{$lang_italic_img}','lang_italic_desc','Italic'],['underline','{$lang_underline_img}','lang_underline_desc','Underline'],['strikethrough','strikethrough.gif','lang_striketrough_desc','Strikethrough'],['justifyleft','justifyleft.gif','lang_justifyleft_desc','JustifyLeft'],['justifycenter','justifycenter.gif','lang_justifycenter_desc','JustifyCenter'],['justifyright','justifyright.gif','lang_justifyright_desc','JustifyRight'],['justifyfull','justifyfull.gif','lang_justifyfull_desc','JustifyFull'],['bullist','bullist.gif','lang_bullist_desc','InsertUnorderedList'],['numlist','numlist.gif','lang_numlist_desc','InsertOrderedList'],['outdent','outdent.gif','lang_outdent_desc','Outdent'],['indent','indent.gif','lang_indent_desc','Indent'],['cut','cut.gif','lang_cut_desc','Cut'],['copy','copy.gif','lang_copy_desc','Copy'],['paste','paste.gif','lang_paste_desc','Paste'],['undo','undo.gif','lang_undo_desc','Undo'],['redo','redo.gif','lang_redo_desc','Redo'],['link','link.gif','lang_link_desc','mceLink',true],['unlink','unlink.gif','lang_unlink_desc','unlink'],['image','image.gif','lang_image_desc','mceImage',true],['cleanup','cleanup.gif','lang_cleanup_desc','mceCleanup'],['help','help.gif','lang_help_desc','mceHelp'],['code','code.gif','lang_theme_code_desc','mceCodeEditor'],['hr','hr.gif','lang_theme_hr_desc','inserthorizontalrule'],['removeformat','removeformat.gif','lang_theme_removeformat_desc','removeformat'],['sub','sub.gif','lang_theme_sub_desc','subscript'],['sup','sup.gif','lang_theme_sup_desc','superscript'],['forecolor','forecolor.gif','lang_theme_forecolor_desc','forecolor',true],['backcolor','backcolor.gif','lang_theme_backcolor_desc','HiliteColor',true],['charmap','charmap.gif','lang_theme_charmap_desc','mceCharMap'],['visualaid','visualaid.gif','lang_theme_visualaid_desc','mceToggleVisualAid'],['anchor','anchor.gif','lang_theme_anchor_desc','mceInsertAnchor'],['newdocument','newdocument.gif','lang_newdocument_desc','mceNewDocument']],_buttonMap:'anchor,backcolor,bold,bullist,charmap,cleanup,code,copy,cut,forecolor,help,hr,image,indent,italic,justifycenter,justifyfull,justifyleft,justifyright,link,newdocument,numlist,outdent,paste,redo,removeformat,strikethrough,sub,sup,underline,undo,unlink,visualaid,advhr,ltr,rtl,emotions,flash,fullpage,fullscreen,iespell,insertdate,inserttime,pastetext,pasteword,selectall,preview,print,save,replace,search,table,cell_props,delete_col,delete_row,col_after,col_before,row_after,row_before,merge_cells,row_props,split_cells,delete_table',getControlHTML:function(button_name){var i,x,but;for(i=0;i4?but[4]:false),(but.length>5?but[5]:null));if(but[0]==button_name)return tinyMCE.getButtonHTML(but[0],but[2],'{$themeurl}/images/'+but[1],but[3],(but.length>4?but[4]:false),(but.length>5?but[5]:null))}switch(button_name){case"formatselect":var html='';return html;case"styleselect":return'';case"fontselect":var fontHTML='';return fontHTML;case"fontsizeselect":return'';case"|":case"separator":return'';case"spacer":return'';case"rowseparator":return'
    '}return""},execCommand:function(editor_id,element,command,user_interface,value){switch(command){case'mceHelp':tinyMCE.openWindow({file:'about.htm',width:480,height:380},{tinymce_version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion,tinymce_releasedate:tinyMCE.releaseDate,inline:"yes"});return true;case"mceLink":var inst=tinyMCE.getInstanceById(editor_id);var doc=inst.getDoc();var selectedText="";if(tinyMCE.isMSIE){var rng=doc.selection.createRange();selectedText=rng.text}else selectedText=inst.getSel().toString();if(!tinyMCE.linkElement){if((tinyMCE.selectedElement.nodeName.toLowerCase()!="img")&&(selectedText.length<=0))return true}var href="",target="",title="",onclick="",action="insert",style_class="";if(tinyMCE.selectedElement.nodeName.toLowerCase()=="a")tinyMCE.linkElement=tinyMCE.selectedElement;if(tinyMCE.linkElement!=null&&tinyMCE.getAttrib(tinyMCE.linkElement,'href')=="")tinyMCE.linkElement=null;if(tinyMCE.linkElement){href=tinyMCE.getAttrib(tinyMCE.linkElement,'href');target=tinyMCE.getAttrib(tinyMCE.linkElement,'target');title=tinyMCE.getAttrib(tinyMCE.linkElement,'title');onclick=tinyMCE.getAttrib(tinyMCE.linkElement,'onclick');style_class=tinyMCE.getAttrib(tinyMCE.linkElement,'class');if(onclick=="")onclick=tinyMCE.getAttrib(tinyMCE.linkElement,'onclick');onclick=tinyMCE.cleanupEventStr(onclick);href=eval(tinyMCE.settings['urlconverter_callback']+"(href, tinyMCE.linkElement, true);");mceRealHref=tinyMCE.getAttrib(tinyMCE.linkElement,'mce_href');if(mceRealHref!=""){href=mceRealHref;if(tinyMCE.getParam('convert_urls'))href=eval(tinyMCE.settings['urlconverter_callback']+"(href, tinyMCE.linkElement, true);")}action="update"}var template=new Array();template['file']='link.htm';template['width']=310;template['height']=200;template['width']+=tinyMCE.getLang('lang_insert_link_delta_width',0);template['height']+=tinyMCE.getLang('lang_insert_link_delta_height',0);if(inst.settings['insertlink_callback']){var returnVal=eval(inst.settings['insertlink_callback']+"(href, target, title, onclick, action, style_class);");if(returnVal&&returnVal['href'])TinyMCE_AdvancedTheme._insertLink(returnVal['href'],returnVal['target'],returnVal['title'],returnVal['onclick'],returnVal['style_class'])}else{tinyMCE.openWindow(template,{href:href,target:target,title:title,onclick:onclick,action:action,className:style_class,inline:"yes"})}return true;case"mceImage":var src="",alt="",border="",hspace="",vspace="",width="",height="",align="";var title="",onmouseover="",onmouseout="",action="insert";var img=tinyMCE.imgElement;var inst=tinyMCE.getInstanceById(editor_id);if(tinyMCE.selectedElement!=null&&tinyMCE.selectedElement.nodeName.toLowerCase()=="img"){img=tinyMCE.selectedElement;tinyMCE.imgElement=img}if(img){if(tinyMCE.getAttrib(img,'name').indexOf('mce_')==0)return true;src=tinyMCE.getAttrib(img,'src');alt=tinyMCE.getAttrib(img,'alt');if(alt=="")alt=tinyMCE.getAttrib(img,'title');if(tinyMCE.isGecko){var w=img.style.width;if(w!=null&&w!="")img.setAttribute("width",w);var h=img.style.height;if(h!=null&&h!="")img.setAttribute("height",h)}border=tinyMCE.getAttrib(img,'border');hspace=tinyMCE.getAttrib(img,'hspace');vspace=tinyMCE.getAttrib(img,'vspace');width=tinyMCE.getAttrib(img,'width');height=tinyMCE.getAttrib(img,'height');align=tinyMCE.getAttrib(img,'align');onmouseover=tinyMCE.getAttrib(img,'onmouseover');onmouseout=tinyMCE.getAttrib(img,'onmouseout');title=tinyMCE.getAttrib(img,'title');if(tinyMCE.isMSIE){width=img.attributes['width'].specified?width:"";height=img.attributes['height'].specified?height:""}src=eval(tinyMCE.settings['urlconverter_callback']+"(src, img, true);");mceRealSrc=tinyMCE.getAttrib(img,'mce_src');if(mceRealSrc!=""){src=mceRealSrc;if(tinyMCE.getParam('convert_urls'))src=eval(tinyMCE.settings['urlconverter_callback']+"(src, img, true);")}action="update"}var template=new Array();template['file']='image.htm?src={$src}';template['width']=355;template['height']=265+(tinyMCE.isMSIE?25:0);template['width']+=tinyMCE.getLang('lang_insert_image_delta_width',0);template['height']+=tinyMCE.getLang('lang_insert_image_delta_height',0);if(inst.settings['insertimage_callback']){var returnVal=eval(inst.settings['insertimage_callback']+"(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout, action);");if(returnVal&&returnVal['src'])TinyMCE_AdvancedTheme._insertImage(returnVal['src'],returnVal['alt'],returnVal['border'],returnVal['hspace'],returnVal['vspace'],returnVal['width'],returnVal['height'],returnVal['align'],returnVal['title'],returnVal['onmouseover'],returnVal['onmouseout'])}else tinyMCE.openWindow(template,{src:src,alt:alt,border:border,hspace:hspace,vspace:vspace,width:width,height:height,align:align,title:title,onmouseover:onmouseover,onmouseout:onmouseout,action:action,inline:"yes"});return true;case"forecolor":var fcp=new TinyMCE_Layer(editor_id+'_fcPreview',false),p,img,elm;TinyMCE_AdvancedTheme._hideMenus(editor_id);if(!fcp.exists()){fcp.create('div','mceColorPreview',document.getElementById(editor_id+'_toolbar'));elm=fcp.getElement();elm._editor_id=editor_id;elm._command="forecolor";elm._switchId=editor_id+"_forecolor";tinyMCE.addEvent(elm,'click',TinyMCE_AdvancedTheme._handleMenuEvent);tinyMCE.addEvent(elm,'mouseover',TinyMCE_AdvancedTheme._handleMenuEvent);tinyMCE.addEvent(elm,'mouseout',TinyMCE_AdvancedTheme._handleMenuEvent)}img=tinyMCE.selectNodes(document.getElementById(editor_id+"_forecolor"),function(n){return n.nodeName=="IMG"})[0];p=tinyMCE.getAbsPosition(img,document.getElementById(editor_id+'_toolbar'));fcp.moveTo(p.absLeft,p.absTop);fcp.getElement().style.backgroundColor=value!=null?value:tinyMCE.getInstanceById(editor_id).foreColor;fcp.show();return false;case"forecolorMenu":TinyMCE_AdvancedTheme._hideMenus(editor_id);var ml=new TinyMCE_Layer(editor_id+'_fcMenu');if(!ml.exists())ml.create('div','mceMenu',document.body,TinyMCE_AdvancedTheme._getColorHTML(editor_id,'theme_advanced_text_colors','forecolor'));tinyMCE.switchClass(editor_id+'_forecolor','mceMenuButtonFocus');ml.moveRelativeTo(document.getElementById(editor_id+"_forecolor"),'bl');ml.moveBy(tinyMCE.isMSIE&&!tinyMCE.isOpera?-1:1,-1);if(tinyMCE.isOpera)ml.moveBy(0,-2);ml.show();return true;case"HiliteColor":var bcp=new TinyMCE_Layer(editor_id+'_bcPreview',false),p,img;TinyMCE_AdvancedTheme._hideMenus(editor_id);if(!bcp.exists()){bcp.create('div','mceColorPreview',document.getElementById(editor_id+'_toolbar'));elm=bcp.getElement();elm._editor_id=editor_id;elm._command="HiliteColor";elm._switchId=editor_id+"_backcolor";tinyMCE.addEvent(elm,'click',TinyMCE_AdvancedTheme._handleMenuEvent);tinyMCE.addEvent(elm,'mouseover',TinyMCE_AdvancedTheme._handleMenuEvent);tinyMCE.addEvent(elm,'mouseout',TinyMCE_AdvancedTheme._handleMenuEvent)}img=tinyMCE.selectNodes(document.getElementById(editor_id+"_backcolor"),function(n){return n.nodeName=="IMG"})[0];p=tinyMCE.getAbsPosition(img,document.getElementById(editor_id+'_toolbar'));bcp.moveTo(p.absLeft,p.absTop);bcp.getElement().style.backgroundColor=value!=null?value:tinyMCE.getInstanceById(editor_id).backColor;bcp.show();return false;case"HiliteColorMenu":TinyMCE_AdvancedTheme._hideMenus(editor_id);var ml=new TinyMCE_Layer(editor_id+'_bcMenu');if(!ml.exists())ml.create('div','mceMenu',document.body,TinyMCE_AdvancedTheme._getColorHTML(editor_id,'theme_advanced_background_colors','HiliteColor'));tinyMCE.switchClass(editor_id+'_backcolor','mceMenuButtonFocus');ml.moveRelativeTo(document.getElementById(editor_id+"_backcolor"),'bl');ml.moveBy(tinyMCE.isMSIE&&!tinyMCE.isOpera?-1:1,-1);if(tinyMCE.isOpera)ml.moveBy(0,-2);ml.show();return true;case"mceColorPicker":if(user_interface){var template=new Array();var inputColor=value['document'].getElementById(value['element_id']).value;template['file']='color_picker.htm';template['width']=220;template['height']=190;template['close_previous']="no";template['width']+=tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_width',0);template['height']+=tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_height',0);if(typeof(value['store_selection'])=="undefined")value['store_selection']=true;tinyMCE.lastColorPickerValue=value;tinyMCE.openWindow(template,{editor_id:editor_id,mce_store_selection:value['store_selection'],inline:"yes",command:"mceColorPicker",input_color:inputColor})}else{var savedVal=tinyMCE.lastColorPickerValue;var elm=savedVal['document'].getElementById(savedVal['element_id']);elm.value=value;if(elm.onchange!=null&&elm.onchange!='')eval('elm.onchange();')}return true;case"mceCodeEditor":var template=new Array();template['file']='source_editor.htm';template['width']=parseInt(tinyMCE.getParam("theme_advanced_source_editor_width",720));template['height']=parseInt(tinyMCE.getParam("theme_advanced_source_editor_height",580));tinyMCE.openWindow(template,{editor_id:editor_id,resizable:"yes",scrollbars:"no",inline:"yes"});return true;case"mceCharMap":var template=new Array();template['file']='charmap.htm';template['width']=550+(tinyMCE.isOpera?40:0);template['height']=250;template['width']+=tinyMCE.getLang('lang_theme_advanced_charmap_delta_width',0);template['height']+=tinyMCE.getLang('lang_theme_advanced_charmap_delta_height',0);tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes"});return true;case"mceInsertAnchor":var template=new Array();template['file']='anchor.htm';template['width']=320;template['height']=90+(tinyMCE.isNS7?30:0);template['width']+=tinyMCE.getLang('lang_theme_advanced_anchor_delta_width',0);template['height']+=tinyMCE.getLang('lang_theme_advanced_anchor_delta_height',0);tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes"});return true;case"mceNewDocument":if(confirm(tinyMCE.getLang('lang_newdocument')))tinyMCE.execInstanceCommand(editor_id,'mceSetContent',false,' ');return true}return false},getEditorTemplate:function(settings,editorId){function removeFromArray(in_array,remove_array){var outArray=new Array(),skip;for(var i=0;i 

    ';var layoutManager=tinyMCE.getParam("theme_advanced_layout_manager","SimpleLayout");var styleSelectHTML='';if(settings['theme_advanced_styles']){var stylesAr=settings['theme_advanced_styles'].split(';');for(var i=0;i'+key+''}TinyMCE_AdvancedTheme._autoImportCSSClasses=false}switch(layoutManager){case"SimpleLayout":var toolbarHTML="";var toolbarLocation=tinyMCE.getParam("theme_advanced_toolbar_location","bottom");var toolbarAlign=tinyMCE.getParam("theme_advanced_toolbar_align","center");var pathLocation=tinyMCE.getParam("theme_advanced_path_location","none");var statusbarLocation=tinyMCE.getParam("theme_advanced_statusbar_location",pathLocation);var defVals={theme_advanced_buttons1:"bold,italic,underline,strikethrough,separator,justifyleft,justifycenter,justifyright,justifyfull,separator,styleselect,formatselect",theme_advanced_buttons2:"bullist,numlist,separator,outdent,indent,separator,undo,redo,separator,link,unlink,anchor,image,cleanup,help,code",theme_advanced_buttons3:"hr,removeformat,visualaid,separator,sub,sup,separator,charmap"};toolbarHTML+='0){toolbarHTML+="
    ";deltaHeight-=23}}toolbarHTML+='
    ';template['html']='';if(toolbarLocation=="top"){template['html']+=''}if(statusbarLocation=="top"){template['html']+='';deltaHeight-=23}template['html']+='';if(toolbarLocation=="bottom"){template['html']+=''}if(toolbarLocation=="external"){var bod=document.body;var elm=document.createElement("div");toolbarHTML=tinyMCE.replaceVar(toolbarHTML,'style_select_options',styleSelectHTML);toolbarHTML=tinyMCE.applyTemplate(toolbarHTML,{editor_id:editorId});elm.className="mceToolbarExternal";elm.id=editorId+"_toolbar";elm.innerHTML='
    '+toolbarHTML+'
    '+statusbarHTML+'
    '+toolbarHTML+'
    '+toolbarHTML+'
    ';bod.appendChild(elm);deltaHeight=0;tinyMCE.getInstanceById(editorId).toolbarElement=elm;}else{tinyMCE.getInstanceById(editorId).toolbarElement=null}if(statusbarLocation=="bottom"){template['html']+=''+statusbarHTML+'';deltaHeight-=23}template['html']+='';break;case"RowLayout":template['html']='';var containers=tinyMCE.getParam("theme_advanced_containers","",true,",");var defaultContainerCSS=tinyMCE.getParam("theme_advanced_containers_default_class","container");var defaultContainerAlign=tinyMCE.getParam("theme_advanced_containers_default_align","center");for(var i=0;i';else if(containers[i]=="mceElementpath"||containers[i]=="mceStatusbar"){var pathClass="mceStatusbar";if(i==containers.length-1){pathClass="mceStatusbarBottom"}else if(i==0){pathClass="mceStatusbar"}else{deltaHeight-=2}template['html']+='';deltaHeight-=22}else{var curContainer=tinyMCE.getParam("theme_advanced_container_"+containers[i],"",true,',');var curContainerHTML="";var curAlign=tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_align",defaultContainerAlign);var curCSS=tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_class",defaultContainerCSS);curContainer=removeFromArray(curContainer,tinyMCE.getParam("theme_advanced_disable","",true,','));for(var j=0;j0){curContainerHTML+="
    ";deltaHeight-=23}template['html']+='
    '}}template['html']+='
    '+statusbarHTML+'
    '+curContainerHTML+'
    ';break;case"CustomLayout":var customLayout=tinyMCE.getParam("theme_advanced_custom_layout","");if(customLayout!=""&&eval("typeof("+customLayout+")")!="undefined"){template=eval(customLayout+"(template);")}break}if(resizing)template['html']+='';template['html']=tinyMCE.replaceVar(template['html'],'style_select_options',styleSelectHTML);template['delta_width']=0;template['delta_height']=deltaHeight;return template},initInstance:function(inst){if(tinyMCE.getParam("theme_advanced_resizing",false)){if(tinyMCE.getParam("theme_advanced_resizing_use_cookie",true)){var w=TinyMCE_AdvancedTheme._getCookie("TinyMCE_"+inst.editorId+"_width");var h=TinyMCE_AdvancedTheme._getCookie("TinyMCE_"+inst.editorId+"_height");TinyMCE_AdvancedTheme._resizeTo(inst,w,h,tinyMCE.getParam("theme_advanced_resize_horizontal",true))}}inst.addShortcut('ctrl','k','lang_link_desc','mceLink')},_handleMenuEvent:function(e){var te=tinyMCE.isMSIE?window.event.srcElement:e.target;tinyMCE._menuButtonEvent(e.type=="mouseover"?"over":"out",document.getElementById(te._switchId));if(e.type=="click")tinyMCE.execInstanceCommand(te._editor_id,te._command)},_hideMenus:function(id){var fcml=new TinyMCE_Layer(id+'_fcMenu'),bcml=new TinyMCE_Layer(id+'_bcMenu');if(fcml.exists()&&fcml.isVisible()){tinyMCE.switchClass(id+'_forecolor','mceMenuButton');fcml.hide()}if(bcml.exists()&&bcml.isVisible()){tinyMCE.switchClass(id+'_backcolor','mceMenuButton');bcml.hide()}},handleNodeChange:function(editor_id,node,undo_index,undo_levels,visual_aid,any_selection,setup_content){var alignNode,breakOut,classNode;function selectByValue(select_elm,value,first_index){first_index=typeof(first_index)=="undefined"?false:true;if(select_elm){for(var i=0;i=0;i--){var nodeName=path[i].nodeName.toLowerCase();var nodeData="";if(nodeName.indexOf("html:")==0)nodeName=nodeName.substring(5);if(nodeName=="b"){nodeName="strong"}if(nodeName=="i"){nodeName="em"}if(nodeName=="span"){var cn=tinyMCE.getAttrib(path[i],"class");if(cn!=""&&cn.indexOf('mceItem')==-1)nodeData+="class: "+cn+" ";var st=tinyMCE.getAttrib(path[i],"style");if(st!=""){st=tinyMCE.serializeStyle(tinyMCE.parseStyle(st));nodeData+="style: "+st+" "}}if(nodeName=="font"){if(tinyMCE.getParam("convert_fonts_to_spans"))nodeName="span";var face=tinyMCE.getAttrib(path[i],"face");if(face!="")nodeData+="font: "+face+" ";var size=tinyMCE.getAttrib(path[i],"size");if(size!="")nodeData+="size: "+size+" ";var color=tinyMCE.getAttrib(path[i],"color");if(color!="")nodeData+="color: "+color+" "}if(getAttrib(path[i],'id')!=""){nodeData+="id: "+path[i].getAttribute('id')+" "}var className=tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i],"class"),false);if(className!=""&&className.indexOf('mceItem')==-1)nodeData+="class: "+className+" ";if(getAttrib(path[i],'src')!=""){var src=tinyMCE.getAttrib(path[i],"mce_src");if(src=="")src=tinyMCE.getAttrib(path[i],"src");nodeData+="src: "+src+" "}if(path[i].nodeName=='A'&&getAttrib(path[i],'href')!=""){var href=tinyMCE.getAttrib(path[i],"mce_href");if(href=="")href=tinyMCE.getAttrib(path[i],"href");nodeData+="href: "+href+" "}className=tinyMCE.getAttrib(path[i],"class");if((nodeName=="img"||nodeName=="span")&&className.indexOf('mceItem')!=-1){nodeName=className.replace(/mceItem([a-z]+)/gi,'$1').toLowerCase();nodeData=path[i].getAttribute('title')}if(nodeName=="a"&&(anchor=tinyMCE.getAttrib(path[i],"name"))!=""){nodeName="a";nodeName+="#"+anchor;nodeData=""}if(getAttrib(path[i],'name').indexOf("mce_")!=0){var className=tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i],"class"),false);if(className!=""&&className.indexOf('mceItem')==-1){nodeName+="."+className}}var cmd='tinyMCE.execInstanceCommand(\''+editor_id+'\',\'mceSelectNodeDepth\',false,\''+i+'\');';html+=''+nodeName+'';if(i>0){html+=" » "}}pathElm.innerHTML=''+tinyMCE.getLang('lang_theme_path')+": "+html+' '}tinyMCE.switchClass(editor_id+'_justifyleft','mceButtonNormal');tinyMCE.switchClass(editor_id+'_justifyright','mceButtonNormal');tinyMCE.switchClass(editor_id+'_justifycenter','mceButtonNormal');tinyMCE.switchClass(editor_id+'_justifyfull','mceButtonNormal');tinyMCE.switchClass(editor_id+'_bold','mceButtonNormal');tinyMCE.switchClass(editor_id+'_italic','mceButtonNormal');tinyMCE.switchClass(editor_id+'_underline','mceButtonNormal');tinyMCE.switchClass(editor_id+'_strikethrough','mceButtonNormal');tinyMCE.switchClass(editor_id+'_bullist','mceButtonNormal');tinyMCE.switchClass(editor_id+'_numlist','mceButtonNormal');tinyMCE.switchClass(editor_id+'_sub','mceButtonNormal');tinyMCE.switchClass(editor_id+'_sup','mceButtonNormal');tinyMCE.switchClass(editor_id+'_anchor','mceButtonNormal');tinyMCE.switchClass(editor_id+'_link','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_unlink','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_outdent','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_image','mceButtonNormal');tinyMCE.switchClass(editor_id+'_hr','mceButtonNormal');if(node.nodeName=="A"&&tinyMCE.getAttrib(node,"class").indexOf('mceItemAnchor')!=-1)tinyMCE.switchClass(editor_id+'_anchor','mceButtonSelected');var anchorLink=tinyMCE.getParentElement(node,"a","href");if(anchorLink||any_selection){tinyMCE.switchClass(editor_id+'_link',anchorLink?'mceButtonSelected':'mceButtonNormal');tinyMCE.switchClass(editor_id+'_unlink',anchorLink?'mceButtonSelected':'mceButtonNormal')}tinyMCE.switchClass(editor_id+'_visualaid',visual_aid?'mceButtonSelected':'mceButtonNormal');if(undo_levels!=-1){tinyMCE.switchClass(editor_id+'_undo','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_redo','mceButtonDisabled')}if(tinyMCE.getParentElement(node,"li,blockquote"))tinyMCE.switchClass(editor_id+'_outdent','mceButtonNormal');if(undo_index!=-1&&(undo_index0))tinyMCE.switchClass(editor_id+'_redo','mceButtonNormal');if(undo_index!=-1&&(undo_index>0&&undo_levels>0))tinyMCE.switchClass(editor_id+'_undo','mceButtonNormal');var selectElm=document.getElementById(editor_id+"_styleSelect");if(selectElm){TinyMCE_AdvancedTheme._setupCSSClasses(editor_id);classNode=node;breakOut=false;var index=0;do{if(classNode&&classNode.className){for(var i=0;i");else selectByValue(selectElm,"")}var selectElm=document.getElementById(editor_id+"_fontNameSelect");if(selectElm){if(!tinyMCE.isSafari&&!(tinyMCE.isMSIE&&!tinyMCE.isOpera)){var face=inst.queryCommandValue('FontName');face=face==null||face==""?"":face;selectByValue(selectElm,face,face!="")}else{var elm=tinyMCE.getParentElement(node,"font","face");if(elm){var family=tinyMCE.getAttrib(elm,"face");if(family=='')family=''+elm.style.fontFamily;if(!selectByValue(selectElm,family,family!=""))selectByValue(selectElm,"")}else selectByValue(selectElm,"")}}var selectElm=document.getElementById(editor_id+"_fontSizeSelect");if(selectElm){if(!tinyMCE.isSafari&&!tinyMCE.isOpera){var size=inst.queryCommandValue('FontSize');selectByValue(selectElm,size==null||size==""?"0":size)}else{var elm=tinyMCE.getParentElement(node,"font","size");if(elm){var size=tinyMCE.getAttrib(elm,"size");if(size==''){var sizes=new Array('','8px','10px','12px','14px','18px','24px','36px');size=''+elm.style.fontSize;for(var i=0;i0)selectElm.setAttribute('cssImported','true')}},_setCookie:function(name,value,expires,path,domain,secure){var curCookie=name+"="+escape(value)+((expires)?"; expires="+expires.toGMTString():"")+((path)?"; path="+escape(path):"")+((domain)?"; domain="+domain:"")+((secure)?"; secure":"");document.cookie=curCookie},_getCookie:function(name){var dc=document.cookie;var prefix=name+"=";var begin=dc.indexOf("; "+prefix);if(begin==-1){begin=dc.indexOf(prefix);if(begin!=0)return null}else begin+=2;var end=document.cookie.indexOf(";",begin);if(end==-1)end=dc.length;return unescape(dc.substring(begin+prefix.length,end))},_resizeTo:function(inst,w,h,set_w){var editorContainer=document.getElementById(inst.editorId+'_parent');var tableElm=editorContainer.firstChild;var iframe=inst.iframeElement;if(w==null||w=="null"){set_w=false;w=0}if(h==null||h=="null")return;w=parseInt(w);h=parseInt(h);if(tinyMCE.isGecko){w+=2;h+=2}var dx=w-tableElm.clientWidth;var dy=h-tableElm.clientHeight;w=w<1?30:w;h=h<1?30:h;if(set_w)tableElm.style.width=w+"px";tableElm.style.height=h+"px";iw=iframe.clientWidth+dx;ih=iframe.clientHeight+dy;iw=iw<1?30:iw;ih=ih<1?30:ih;if(tinyMCE.isGecko){iw-=2;ih-=2}if(set_w)iframe.style.width=iw+"px";iframe.style.height=ih+"px";if(set_w){var tableBodyElm=tableElm.firstChild;var minIframeWidth=tableBodyElm.scrollWidth;if(inst.iframeElement.clientWidth';for(i=0;i';if((i+1)%8==0)h+=''}h+='';return h},_insertImage:function(src,alt,border,hspace,vspace,width,height,align,title,onmouseover,onmouseout){tinyMCE.execCommand('mceBeginUndoLevel');if(src=="")return;if(!tinyMCE.imgElement&&tinyMCE.isSafari){var html="";html+=''+alt+'';tinyMCE.execCommand("mceInsertContent",false,html)}else{if(!tinyMCE.imgElement&&tinyMCE.selectedInstance){if(tinyMCE.isSafari)tinyMCE.execCommand("mceInsertContent",false,'');else tinyMCE.selectedInstance.contentDocument.execCommand("insertimage",false,tinyMCE.uniqueURL);tinyMCE.imgElement=tinyMCE.getElementByAttributeValue(tinyMCE.selectedInstance.contentDocument.body,"img","src",tinyMCE.uniqueURL)}}if(tinyMCE.imgElement){var needsRepaint=false;var msrc=src;src=eval(tinyMCE.settings['urlconverter_callback']+"(src, tinyMCE.imgElement);");if(tinyMCE.getParam('convert_urls'))msrc=src;if(onmouseover&&onmouseover!="")onmouseover="this.src='"+eval(tinyMCE.settings['urlconverter_callback']+"(onmouseover, tinyMCE.imgElement);")+"';";if(onmouseout&&onmouseout!="")onmouseout="this.src='"+eval(tinyMCE.settings['urlconverter_callback']+"(onmouseout, tinyMCE.imgElement);")+"';";if(typeof(title)=="undefined")title=alt;if(width!=tinyMCE.imgElement.getAttribute("width")||height!=tinyMCE.imgElement.getAttribute("height")||align!=tinyMCE.imgElement.getAttribute("align"))needsRepaint=true;tinyMCE.setAttrib(tinyMCE.imgElement,'src',src);tinyMCE.setAttrib(tinyMCE.imgElement,'mce_src',msrc);tinyMCE.setAttrib(tinyMCE.imgElement,'alt',alt);tinyMCE.setAttrib(tinyMCE.imgElement,'title',title);tinyMCE.setAttrib(tinyMCE.imgElement,'align',align);tinyMCE.setAttrib(tinyMCE.imgElement,'border',border,true);tinyMCE.setAttrib(tinyMCE.imgElement,'hspace',hspace,true);tinyMCE.setAttrib(tinyMCE.imgElement,'vspace',vspace,true);tinyMCE.setAttrib(tinyMCE.imgElement,'width',width,true);tinyMCE.setAttrib(tinyMCE.imgElement,'height',height,true);tinyMCE.setAttrib(tinyMCE.imgElement,'onmouseover',onmouseover);tinyMCE.setAttrib(tinyMCE.imgElement,'onmouseout',onmouseout);if(width&&width!="")tinyMCE.imgElement.style.pixelWidth=width;if(height&&height!="")tinyMCE.imgElement.style.pixelHeight=height;if(needsRepaint)tinyMCE.selectedInstance.repaint()}tinyMCE.execCommand('mceEndUndoLevel')},_insertLink:function(href,target,title,onclick,style_class){tinyMCE.execCommand('mceBeginUndoLevel');if(tinyMCE.selectedInstance&&tinyMCE.selectedElement&&tinyMCE.selectedElement.nodeName.toLowerCase()=="img"){var doc=tinyMCE.selectedInstance.getDoc();var linkElement=tinyMCE.getParentElement(tinyMCE.selectedElement,"a");var newLink=false;if(!linkElement){linkElement=doc.createElement("a");newLink=true}var mhref=href;var thref=eval(tinyMCE.settings['urlconverter_callback']+"(href, linkElement);");mhref=tinyMCE.getParam('convert_urls')?href:mhref;tinyMCE.setAttrib(linkElement,'href',thref);tinyMCE.setAttrib(linkElement,'mce_href',mhref);tinyMCE.setAttrib(linkElement,'target',target);tinyMCE.setAttrib(linkElement,'title',title);tinyMCE.setAttrib(linkElement,'onclick',onclick);tinyMCE.setAttrib(linkElement,'class',style_class);if(newLink){linkElement.appendChild(tinyMCE.selectedElement.cloneNode(true));tinyMCE.selectedElement.parentNode.replaceChild(linkElement,tinyMCE.selectedElement)}return}if(!tinyMCE.linkElement&&tinyMCE.selectedInstance){if(tinyMCE.isSafari){tinyMCE.execCommand("mceInsertContent",false,''+tinyMCE.selectedInstance.selection.getSelectedHTML()+'')}else tinyMCE.selectedInstance.contentDocument.execCommand("createlink",false,tinyMCE.uniqueURL);tinyMCE.linkElement=tinyMCE.getElementByAttributeValue(tinyMCE.selectedInstance.contentDocument.body,"a","href",tinyMCE.uniqueURL);var elementArray=tinyMCE.getElementsByAttributeValue(tinyMCE.selectedInstance.contentDocument.body,"a","href",tinyMCE.uniqueURL);for(var i=0;i 4 ? but[4] : false), (but.length > 5 ? but[5] : null)); + + if (but[0] == button_name) + return tinyMCE.getButtonHTML(but[0], but[2], '{$themeurl}/images/' + but[1], but[3], (but.length > 4 ? but[4] : false), (but.length > 5 ? but[5] : null)); + } + + // Custom controlls other than buttons + switch (button_name) { + case "formatselect": + var html = ''; + + return html; + + case "styleselect": + return ''; + + case "fontselect": + var fontHTML = ''; + return fontHTML; + + case "fontsizeselect": + return ''; + + case "|": + case "separator": + return ''; + + case "spacer": + return ''; + + case "rowseparator": + return '
    '; + } + + return ""; + }, + + /** + * Theme specific execcommand handling. + */ + execCommand : function(editor_id, element, command, user_interface, value) { + switch (command) { + case 'mceHelp': + tinyMCE.openWindow({ + file : 'about.htm', + width : 480, + height : 380 + }, { + tinymce_version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion, + tinymce_releasedate : tinyMCE.releaseDate, + inline : "yes" + }); + return true; + + case "mceLink": + var inst = tinyMCE.getInstanceById(editor_id); + var doc = inst.getDoc(); + var selectedText = ""; + + if (tinyMCE.isMSIE) { + var rng = doc.selection.createRange(); + selectedText = rng.text; + } else + selectedText = inst.getSel().toString(); + + if (!tinyMCE.linkElement) { + if ((tinyMCE.selectedElement.nodeName.toLowerCase() != "img") && (selectedText.length <= 0)) + return true; + } + + var href = "", target = "", title = "", onclick = "", action = "insert", style_class = ""; + + if (tinyMCE.selectedElement.nodeName.toLowerCase() == "a") + tinyMCE.linkElement = tinyMCE.selectedElement; + + // Is anchor not a link + if (tinyMCE.linkElement != null && tinyMCE.getAttrib(tinyMCE.linkElement, 'href') == "") + tinyMCE.linkElement = null; + + if (tinyMCE.linkElement) { + href = tinyMCE.getAttrib(tinyMCE.linkElement, 'href'); + target = tinyMCE.getAttrib(tinyMCE.linkElement, 'target'); + title = tinyMCE.getAttrib(tinyMCE.linkElement, 'title'); + onclick = tinyMCE.getAttrib(tinyMCE.linkElement, 'onclick'); + style_class = tinyMCE.getAttrib(tinyMCE.linkElement, 'class'); + + // Try old onclick to if copy/pasted content + if (onclick == "") + onclick = tinyMCE.getAttrib(tinyMCE.linkElement, 'onclick'); + + onclick = tinyMCE.cleanupEventStr(onclick); + + href = eval(tinyMCE.settings['urlconverter_callback'] + "(href, tinyMCE.linkElement, true);"); + + // Use mce_href if defined + mceRealHref = tinyMCE.getAttrib(tinyMCE.linkElement, 'mce_href'); + if (mceRealHref != "") { + href = mceRealHref; + + if (tinyMCE.getParam('convert_urls')) + href = eval(tinyMCE.settings['urlconverter_callback'] + "(href, tinyMCE.linkElement, true);"); + } + + action = "update"; + } + + var template = new Array(); + + template['file'] = 'link.htm'; + template['width'] = 310; + template['height'] = 200; + + // Language specific width and height addons + template['width'] += tinyMCE.getLang('lang_insert_link_delta_width', 0); + template['height'] += tinyMCE.getLang('lang_insert_link_delta_height', 0); + + if (inst.settings['insertlink_callback']) { + var returnVal = eval(inst.settings['insertlink_callback'] + "(href, target, title, onclick, action, style_class);"); + if (returnVal && returnVal['href']) + TinyMCE_AdvancedTheme._insertLink(returnVal['href'], returnVal['target'], returnVal['title'], returnVal['onclick'], returnVal['style_class']); + } else { + tinyMCE.openWindow(template, {href : href, target : target, title : title, onclick : onclick, action : action, className : style_class, inline : "yes"}); + } + + return true; + + case "mceImage": + var src = "", alt = "", border = "", hspace = "", vspace = "", width = "", height = "", align = ""; + var title = "", onmouseover = "", onmouseout = "", action = "insert"; + var img = tinyMCE.imgElement; + var inst = tinyMCE.getInstanceById(editor_id); + + if (tinyMCE.selectedElement != null && tinyMCE.selectedElement.nodeName.toLowerCase() == "img") { + img = tinyMCE.selectedElement; + tinyMCE.imgElement = img; + } + + if (img) { + // Is it a internal MCE visual aid image, then skip this one. + if (tinyMCE.getAttrib(img, 'name').indexOf('mce_') == 0) + return true; + + src = tinyMCE.getAttrib(img, 'src'); + alt = tinyMCE.getAttrib(img, 'alt'); + + // Try polling out the title + if (alt == "") + alt = tinyMCE.getAttrib(img, 'title'); + + // Fix width/height attributes if the styles is specified + if (tinyMCE.isGecko) { + var w = img.style.width; + if (w != null && w != "") + img.setAttribute("width", w); + + var h = img.style.height; + if (h != null && h != "") + img.setAttribute("height", h); + } + + border = tinyMCE.getAttrib(img, 'border'); + hspace = tinyMCE.getAttrib(img, 'hspace'); + vspace = tinyMCE.getAttrib(img, 'vspace'); + width = tinyMCE.getAttrib(img, 'width'); + height = tinyMCE.getAttrib(img, 'height'); + align = tinyMCE.getAttrib(img, 'align'); + onmouseover = tinyMCE.getAttrib(img, 'onmouseover'); + onmouseout = tinyMCE.getAttrib(img, 'onmouseout'); + title = tinyMCE.getAttrib(img, 'title'); + + // Is realy specified? + if (tinyMCE.isMSIE) { + width = img.attributes['width'].specified ? width : ""; + height = img.attributes['height'].specified ? height : ""; + } + + //onmouseover = tinyMCE.getImageSrc(tinyMCE.cleanupEventStr(onmouseover)); + //onmouseout = tinyMCE.getImageSrc(tinyMCE.cleanupEventStr(onmouseout)); + + src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, img, true);"); + + // Use mce_src if defined + mceRealSrc = tinyMCE.getAttrib(img, 'mce_src'); + if (mceRealSrc != "") { + src = mceRealSrc; + + if (tinyMCE.getParam('convert_urls')) + src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, img, true);"); + } + + //if (onmouseover != "") + // onmouseover = eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseover, img, true);"); + + //if (onmouseout != "") + // onmouseout = eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseout, img, true);"); + + action = "update"; + } + + var template = new Array(); + + template['file'] = 'image.htm?src={$src}'; + template['width'] = 355; + template['height'] = 265 + (tinyMCE.isMSIE ? 25 : 0); + + // Language specific width and height addons + template['width'] += tinyMCE.getLang('lang_insert_image_delta_width', 0); + template['height'] += tinyMCE.getLang('lang_insert_image_delta_height', 0); + + if (inst.settings['insertimage_callback']) { + var returnVal = eval(inst.settings['insertimage_callback'] + "(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout, action);"); + if (returnVal && returnVal['src']) + TinyMCE_AdvancedTheme._insertImage(returnVal['src'], returnVal['alt'], returnVal['border'], returnVal['hspace'], returnVal['vspace'], returnVal['width'], returnVal['height'], returnVal['align'], returnVal['title'], returnVal['onmouseover'], returnVal['onmouseout']); + } else + tinyMCE.openWindow(template, {src : src, alt : alt, border : border, hspace : hspace, vspace : vspace, width : width, height : height, align : align, title : title, onmouseover : onmouseover, onmouseout : onmouseout, action : action, inline : "yes"}); + + return true; + + case "forecolor": + var fcp = new TinyMCE_Layer(editor_id + '_fcPreview', false), p, img, elm; + + TinyMCE_AdvancedTheme._hideMenus(editor_id); + + if (!fcp.exists()) { + fcp.create('div', 'mceColorPreview', document.getElementById(editor_id + '_toolbar')); + elm = fcp.getElement(); + elm._editor_id = editor_id; + elm._command = "forecolor"; + elm._switchId = editor_id + "_forecolor"; + tinyMCE.addEvent(elm, 'click', TinyMCE_AdvancedTheme._handleMenuEvent); + tinyMCE.addEvent(elm, 'mouseover', TinyMCE_AdvancedTheme._handleMenuEvent); + tinyMCE.addEvent(elm, 'mouseout', TinyMCE_AdvancedTheme._handleMenuEvent); + } + + img = tinyMCE.selectNodes(document.getElementById(editor_id + "_forecolor"), function(n) {return n.nodeName == "IMG";})[0]; + p = tinyMCE.getAbsPosition(img, document.getElementById(editor_id + '_toolbar')); + + fcp.moveTo(p.absLeft, p.absTop); + fcp.getElement().style.backgroundColor = value != null ? value : tinyMCE.getInstanceById(editor_id).foreColor; + fcp.show(); + + return false; + + case "forecolorMenu": + TinyMCE_AdvancedTheme._hideMenus(editor_id); + + // Create color layer + var ml = new TinyMCE_Layer(editor_id + '_fcMenu'); + + if (!ml.exists()) + ml.create('div', 'mceMenu', document.body, TinyMCE_AdvancedTheme._getColorHTML(editor_id, 'theme_advanced_text_colors', 'forecolor')); + + tinyMCE.switchClass(editor_id + '_forecolor', 'mceMenuButtonFocus'); + ml.moveRelativeTo(document.getElementById(editor_id + "_forecolor"), 'bl'); + + ml.moveBy(tinyMCE.isMSIE && !tinyMCE.isOpera ? -1 : 1, -1); + + if (tinyMCE.isOpera) + ml.moveBy(0, -2); + + ml.show(); + return true; + + case "HiliteColor": + var bcp = new TinyMCE_Layer(editor_id + '_bcPreview', false), p, img; + + TinyMCE_AdvancedTheme._hideMenus(editor_id); + + if (!bcp.exists()) { + bcp.create('div', 'mceColorPreview', document.getElementById(editor_id + '_toolbar')); + elm = bcp.getElement(); + elm._editor_id = editor_id; + elm._command = "HiliteColor"; + elm._switchId = editor_id + "_backcolor"; + tinyMCE.addEvent(elm, 'click', TinyMCE_AdvancedTheme._handleMenuEvent); + tinyMCE.addEvent(elm, 'mouseover', TinyMCE_AdvancedTheme._handleMenuEvent); + tinyMCE.addEvent(elm, 'mouseout', TinyMCE_AdvancedTheme._handleMenuEvent); + } + + img = tinyMCE.selectNodes(document.getElementById(editor_id + "_backcolor"), function(n) {return n.nodeName == "IMG";})[0]; + p = tinyMCE.getAbsPosition(img, document.getElementById(editor_id + '_toolbar')); + + bcp.moveTo(p.absLeft, p.absTop); + bcp.getElement().style.backgroundColor = value != null ? value : tinyMCE.getInstanceById(editor_id).backColor; + bcp.show(); + + return false; + + case "HiliteColorMenu": + TinyMCE_AdvancedTheme._hideMenus(editor_id); + + // Create color layer + var ml = new TinyMCE_Layer(editor_id + '_bcMenu'); + + if (!ml.exists()) + ml.create('div', 'mceMenu', document.body, TinyMCE_AdvancedTheme._getColorHTML(editor_id, 'theme_advanced_background_colors', 'HiliteColor')); + + tinyMCE.switchClass(editor_id + '_backcolor', 'mceMenuButtonFocus'); + ml.moveRelativeTo(document.getElementById(editor_id + "_backcolor"), 'bl'); + + ml.moveBy(tinyMCE.isMSIE && !tinyMCE.isOpera ? -1 : 1, -1); + + if (tinyMCE.isOpera) + ml.moveBy(0, -2); + + ml.show(); + return true; + + case "mceColorPicker": + if (user_interface) { + var template = new Array(); + var inputColor = value['document'].getElementById(value['element_id']).value; + + template['file'] = 'color_picker.htm'; + template['width'] = 220; + template['height'] = 190; + template['close_previous'] = "no"; + + template['width'] += tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_width', 0); + template['height'] += tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_height', 0); + + if (typeof(value['store_selection']) == "undefined") + value['store_selection'] = true; + + tinyMCE.lastColorPickerValue = value; + tinyMCE.openWindow(template, {editor_id : editor_id, mce_store_selection : value['store_selection'], inline : "yes", command : "mceColorPicker", input_color : inputColor}); + } else { + var savedVal = tinyMCE.lastColorPickerValue; + var elm = savedVal['document'].getElementById(savedVal['element_id']); + elm.value = value; + + if (elm.onchange != null && elm.onchange != '') + eval('elm.onchange();'); + } + return true; + + case "mceCodeEditor": + var template = new Array(); + + template['file'] = 'source_editor.htm'; + template['width'] = parseInt(tinyMCE.getParam("theme_advanced_source_editor_width", 720)); + template['height'] = parseInt(tinyMCE.getParam("theme_advanced_source_editor_height", 580)); + + tinyMCE.openWindow(template, {editor_id : editor_id, resizable : "yes", scrollbars : "no", inline : "yes"}); + return true; + + case "mceCharMap": + var template = new Array(); + + template['file'] = 'charmap.htm'; + template['width'] = 550 + (tinyMCE.isOpera ? 40 : 0); + template['height'] = 250; + + template['width'] += tinyMCE.getLang('lang_theme_advanced_charmap_delta_width', 0); + template['height'] += tinyMCE.getLang('lang_theme_advanced_charmap_delta_height', 0); + + tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"}); + return true; + + case "mceInsertAnchor": + var template = new Array(); + + template['file'] = 'anchor.htm'; + template['width'] = 320; + template['height'] = 90 + (tinyMCE.isNS7 ? 30 : 0); + + template['width'] += tinyMCE.getLang('lang_theme_advanced_anchor_delta_width', 0); + template['height'] += tinyMCE.getLang('lang_theme_advanced_anchor_delta_height', 0); + + tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"}); + return true; + + case "mceNewDocument": + if (confirm(tinyMCE.getLang('lang_newdocument'))) + tinyMCE.execInstanceCommand(editor_id, 'mceSetContent', false, ' '); + + return true; + } + + return false; + }, + + /** + * Editor instance template function. + */ + getEditorTemplate : function(settings, editorId) { + function removeFromArray(in_array, remove_array) { + var outArray = new Array(), skip; + + for (var i=0; i 

    '; + var layoutManager = tinyMCE.getParam("theme_advanced_layout_manager", "SimpleLayout"); + + // Setup style select options -- MOVED UP FOR EXTERNAL TOOLBAR COMPATABILITY! + var styleSelectHTML = ''; + if (settings['theme_advanced_styles']) { + var stylesAr = settings['theme_advanced_styles'].split(';'); + + for (var i=0; i' + key + ''; + } + + TinyMCE_AdvancedTheme._autoImportCSSClasses = false; + } + + switch(layoutManager) { + case "SimpleLayout" : //the default TinyMCE Layout (for backwards compatibility)... + var toolbarHTML = ""; + var toolbarLocation = tinyMCE.getParam("theme_advanced_toolbar_location", "bottom"); + var toolbarAlign = tinyMCE.getParam("theme_advanced_toolbar_align", "center"); + var pathLocation = tinyMCE.getParam("theme_advanced_path_location", "none"); // Compatiblity + var statusbarLocation = tinyMCE.getParam("theme_advanced_statusbar_location", pathLocation); + var defVals = { + theme_advanced_buttons1 : "bold,italic,underline,strikethrough,separator,justifyleft,justifycenter,justifyright,justifyfull,separator,styleselect,formatselect", + theme_advanced_buttons2 : "bullist,numlist,separator,outdent,indent,separator,undo,redo,separator,link,unlink,anchor,image,cleanup,help,code", + theme_advanced_buttons3 : "hr,removeformat,visualaid,separator,sub,sup,separator,charmap" + }; + + // Add accessibility control + toolbarHTML += ' 0) { + toolbarHTML += "
    "; + deltaHeight -= 23; + } + } + + // Add accessibility control + toolbarHTML += '
    '; + + // Setup template html + template['html'] = ''; + + if (toolbarLocation == "top") { + template['html'] += ''; + } + + if (statusbarLocation == "top") { + template['html'] += ''; + deltaHeight -= 23; + } + + template['html'] += ''; + + if (toolbarLocation == "bottom") { + template['html'] += ''; + } + + // External toolbar changes + if (toolbarLocation == "external") { + var bod = document.body; + var elm = document.createElement ("div"); + + toolbarHTML = tinyMCE.replaceVar(toolbarHTML, 'style_select_options', styleSelectHTML); + toolbarHTML = tinyMCE.applyTemplate(toolbarHTML, {editor_id : editorId}); + + elm.className = "mceToolbarExternal"; + elm.id = editorId+"_toolbar"; + elm.innerHTML = '
    ' + toolbarHTML + '
    ' + statusbarHTML + '
    ' + toolbarHTML + '
    '+toolbarHTML+'
    '; + bod.appendChild (elm); + // bod.style.marginTop = elm.offsetHeight + "px"; + + deltaHeight = 0; + tinyMCE.getInstanceById(editorId).toolbarElement = elm; + + //template['html'] = '
    '+toolbarHTML+'
    ' + template["html"]; + } else { + tinyMCE.getInstanceById(editorId).toolbarElement = null; + } + + if (statusbarLocation == "bottom") { + template['html'] += '' + statusbarHTML + ''; + deltaHeight -= 23; + } + + template['html'] += ''; + //"SimpleLayout" + break; + + case "RowLayout" : //Container Layout - containers defined in "theme_advanced_containers" are rendered from top to bottom. + template['html'] = ''; + + var containers = tinyMCE.getParam("theme_advanced_containers", "", true, ","); + var defaultContainerCSS = tinyMCE.getParam("theme_advanced_containers_default_class", "container"); + var defaultContainerAlign = tinyMCE.getParam("theme_advanced_containers_default_align", "center"); + + //Render Containers: + for (var i = 0; i < containers.length; i++) + { + if (containers[i] == "mceEditor") //Exceptions for mceEditor and ... + template['html'] += ''; + else if (containers[i] == "mceElementpath" || containers[i] == "mceStatusbar") // ... mceElementpath: + { + var pathClass = "mceStatusbar"; + + if (i == containers.length-1) + { + pathClass = "mceStatusbarBottom"; + } + else if (i == 0) + { + pathClass = "mceStatusbar"; + } + else + { + deltaHeight-=2; + } + + template['html'] += ''; + deltaHeight -= 22; + } else { // Render normal Container + var curContainer = tinyMCE.getParam("theme_advanced_container_"+containers[i], "", true, ','); + var curContainerHTML = ""; + var curAlign = tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_align", defaultContainerAlign); + var curCSS = tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_class", defaultContainerCSS); + + curContainer = removeFromArray(curContainer, tinyMCE.getParam("theme_advanced_disable", "", true, ',')); + + for (var j=0; j 0) { + curContainerHTML += "
    "; + deltaHeight -= 23; + } + + template['html'] += '
    '; + } + } + + template['html'] += '
    ' + statusbarHTML + '
    ' + curContainerHTML + '
    '; + //RowLayout + break; + + case "CustomLayout" : //User defined layout callback... + var customLayout = tinyMCE.getParam("theme_advanced_custom_layout",""); + + if (customLayout != "" && eval("typeof(" + customLayout + ")") != "undefined") { + template = eval(customLayout + "(template);"); + } + break; + } + + if (resizing) + template['html'] += ''; + + template['html'] = tinyMCE.replaceVar(template['html'], 'style_select_options', styleSelectHTML); + template['delta_width'] = 0; + template['delta_height'] = deltaHeight; + + return template; + }, + + initInstance : function(inst) { + if (tinyMCE.getParam("theme_advanced_resizing", false)) { + if (tinyMCE.getParam("theme_advanced_resizing_use_cookie", true)) { + var w = TinyMCE_AdvancedTheme._getCookie("TinyMCE_" + inst.editorId + "_width"); + var h = TinyMCE_AdvancedTheme._getCookie("TinyMCE_" + inst.editorId + "_height"); + + TinyMCE_AdvancedTheme._resizeTo(inst, w, h, tinyMCE.getParam("theme_advanced_resize_horizontal", true)); + } + } + + inst.addShortcut('ctrl', 'k', 'lang_link_desc', 'mceLink'); + }, + + _handleMenuEvent : function(e) { + var te = tinyMCE.isMSIE ? window.event.srcElement : e.target; + tinyMCE._menuButtonEvent(e.type == "mouseover" ? "over" : "out", document.getElementById(te._switchId)); + + if (e.type == "click") + tinyMCE.execInstanceCommand(te._editor_id, te._command); + }, + + _hideMenus : function(id) { + var fcml = new TinyMCE_Layer(id + '_fcMenu'), bcml = new TinyMCE_Layer(id + '_bcMenu'); + + if (fcml.exists() && fcml.isVisible()) { + tinyMCE.switchClass(id + '_forecolor', 'mceMenuButton'); + fcml.hide(); + } + + if (bcml.exists() && bcml.isVisible()) { + tinyMCE.switchClass(id + '_backcolor', 'mceMenuButton'); + bcml.hide(); + } + }, + + /** + * Node change handler. + */ + handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection, setup_content) { + var alignNode, breakOut, classNode; + + function selectByValue(select_elm, value, first_index) { + first_index = typeof(first_index) == "undefined" ? false : true; + + if (select_elm) { + for (var i=0; i=0; i--) { + var nodeName = path[i].nodeName.toLowerCase(); + var nodeData = ""; + + if (nodeName.indexOf("html:") == 0) + nodeName = nodeName.substring(5); + + if (nodeName == "b") { + nodeName = "strong"; + } + + if (nodeName == "i") { + nodeName = "em"; + } + + if (nodeName == "span") { + var cn = tinyMCE.getAttrib(path[i], "class"); + if (cn != "" && cn.indexOf('mceItem') == -1) + nodeData += "class: " + cn + " "; + + var st = tinyMCE.getAttrib(path[i], "style"); + if (st != "") { + st = tinyMCE.serializeStyle(tinyMCE.parseStyle(st)); + nodeData += "style: " + st + " "; + } + } + + if (nodeName == "font") { + if (tinyMCE.getParam("convert_fonts_to_spans")) + nodeName = "span"; + + var face = tinyMCE.getAttrib(path[i], "face"); + if (face != "") + nodeData += "font: " + face + " "; + + var size = tinyMCE.getAttrib(path[i], "size"); + if (size != "") + nodeData += "size: " + size + " "; + + var color = tinyMCE.getAttrib(path[i], "color"); + if (color != "") + nodeData += "color: " + color + " "; + } + + if (getAttrib(path[i], 'id') != "") { + nodeData += "id: " + path[i].getAttribute('id') + " "; + } + + var className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i], "class"), false); + if (className != "" && className.indexOf('mceItem') == -1) + nodeData += "class: " + className + " "; + + if (getAttrib(path[i], 'src') != "") { + var src = tinyMCE.getAttrib(path[i], "mce_src"); + + if (src == "") + src = tinyMCE.getAttrib(path[i], "src"); + + nodeData += "src: " + src + " "; + } + + if (path[i].nodeName == 'A' && getAttrib(path[i], 'href') != "") { + var href = tinyMCE.getAttrib(path[i], "mce_href"); + + if (href == "") + href = tinyMCE.getAttrib(path[i], "href"); + + nodeData += "href: " + href + " "; + } + + className = tinyMCE.getAttrib(path[i], "class"); + if ((nodeName == "img" || nodeName == "span") && className.indexOf('mceItem') != -1) { + nodeName = className.replace(/mceItem([a-z]+)/gi, '$1').toLowerCase(); + nodeData = path[i].getAttribute('title'); + } + + if (nodeName == "a" && (anchor = tinyMCE.getAttrib(path[i], "name")) != "") { + nodeName = "a"; + nodeName += "#" + anchor; + nodeData = ""; + } + + if (getAttrib(path[i], 'name').indexOf("mce_") != 0) { + var className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i], "class"), false); + if (className != "" && className.indexOf('mceItem') == -1) { + nodeName += "." + className; + } + } + + var cmd = 'tinyMCE.execInstanceCommand(\'' + editor_id + '\',\'mceSelectNodeDepth\',false,\'' + i + '\');'; + html += '' + nodeName + ''; + + if (i > 0) { + html += " » "; + } + } + + pathElm.innerHTML = '' + tinyMCE.getLang('lang_theme_path') + ": " + html + ' '; + } + + // Reset old states + tinyMCE.switchClass(editor_id + '_justifyleft', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_justifyright', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_justifycenter', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_justifyfull', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_bold', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_italic', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_underline', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_strikethrough', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_bullist', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_numlist', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_sub', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_sup', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_anchor', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_link', 'mceButtonDisabled'); + tinyMCE.switchClass(editor_id + '_unlink', 'mceButtonDisabled'); + tinyMCE.switchClass(editor_id + '_outdent', 'mceButtonDisabled'); + tinyMCE.switchClass(editor_id + '_image', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_hr', 'mceButtonNormal'); + + if (node.nodeName == "A" && tinyMCE.getAttrib(node, "class").indexOf('mceItemAnchor') != -1) + tinyMCE.switchClass(editor_id + '_anchor', 'mceButtonSelected'); + + // Get link + var anchorLink = tinyMCE.getParentElement(node, "a", "href"); + + if (anchorLink || any_selection) { + tinyMCE.switchClass(editor_id + '_link', anchorLink ? 'mceButtonSelected' : 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_unlink', anchorLink ? 'mceButtonSelected' : 'mceButtonNormal'); + } + + // Handle visual aid + tinyMCE.switchClass(editor_id + '_visualaid', visual_aid ? 'mceButtonSelected' : 'mceButtonNormal'); + + if (undo_levels != -1) { + tinyMCE.switchClass(editor_id + '_undo', 'mceButtonDisabled'); + tinyMCE.switchClass(editor_id + '_redo', 'mceButtonDisabled'); + } + + // Within li, blockquote + if (tinyMCE.getParentElement(node, "li,blockquote")) + tinyMCE.switchClass(editor_id + '_outdent', 'mceButtonNormal'); + + // Has redo levels + if (undo_index != -1 && (undo_index < undo_levels-1 && undo_levels > 0)) + tinyMCE.switchClass(editor_id + '_redo', 'mceButtonNormal'); + + // Has undo levels + if (undo_index != -1 && (undo_index > 0 && undo_levels > 0)) + tinyMCE.switchClass(editor_id + '_undo', 'mceButtonNormal'); + + // Select class in select box + var selectElm = document.getElementById(editor_id + "_styleSelect"); + + if (selectElm) { + TinyMCE_AdvancedTheme._setupCSSClasses(editor_id); + + classNode = node; + breakOut = false; + var index = 0; + + do { + if (classNode && classNode.className) { + for (var i=0; i"); + else + selectByValue(selectElm, ""); + } + + // Select fontselect + var selectElm = document.getElementById(editor_id + "_fontNameSelect"); + if (selectElm) { + if (!tinyMCE.isSafari && !(tinyMCE.isMSIE && !tinyMCE.isOpera)) { + var face = inst.queryCommandValue('FontName'); + + face = face == null || face == "" ? "" : face; + + selectByValue(selectElm, face, face != ""); + } else { + var elm = tinyMCE.getParentElement(node, "font", "face"); + + if (elm) { + var family = tinyMCE.getAttrib(elm, "face"); + + if (family == '') + family = '' + elm.style.fontFamily; + + if (!selectByValue(selectElm, family, family != "")) + selectByValue(selectElm, ""); + } else + selectByValue(selectElm, ""); + } + } + + // Select fontsize + var selectElm = document.getElementById(editor_id + "_fontSizeSelect"); + if (selectElm) { + if (!tinyMCE.isSafari && !tinyMCE.isOpera) { + var size = inst.queryCommandValue('FontSize'); + selectByValue(selectElm, size == null || size == "" ? "0" : size); + } else { + var elm = tinyMCE.getParentElement(node, "font", "size"); + if (elm) { + var size = tinyMCE.getAttrib(elm, "size"); + + if (size == '') { + var sizes = new Array('', '8px', '10px', '12px', '14px', '18px', '24px', '36px'); + + size = '' + elm.style.fontSize; + + for (var i=0; i 0) + selectElm.setAttribute('cssImported', 'true'); + } + }, + + _setCookie : function(name, value, expires, path, domain, secure) { + var curCookie = name + "=" + escape(value) + + ((expires) ? "; expires=" + expires.toGMTString() : "") + + ((path) ? "; path=" + escape(path) : "") + + ((domain) ? "; domain=" + domain : "") + + ((secure) ? "; secure" : ""); + + document.cookie = curCookie; + }, + + _getCookie : function(name) { + var dc = document.cookie; + var prefix = name + "="; + var begin = dc.indexOf("; " + prefix); + + if (begin == -1) { + begin = dc.indexOf(prefix); + + if (begin != 0) + return null; + } else + begin += 2; + + var end = document.cookie.indexOf(";", begin); + + if (end == -1) + end = dc.length; + + return unescape(dc.substring(begin + prefix.length, end)); + }, + + _resizeTo : function(inst, w, h, set_w) { + var editorContainer = document.getElementById(inst.editorId + '_parent'); + var tableElm = editorContainer.firstChild; + var iframe = inst.iframeElement; + + if (w == null || w == "null") { + set_w = false; + w = 0; + } + + if (h == null || h == "null") + return; + + w = parseInt(w); + h = parseInt(h); + + if (tinyMCE.isGecko) { + w += 2; + h += 2; + } + + var dx = w - tableElm.clientWidth; + var dy = h - tableElm.clientHeight; + + w = w < 1 ? 30 : w; + h = h < 1 ? 30 : h; + + if (set_w) + tableElm.style.width = w + "px"; + + tableElm.style.height = h + "px"; + + iw = iframe.clientWidth + dx; + ih = iframe.clientHeight + dy; + + iw = iw < 1 ? 30 : iw; + ih = ih < 1 ? 30 : ih; + + if (tinyMCE.isGecko) { + iw -= 2; + ih -= 2; + } + + if (set_w) + iframe.style.width = iw + "px"; + + iframe.style.height = ih + "px"; + + // Is it to small, make it bigger again + if (set_w) { + var tableBodyElm = tableElm.firstChild; + var minIframeWidth = tableBodyElm.scrollWidth; + if (inst.iframeElement.clientWidth < minIframeWidth) { + dx = minIframeWidth - inst.iframeElement.clientWidth; + + inst.iframeElement.style.width = (iw + dx) + "px"; + } + } + + // Remove pesky table controls + inst.useCSS = false; + }, + + /** + * Handles resizing events. + */ + _resizeEventHandler : function(e) { + var resizer = TinyMCE_AdvancedTheme._resizer; + + // Do nothing + if (!resizer.resizing) + return; + + e = typeof(e) == "undefined" ? window.event : e; + + var dx = e.screenX - resizer.downX; + var dy = e.screenY - resizer.downY; + var resizeBox = resizer.resizeBox; + var editorId = resizer.editorId; + + switch (e.type) { + case "mousemove": + var w, h; + + w = resizer.width + dx; + h = resizer.height + dy; + + w = w < 1 ? 1 : w; + h = h < 1 ? 1 : h; + + if (resizer.horizontal) + resizeBox.style.width = w + "px"; + + resizeBox.style.height = h + "px"; + break; + + case "mouseup": + TinyMCE_AdvancedTheme._setResizing(e, editorId, false); + TinyMCE_AdvancedTheme._resizeTo(tinyMCE.getInstanceById(editorId), resizer.width + dx, resizer.height + dy, resizer.horizontal); + + // Expire in a month + if (tinyMCE.getParam("theme_advanced_resizing_use_cookie", true)) { + var expires = new Date(); + expires.setTime(expires.getTime() + 3600000 * 24 * 30); + + // Set the cookies + TinyMCE_AdvancedTheme._setCookie("TinyMCE_" + editorId + "_width", "" + (resizer.horizontal ? resizer.width + dx : ""), expires); + TinyMCE_AdvancedTheme._setCookie("TinyMCE_" + editorId + "_height", "" + (resizer.height + dy), expires); + } + break; + } + }, + + /** + * Starts/stops the editor resizing. + */ + _setResizing : function(e, editor_id, state) { + e = typeof(e) == "undefined" ? window.event : e; + + var resizer = TinyMCE_AdvancedTheme._resizer; + var editorContainer = document.getElementById(editor_id + '_parent'); + var editorArea = document.getElementById(editor_id + '_parent').firstChild; + var resizeBox = document.getElementById(editor_id + '_resize_box'); + var inst = tinyMCE.getInstanceById(editor_id); + + if (state) { + // Place box over editor area + var width = editorArea.clientWidth; + var height = editorArea.clientHeight; + + resizeBox.style.width = width + "px"; + resizeBox.style.height = height + "px"; + + resizer.iframeWidth = inst.iframeElement.clientWidth; + resizer.iframeHeight = inst.iframeElement.clientHeight; + + // Hide editor and show resize box + editorArea.style.display = "none"; + resizeBox.style.display = "block"; + + // Add event handlers, only once + if (!resizer.eventHandlers) { + if (tinyMCE.isMSIE) + tinyMCE.addEvent(document, "mousemove", TinyMCE_AdvancedTheme._resizeEventHandler); + else + tinyMCE.addEvent(window, "mousemove", TinyMCE_AdvancedTheme._resizeEventHandler); + + tinyMCE.addEvent(document, "mouseup", TinyMCE_AdvancedTheme._resizeEventHandler); + + resizer.eventHandlers = true; + } + + resizer.resizing = true; + resizer.downX = e.screenX; + resizer.downY = e.screenY; + resizer.width = parseInt(resizeBox.style.width); + resizer.height = parseInt(resizeBox.style.height); + resizer.editorId = editor_id; + resizer.resizeBox = resizeBox; + resizer.horizontal = tinyMCE.getParam("theme_advanced_resize_horizontal", true); + } else { + resizer.resizing = false; + resizeBox.style.display = "none"; + editorArea.style.display = tinyMCE.isMSIE && !tinyMCE.isOpera ? "block" : "table"; + tinyMCE.execCommand('mceResetDesignMode'); + } + }, + + _getColorHTML : function(id, n, cm) { + var i, h, cl; + + h = ''; + cl = tinyMCE.getParam(n, TinyMCE_AdvancedTheme._defColors).split(','); + + h += ''; + for (i=0; i'; + + if ((i+1) % 8 == 0) + h += ''; + } + + h += '
    '; + /* + h += 'More colors'; + */ + + return h; + }, + + _insertImage : function(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout) { + tinyMCE.execCommand('mceBeginUndoLevel'); + + if (src == "") + return; + + if (!tinyMCE.imgElement && tinyMCE.isSafari) { + var html = ""; + + html += '' + alt + ''; + + tinyMCE.execCommand("mceInsertContent", false, html); + } else { + if (!tinyMCE.imgElement && tinyMCE.selectedInstance) { + if (tinyMCE.isSafari) + tinyMCE.execCommand("mceInsertContent", false, ''); + else + tinyMCE.selectedInstance.contentDocument.execCommand("insertimage", false, tinyMCE.uniqueURL); + + tinyMCE.imgElement = tinyMCE.getElementByAttributeValue(tinyMCE.selectedInstance.contentDocument.body, "img", "src", tinyMCE.uniqueURL); + } + } + + if (tinyMCE.imgElement) { + var needsRepaint = false; + var msrc = src; + + src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, tinyMCE.imgElement);"); + + if (tinyMCE.getParam('convert_urls')) + msrc = src; + + if (onmouseover && onmouseover != "") + onmouseover = "this.src='" + eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseover, tinyMCE.imgElement);") + "';"; + + if (onmouseout && onmouseout != "") + onmouseout = "this.src='" + eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseout, tinyMCE.imgElement);") + "';"; + + // Use alt as title if it's undefined + if (typeof(title) == "undefined") + title = alt; + + if (width != tinyMCE.imgElement.getAttribute("width") || height != tinyMCE.imgElement.getAttribute("height") || align != tinyMCE.imgElement.getAttribute("align")) + needsRepaint = true; + + tinyMCE.setAttrib(tinyMCE.imgElement, 'src', src); + tinyMCE.setAttrib(tinyMCE.imgElement, 'mce_src', msrc); + tinyMCE.setAttrib(tinyMCE.imgElement, 'alt', alt); + tinyMCE.setAttrib(tinyMCE.imgElement, 'title', title); + tinyMCE.setAttrib(tinyMCE.imgElement, 'align', align); + tinyMCE.setAttrib(tinyMCE.imgElement, 'border', border, true); + tinyMCE.setAttrib(tinyMCE.imgElement, 'hspace', hspace, true); + tinyMCE.setAttrib(tinyMCE.imgElement, 'vspace', vspace, true); + tinyMCE.setAttrib(tinyMCE.imgElement, 'width', width, true); + tinyMCE.setAttrib(tinyMCE.imgElement, 'height', height, true); + tinyMCE.setAttrib(tinyMCE.imgElement, 'onmouseover', onmouseover); + tinyMCE.setAttrib(tinyMCE.imgElement, 'onmouseout', onmouseout); + + // Fix for bug #989846 - Image resize bug + if (width && width != "") + tinyMCE.imgElement.style.pixelWidth = width; + + if (height && height != "") + tinyMCE.imgElement.style.pixelHeight = height; + + if (needsRepaint) + tinyMCE.selectedInstance.repaint(); + } + + tinyMCE.execCommand('mceEndUndoLevel'); + }, + + _insertLink : function(href, target, title, onclick, style_class) { + tinyMCE.execCommand('mceBeginUndoLevel'); + + if (tinyMCE.selectedInstance && tinyMCE.selectedElement && tinyMCE.selectedElement.nodeName.toLowerCase() == "img") { + var doc = tinyMCE.selectedInstance.getDoc(); + var linkElement = tinyMCE.getParentElement(tinyMCE.selectedElement, "a"); + var newLink = false; + + if (!linkElement) { + linkElement = doc.createElement("a"); + newLink = true; + } + + var mhref = href; + var thref = eval(tinyMCE.settings['urlconverter_callback'] + "(href, linkElement);"); + mhref = tinyMCE.getParam('convert_urls') ? href : mhref; + + tinyMCE.setAttrib(linkElement, 'href', thref); + tinyMCE.setAttrib(linkElement, 'mce_href', mhref); + tinyMCE.setAttrib(linkElement, 'target', target); + tinyMCE.setAttrib(linkElement, 'title', title); + tinyMCE.setAttrib(linkElement, 'onclick', onclick); + tinyMCE.setAttrib(linkElement, 'class', style_class); + + if (newLink) { + linkElement.appendChild(tinyMCE.selectedElement.cloneNode(true)); + tinyMCE.selectedElement.parentNode.replaceChild(linkElement, tinyMCE.selectedElement); + } + + return; + } + + if (!tinyMCE.linkElement && tinyMCE.selectedInstance) { + if (tinyMCE.isSafari) { + tinyMCE.execCommand("mceInsertContent", false, '' + tinyMCE.selectedInstance.selection.getSelectedHTML() + ''); + } else + tinyMCE.selectedInstance.contentDocument.execCommand("createlink", false, tinyMCE.uniqueURL); + + tinyMCE.linkElement = tinyMCE.getElementByAttributeValue(tinyMCE.selectedInstance.contentDocument.body, "a", "href", tinyMCE.uniqueURL); + + var elementArray = tinyMCE.getElementsByAttributeValue(tinyMCE.selectedInstance.contentDocument.body, "a", "href", tinyMCE.uniqueURL); + + for (var i=0; i + + {$lang_insert_image_title} + + + + + + + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
     
    + x +
    +
    +
    + +
    +
    + +
    + +
    + +
    +
    +
    + + diff --git a/e107_handlers/tiny_mce/themes/advanced/images/anchor.gif b/e107_handlers/tiny_mce/themes/advanced/images/anchor.gif new file mode 100644 index 0000000000000000000000000000000000000000..34ab71534b74e1f8eb01a822d2073cde4cd878cb GIT binary patch literal 171 zcmV;c095}+Nk%w1VH5xq0K*0VDLrY1lc!y3io(UtI8lV8tiaOK*PC=h8YL;9lhufQV@{Qv1;Q^ z1CN9aCpLWeabVHPfD1Po9zQKUa3H|IK=i|h0tE$u0|yFDoLI16K|_GA>4F&r|37SK zt%&~c;lqUs7iP|!2{asR39SglpDc_F3@91(378K)^W9w}6@)4Ah7U!&=7r01TP(pNhpv(qI;dOyqUFCP|+_hWY WWzYVd`wr|sba?l+6DOS=8LR=)wsG75 literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/bold.gif b/e107_handlers/tiny_mce/themes/advanced/images/bold.gif new file mode 100644 index 0000000000000000000000000000000000000000..d6a9cc2cd4117526156fa29c06156ba5971823c4 GIT binary patch literal 76 zcmZ?wbhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz@*&Mzw-23{>3a?E=Bm(Rqw7V Z4AWqey4jFcx$b3$*C(Ir-+DzDtN~+a79aos literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/bold_de_se.gif b/e107_handlers/tiny_mce/themes/advanced/images/bold_de_se.gif new file mode 100644 index 0000000000000000000000000000000000000000..9b129de25e916946792c89f08a7b30b2f9dc8b72 GIT binary patch literal 73 zcmZ?wbhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz@*UAzw-23e#sdnZdC`i8W!&j Xl@)6cxHjEB<6*$FFxbIg;(p2 i&djr5P5jX#dNVh}IZO5VUiUMXvRj`2I%m$xU=0AHn;dum literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/bold_fr.gif b/e107_handlers/tiny_mce/themes/advanced/images/bold_fr.gif new file mode 100644 index 0000000000000000000000000000000000000000..2816454515a2b3d031ee1762f9308db99e9d3940 GIT binary patch literal 78 zcmZ?wbhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz@*yKzw-23e%TquY+VNzx0~n3 bPUX;xQ|oohT$M9BQ$Xt4x8CPfj11NQWJeUX literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/bold_ru.gif b/e107_handlers/tiny_mce/themes/advanced/images/bold_ru.gif new file mode 100644 index 0000000000000000000000000000000000000000..e000d461c96188c26fe081920ba332593e5b60ca GIT binary patch literal 77 zcmZ?wbhEHb6k!lyn83i`>+8$Fz@Ye(g^_`QkwFK@28xR?Ffgg~^shYqmVYseNeI`y fv!S2m6KACKPM+Zyy|O9RI8W2_`nTTOtPIuwq8S!> literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/browse.gif b/e107_handlers/tiny_mce/themes/advanced/images/browse.gif new file mode 100644 index 0000000000000000000000000000000000000000..c786d0b2050a1a59fe6d729497bdd58329011509 GIT binary patch literal 113 zcmZ?wbhEHb6k!lzSjfnr=Th|l|Nq&XoD2*Mia%Kx85o!ubbxFIkURsE)13a5r@8nS zvv9CjKVG}@Iz!tc57{sUjwG+Tj8*&Ir1h0WNImEIwB=qiYx>TEFU_>xB^?a&6>B~^ R#bfrS$(b43?=Ue~0{~-MC*lAA literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/bullist.gif b/e107_handlers/tiny_mce/themes/advanced/images/bullist.gif new file mode 100644 index 0000000000000000000000000000000000000000..6e19467c70e337bbfb2a3fe3eff1bc3acab0eaec GIT binary patch literal 108 zcmZ?wbhEHb6k!ly*u>1h#Kfdz)l@%W&!*iMf|{-?85Jc}En;9`Q2fcl$iTqPpaWzB zRf;e$FdJ6vy7SNAl;>@M#YT=zObHxz&I%bBUa^s_ M6r5P1!pL9^0IPo@`~Uy| literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/button_menu.gif b/e107_handlers/tiny_mce/themes/advanced/images/button_menu.gif new file mode 100644 index 0000000000000000000000000000000000000000..c3d8fa23117f9a5630277071a6e07cd04264173f GIT binary patch literal 57 zcmZ?wbhEHbjEB<5wG8q|kKzxu41Cu~c|H{*E`Gsc$hp{fYx2K(n G!5RQ}Dh{In literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/buttons.gif b/e107_handlers/tiny_mce/themes/advanced/images/buttons.gif new file mode 100644 index 0000000000000000000000000000000000000000..5ad99a7c4321610124833ba05bdf0df236f5d5a9 GIT binary patch literal 5662 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 QlBM{BrF;@f1^~nV1AeuLF8}}l literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/cancel_button_bg.gif b/e107_handlers/tiny_mce/themes/advanced/images/cancel_button_bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..4b4aeefcbbba8ed33383d99e3ad38a2b9683044e GIT binary patch literal 677 zcmV;W0$Tk?Nk%w1VOjtc0K@)fLs#+_}=< z+2GjQ)C|ia%M}g|2-*$|4jAv++6)X8?f3NB2<-a^7%Bu**N)yjcm?$#=+|zcKYj)I zIjF!OVTE%a3KYO_;R1$_A3cH`Nit-~lPFRDiUhfmW6G2Q3W(6yv1UzC}*s)i?z8nAt58I(vAO9Tu2JqX_n^*5Vy?OEB-=jZ2zyA2} z=ksr%;9UfV@9G68;D7`cXyAbe9{8UkfB!Y;;DZoGDB*+@R%juG3|^?=h8%WSVGAIJ LDB_4Bh5!IN$Y@?j literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/center.gif b/e107_handlers/tiny_mce/themes/advanced/images/center.gif new file mode 100644 index 0000000000000000000000000000000000000000..42d609a991f51b029ef83a1d4a5a978b0cbb4ec8 GIT binary patch literal 70 zcmZ?wbhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz$Dw#zw-23e&HEgu5~nTwS324 TB4E+Ue{v@8s%`JM#Tl#t;~Nqj literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/charmap.gif b/e107_handlers/tiny_mce/themes/advanced/images/charmap.gif new file mode 100644 index 0000000000000000000000000000000000000000..3cdc4ac9134258a9a1a83b6afd5c7055bebbcbf9 GIT binary patch literal 245 zcmVJ7UM8qsvB8x<;Dr zSg7=Nn%Hi7)&KwiA^8LW0018VEC2ui02BZe000GY;3tk`X`X1RuI#x~)x&X5LaDKL zBuP+gmjjC8P!LL;h9PruTqdW2VQ_jhm?kOJM8RlI0sywOkQfrBgdlP}Q6Q310n$b# v>y*a!grF>@BLxiv8314c77P(14Hy;xh9(V(3=AWV77>droSmMZC?Nnljc8>f literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/cleanup.gif b/e107_handlers/tiny_mce/themes/advanced/images/cleanup.gif new file mode 100644 index 0000000000000000000000000000000000000000..16491f6cfcf3e1123f08352c895f8010f791c469 GIT binary patch literal 256 zcmV+b0ssC-Nk%w1VH5xq0MrlwMm#2xdP3^ge4>(aXJcF2&#c0@g7@*TXJyAiI+Bx- z!osRT%E{EUw6tz+enw7G^6K)^$d=yS-J+Ue{{6y&f`-z%VxXFs!L^y{+>(HFVv>^L zOipLAk}~7mu>b%7A^8LW0018VEC2ui02BZe000Gj;3tk`X`X1RuBfCa3_CK)hB&I! z?6jS5DV>BNxhN371`1>FG$6!^gQF}JB8CHn;<-pFjYq{)@NCbANaf;iJjfX><#5Od z41@~dZSq94bpiqw6C4j!WCnJE77HB!h$k2WjE(>oEEpP%kC-wT1Ob;aBcK|jsHv(a GApkq`d~Wvu literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/close.gif b/e107_handlers/tiny_mce/themes/advanced/images/close.gif new file mode 100644 index 0000000000000000000000000000000000000000..679ca2aa47644793fc7096142233af6d18cfc9ac GIT binary patch literal 102 zcmZ?wbhEHb6ky1B=+vSZwA88iSX|!)1|*>PlZBCifrUW_BnDE;z-;WX>&`!e zQ=Y5$?qJ;7tnMTs#JpKBeE~;8w4TG9b-KTcEEZl{H}m}(h0KD}68$HZ6lMA_FjxZs D>4hO7 literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/color.gif b/e107_handlers/tiny_mce/themes/advanced/images/color.gif new file mode 100644 index 0000000000000000000000000000000000000000..1ecd5743b64464068d80fe0c306375bc0f36a3f9 GIT binary patch literal 125 zcmZ?wbhEHb6k!lxSi}GV|NsBLa^b|RS+g7*9Dr=F7=z+Z7DfgJRt6mq7o?Vf*~wzp z9Utctp08V)UYxZ)DHzz35?MDRW1X_prZuwmzXRH=pKYwZWOr?gDO&r}E WQznT77&6ApIg)ei@KZGg25SKIc`;M~ literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/copy.gif b/e107_handlers/tiny_mce/themes/advanced/images/copy.gif new file mode 100644 index 0000000000000000000000000000000000000000..dc146865c5952aa48b82fc54677db621322465b9 GIT binary patch literal 263 zcmV+i0r>t$Nk%w1VH5xq0MrKnGD>2SrMb<|)0(p4GF`Q=%=coD-uwLia-!n0ztXb8 z>SB7D(cbRC&Eb``_99D}N_N7cveI&z@*+Zl!qxWT>hhwp!g8A0g0kXLg3_YG@}jE3 za+1=5r|rPV)BpegA^8LW0018VEC2ui02BZe000Gq;3tk`X`X1Rt}Ll2NgN5Sa@>ct z&})Jp0ne^?pcEK^!b{_DFiw_VrSR(z8m7&Gi9u+7k^;d~3fw9c#^BIo7zl(%`OrmN z*0>5KA}5&{3=It(2OS6o85w+K0F8|tI1CgD7JVrO2Z)Io8#2N9wc8v&jt5O5Ex Ns}n7+u(2f}06RB$bN>JU literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/custom_1.gif b/e107_handlers/tiny_mce/themes/advanced/images/custom_1.gif new file mode 100644 index 0000000000000000000000000000000000000000..4cbccdadf60dfccaf532fd56a567c47b131f80a8 GIT binary patch literal 76 zcmZ?wbhEHb6k!lySjfQ8(7@2Zz`(%B2qYALvH&S21|1+9C@TVF%TDQEdHOB?;yGKQ b7!RD8^=Ve+T!9>q%7xRawyuk2V6X-NXyp|c literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/cut.gif b/e107_handlers/tiny_mce/themes/advanced/images/cut.gif new file mode 100644 index 0000000000000000000000000000000000000000..4e9a70b6e297cfa0744d581c42868b35b0a7a204 GIT binary patch literal 187 zcmV;s07U;sNk%w1VH5xq0K*3W0z;>dm7`y6hp@H0TzRe{O`Us&m(k6|m7uZ$S-vl0 zv81W9YJ#%8z`z1cvH$=8A^8LW000jFEC2ui02BZe000DN@X1N5y*RH`2hYzS9F#DC z&mja;FrrU@G*7b_@UslKvE>g#z<@B2axx(c_%I2W2u49rARu4_N5ZktItZW!fI&z+ p0E8?Jvj7|jibsJV{#*tC#rVODXii?U706WgML@)pV literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/ecode.gif b/e107_handlers/tiny_mce/themes/advanced/images/ecode.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8812b5726b00a4fc6a7db83dab94cf44f8ff316 GIT binary patch literal 80 zcmZ?wbhEHb6k!lyXkcW30L7myKqe!D4u}hqVPI14>0f#JE&t*+9U*{gPGFSruv)mX5 literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/forecolor.gif b/e107_handlers/tiny_mce/themes/advanced/images/forecolor.gif new file mode 100644 index 0000000000000000000000000000000000000000..8b703616081fa7e20cb176d77a750ef15006d390 GIT binary patch literal 342 zcmZ?wbhEHb6k!lyxXJ(m|NsAYh*&Ub?(TUjPtI9(XvV^wi`N`ox9#kjEvEvKCobQ3 zYW=89Y{dsA6nN-J^`B6g*bt~B zFW$NN#Eux9U?sNXl?9uexSfIv8!TrB90~4BF=tVXHjL#k;p<)QXlbD+EzHc!$}3yq z$sxz#A|N8`$t}$*?=0CbE5hl{!7425%qh&aWVVaKij}KYD=c5Le#N>CYc_3Om9Qhy Hk--`Oc8y|F literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/full.gif b/e107_handlers/tiny_mce/themes/advanced/images/full.gif new file mode 100644 index 0000000000000000000000000000000000000000..c8504f626fec70376fc768c92f04f666cea5993c GIT binary patch literal 71 zcmZ?wbhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz$Dkxzw-23e&HEgu1Tz2Ch_jB V?R+t-#i3@;r*3=4EzQbc4FLT|66XK_ literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/help.gif b/e107_handlers/tiny_mce/themes/advanced/images/help.gif new file mode 100644 index 0000000000000000000000000000000000000000..51a1ee42073402ce787b60d151219ef7ce367615 GIT binary patch literal 295 zcmV+?0oeXWNk%w1VH5xq0Mrfu6i>3FyW3udp6K!Ub&;kbTH+f8tqUysbN$lQ^w;v!hW z!pq(wXY{hj_W%F@A^8LW0018VEC2ui02BZe000G~;3tk`X`X1Ru1KI+h83(|W>rq^ zR7RF&f!#zRnN$X{6T;$HBo?`WVllvQOo2)zp>TL49!J8HVVDe#NumhpbS0R9z=Ux~ zAoz}Cx7j!jCJ$n5dR`j5{)+~RJ$w}+Xh M?UBc{1V#pH0B+0Sa+3=zxSlW-zei2b}a=z4u4c+1=|M6#AZUG%OY1V6F^WxI(BULHv>RQKq-j zt7NjCDogO`gJ_lySi|J(sDATCUOUsGgu4xU7+ORVU(d1bXgSWKeMyMJ iI-K#xts6OY)eP+JZLJ;d&BZ;{lKm4VP7)Gium%8};6e`o literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/indent.gif b/e107_handlers/tiny_mce/themes/advanced/images/indent.gif new file mode 100644 index 0000000000000000000000000000000000000000..acd315bb16c47c2f1679bdf440b511497f9d633b GIT binary patch literal 112 zcmV-$0FVDiNk%w1VH5xq0I~!C0s;a%TAPZd(ouxs%G2Opda$m#$^ZZWA^8LW000L7 zEC2ui02BZe0009uc)HyFFv__Ay%A`;yT;Qn5S6zzgeZ{axrjp`gM=IyhY1x0spz0f SC)ctBGpEmS`C~dK2>?4to+ugs literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/insert_button_bg.gif b/e107_handlers/tiny_mce/themes/advanced/images/insert_button_bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..69c131ce2992df593b0f4299bca3b823819bfafa GIT binary patch literal 703 zcmV;w0zmyoNk%w1VOjtc0K@s=_xSkz{{8#>`}z9$_xShz{{8*^{QUg;`}_L%`1kks_WJqx{r&y?{QUd-`}+F& z`T6KpoHUDH@N+q;kn@I-kkc5K66DuS_Z6KrDKY7RyI09*;fWvU%-gtB;niQErU0 zm*isj!{r@5Xn}%*gn@BrfQ5mHij9PfUyfe}2OBRWtq`cJq8+WUnh>9$sjjjey0H)tuAaQc9f1|Fwgs1#2OS*J)Y8+b*w@wD)!H1| z*x};Wufcfgl`*#qaLw)i7 z zoH>KW+zFGYhMgLD9zY-h0fGes24t9!p{j-j6DCB>;GpUR4OAyM=(>QbRjLa#3_uGO z>HrN@Gf0g)AZ^&Gar5dmTXybOr%e$Eh>L-6)xsGhB#tWqL*v4b9V>pE7=z`>iZc|> ztl2VQ$DKVp7OfcZVa0#}IK>dbvVaB+6ueeo*>VKfu`$SQfI)y|-o6|7?%lifYXPr$ z!>-Mob%f^%8bpZhntE^Fvsq(UkUGIr1<%7n7f-%?_yFe9t6xtZ{rU9?5{QT&pnm=7 z5zyOrUtfX!=lcb?pMU?kmmhlI6)505fd}4aAAtcXfPj1e&?n%97-p#9h8%WyVSMw& lC*p`CmT2OMD5j|5iYbQ3;)^iGD5Huk)M(?4INlfn06R=DYYYGY literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/italic.gif b/e107_handlers/tiny_mce/themes/advanced/images/italic.gif new file mode 100644 index 0000000000000000000000000000000000000000..8bb330bd0bbf61fdb5ce86388ecbeae16465bc17 GIT binary patch literal 79 zcmZ?wbhEHb6k!lySjfl#1T8Hs)z#IEjEssuS%3n}3_2iDkURsE!kqq_+b+wcJF`jEB<5wG8q|kK!gZ`FaraVVo(3d({K5uXIu`5a6TsH a;#+zDYvZ#Uy^qv#6FHB6^105+U=0A})fi&{ literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/italic_ru.gif b/e107_handlers/tiny_mce/themes/advanced/images/italic_ru.gif new file mode 100644 index 0000000000000000000000000000000000000000..a2bb69a725e823b8e671f0640098c4fa80939b2f GIT binary patch literal 78 zcmZ?wbhEHb6k!lyn83i`>+8$Fz@Ye(g^_`QkwFK@28xR?Ffgh1^shYqmVdFy0;Z@$ hzTc5`u943p7fMVz+n$-ed(#4|tKWK`2QxBQ0|3J`7vul{ literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/justifycenter.gif b/e107_handlers/tiny_mce/themes/advanced/images/justifycenter.gif new file mode 100644 index 0000000000000000000000000000000000000000..42d609a991f51b029ef83a1d4a5a978b0cbb4ec8 GIT binary patch literal 70 zcmZ?wbhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz$Dw#zw-23e&HEgu5~nTwS324 TB4E+Ue{v@8s%`JM#Tl#t;~Nqj literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/justifyfull.gif b/e107_handlers/tiny_mce/themes/advanced/images/justifyfull.gif new file mode 100644 index 0000000000000000000000000000000000000000..c8504f626fec70376fc768c92f04f666cea5993c GIT binary patch literal 71 zcmZ?wbhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz$Dkxzw-23e&HEgu1Tz2Ch_jB V?R+t-#i3@;r*3=4EzQbc4FLT|66XK_ literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/justifyleft.gif b/e107_handlers/tiny_mce/themes/advanced/images/justifyleft.gif new file mode 100644 index 0000000000000000000000000000000000000000..e8f7e42769cbfd7a7416aac8faf77f5d8daed320 GIT binary patch literal 71 zcmZ?wbhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz$Dkxzw-23e&HEgu1TytYV(4> UgwLW=vT`Q(s%`JMrCAxQ0qpY;qW}N^ literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/justifyright.gif b/e107_handlers/tiny_mce/themes/advanced/images/justifyright.gif new file mode 100644 index 0000000000000000000000000000000000000000..e4cea971489cf2526bd45b5044e6d3435741f830 GIT binary patch literal 70 zcmZ?wbhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz$Dw#zw-23e&HEgu66Wp{rQ%^ UM8cwz_vB2umD}FE7Gtmm0QJ%n+yDRo literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/left.gif b/e107_handlers/tiny_mce/themes/advanced/images/left.gif new file mode 100644 index 0000000000000000000000000000000000000000..e8f7e42769cbfd7a7416aac8faf77f5d8daed320 GIT binary patch literal 71 zcmZ?wbhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz$Dkxzw-23e&HEgu1TytYV(4> UgwLW=vT`Q(s%`JMrCAxQ0qpY;qW}N^ literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/link.gif b/e107_handlers/tiny_mce/themes/advanced/images/link.gif new file mode 100644 index 0000000000000000000000000000000000000000..1accf426260eabe2f3113bab599ee26991407576 GIT binary patch literal 175 zcmV;g08sx&Nk%w1VH5xq0K)|U7cWe7jH1WO&q7mgq_fHP{QhovkA|48(BJg3yUmlM zwNqn#%+lYo$Ksc#!~g&QA^8LW000jFEC2ui02BZe000DB@X1N5y*TU5yZ;lDIEo`Y zBB>;nh!jN=5Xl<{ELAJRLi`OvPeCwL9EE`(0V^O727v-Gs1O*6fC9h;473EtqJph4 d4hzK!aZXzV=z)RofG^|jEB<5wG8q|kKzxu40~1#dfBJzLcf(v(F)&yI02q@C APXGV_ literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/newdocument.gif b/e107_handlers/tiny_mce/themes/advanced/images/newdocument.gif new file mode 100644 index 0000000000000000000000000000000000000000..a9d293842354bade04fc9607e55763fd0ea9efec GIT binary patch literal 170 zcmV;b09F4-Nk%w1VH5xq0K*0VGD>2SqO#J~;-aN z((?HJ(%tf+t-`|0-T(jqA^8LW000jFEC2ui02BZe000D6@X1N5y*TTfdRNNeY>8o> z4KQZPc^-wzx@G{}*+AEJzAuCxrm-U+gcqV~fj9y(hozB$v;>w-LA7!<0TB$xmeMs$ Y1>z^>8fd%Q>Wl40uW#=7ygmW|J7pwMu>b%7 literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/numlist.gif b/e107_handlers/tiny_mce/themes/advanced/images/numlist.gif new file mode 100644 index 0000000000000000000000000000000000000000..a2683522f4fbca7c59cdce63c7ac20211e006f49 GIT binary patch literal 111 zcmV-#0FeJjNk%w1VH5xq0I~%D0s;a&S(>c5(MoQ;hMLOK*yvJx*8l(jA^8LW000L7 zEC2ui02BZe0009tc)HyFFv>|=F}0bofd8LU3_`XHL13_jZKS5jZLdL qklCGA#V($?Eohv$~E=l}o!A^8LW000L7 zEC2ui02BZe0009sc)HyFFv__Ay%A`;yT+FxC|=hX#Xykdw-jk0V}u~DM=9B?30|g_ Q>jw#1h)7a$IY|HjJN(2Zp#T5? literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/paste.gif b/e107_handlers/tiny_mce/themes/advanced/images/paste.gif new file mode 100644 index 0000000000000000000000000000000000000000..1b45000a0140b8f9e04c933154c915f4322d7533 GIT binary patch literal 286 zcmV+(0pb2fNk%w1VH5xq0Mr}+LNg;3tk`X`X1Rt{>*It?NM0VL6(E zVp#@75XZ#A7$__!UdC~NbOwn>K!P;!f|hLd!H_&o5ubBI-bl_Ku=A;)xD5t@Ks^{# z+MN7ifk2od9Tj&Q6dVnQ7YGCeB^rSW3L6F-dlv)<1qEp%4jqtY1`CG`6a;PnBn}E^ kX95eB1O$f^sHqkY9smLtZoQ`}2mr#v!!X9j$Rr^EJMbBDr~m)} literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/quote.gif b/e107_handlers/tiny_mce/themes/advanced/images/quote.gif new file mode 100644 index 0000000000000000000000000000000000000000..2ef31c97eab5d605783ad6af8108267b1ba28621 GIT binary patch literal 75 zcmZ?wbhEHb6k!lyXkcW30L7myKqe!D4u}hqVPI0~>0f#JE&t*Hm VRbAPsxt%SY_4p^B>mG~@)&MsZ6R`jQ literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/redo.gif b/e107_handlers/tiny_mce/themes/advanced/images/redo.gif new file mode 100644 index 0000000000000000000000000000000000000000..3af90697f0b74d0b6b07b585614a6dc67ff87f1d GIT binary patch literal 169 zcmV;a09OA;Nk%w1VH5xq0K*FaEl-kjqwqa)*O$8QUUsNeit)O{)H!9gj;!cSf8=SD z@4U+CH(H=qeZQ%{>Hq)$A^8LW000jFEC2ui02BZe000D5@X1N5y*TU5@mkK(Nsfb@ zh`52taWqPx3Yb$cP21Nib_4)BqDn)z literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/removeformat.gif b/e107_handlers/tiny_mce/themes/advanced/images/removeformat.gif new file mode 100644 index 0000000000000000000000000000000000000000..0fa3cb79734b6ddadaded7a30dbbab4cdf7ee11a GIT binary patch literal 168 zcmV;Z09XG3d^!9RvqL!@E;^*>mjX*~6o0ZXGB7YP=m6P3N(4x7O<|q5`t188u7e^B F)&TE55J&(3 literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/spacer.gif b/e107_handlers/tiny_mce/themes/advanced/images/spacer.gif new file mode 100644 index 0000000000000000000000000000000000000000..388486517fa8da13ebd150e8f65d5096c3e10c3a GIT binary patch literal 43 ncmZ?wbhEHbWMp7un7{x9ia%KxMSyG_5FaGNz{KRj$Y2csb)f_x literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/statusbar_resize.gif b/e107_handlers/tiny_mce/themes/advanced/images/statusbar_resize.gif new file mode 100644 index 0000000000000000000000000000000000000000..af89d803f8f0eeb965d9443473d5be009641cacf GIT binary patch literal 79 zcmZ?wbhEHbX*~6o0ZXGB7YP=m6OaAbAERg(>|jPrv0~%%#ha d_MXKm)lqT2YSDtso)?w9Z@gz^T^C`n1_07v8bkm9 literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/strikethrough.gif b/e107_handlers/tiny_mce/themes/advanced/images/strikethrough.gif new file mode 100644 index 0000000000000000000000000000000000000000..3264635918e2237257811a745f3a7e31b4369432 GIT binary patch literal 83 zcmZ?wbhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz@*jFzw-23{>5`RB^ury^=8j) h^eUTr??>*V8C&%_D;C}?e9svC>)iK$`!yICtN}048)X0h literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/sub.gif b/e107_handlers/tiny_mce/themes/advanced/images/sub.gif new file mode 100644 index 0000000000000000000000000000000000000000..4d7ce30ff9147412d24dafd5ebeef67479edfa58 GIT binary patch literal 148 zcmV;F0Biq8Nk%w1VH5xq0K*9Y0|NsxQi79`kcOJVNJU7aqM%ZC%4un5GBq-gVG=Kt8X#(^7ugLSm;_S64DJ zGIDZqhMK}68X{71!TeAXEkg0%mX10Jt7ez-i0vdcUU#06Sc5 BF?Rp} literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/table.gif b/e107_handlers/tiny_mce/themes/advanced/images/table.gif new file mode 100644 index 0000000000000000000000000000000000000000..2911830c3cd9cfb588114b40205ac316ded37716 GIT binary patch literal 287 zcmV+)0pR{eNk%w1VH5xq0Mr-&4-XG=a&q$Gl8~UV)yls!N@Iej^5Wv+vYk|?#{7~x zGT6sxlB&Y;^7(>_g2~h3+KzIM(yqDEw{v33+VWCfYLcq*{{H^LvU=X>{iCqL z#mds6qN19*_y7O^A^8LW0018VEC2ui02BZe000G?;3tk`X`X1B5)?(KB@00mJQCSN zE9B*0hM>X2$p{t>MWmN#dOXbs;)npedOjg>x~OhU6O8zQIdH3l0a%P7cOqTD;bAdt z9{7i*gQ;>J6LlpUY-9lzat#_A1ttt^9EFODjU@vQ92^px5)&Jr43#7UY!VHM8yXcA lp(dna6O$XO2?L@dmz|!U8w?Bswyp)k#Kpum$jK!k06V*Ud_@2N literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/table_delete_col.gif b/e107_handlers/tiny_mce/themes/advanced/images/table_delete_col.gif new file mode 100644 index 0000000000000000000000000000000000000000..91f53af02aacbe33b04f782efb164560887d3bfe GIT binary patch literal 163 zcmV;U09^k^Nk%w1VH5xq0K*Fa0s;azZ{ony{xV8pTyKn*qO$Jn>V2Z^b%c^$j^>)S z^85Syjgq3Ovcf`IasU7TA^8LW000jFEC2ui02BZe000C~@X1N5y*TU5Yg=F;j03m~ z*9S7AQZ5E+6`;WiE*xJ4;S4OrVLD zq^HC5lAo_~pYs0x{r~^~A^8LW000jFEC2ui02BZe000D7@X1N5y*TU5>G|Nna879^ z3V9~RxRnWO7y-xJIHT+-78`=#Vo@mc9)Jo^FeDZl1O#9@r7(*PC}E43Bq@Wics$6M ZU5s;*CQxUf_d3_{csz*D~813(lGjTD@2z{n9^mxAJO7)Ys5OF}UnY`dU@qbmky T#N$E3kp`{PZ$%b~i~s;TfG0;) literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/table_insert_row_after.gif b/e107_handlers/tiny_mce/themes/advanced/images/table_insert_row_after.gif new file mode 100644 index 0000000000000000000000000000000000000000..b9c14466138007454958671320914d9a7d8a6db5 GIT binary patch literal 163 zcmV;U09^k^Nk%w1VH5xq0K*Od0s;b3hwZ}J{xV8pU2lbto3eVM^5XCQa(@5FN<(eWPqQV3Ig1XGua#QiUNM~QhRb*u41x>)iK!0SpY*0G3P}*Z=?k literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/underline_es.gif b/e107_handlers/tiny_mce/themes/advanced/images/underline_es.gif new file mode 100644 index 0000000000000000000000000000000000000000..551d9148d302c5f58b3b20d2c6a642450889a7ef GIT binary patch literal 79 zcmZ?wbhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz@*mGzw-23e(4zsAr}6}u9vvi dPIT?{=$xyxd19dGtWDy_KKDM~70ke34FHj_7K8u* literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/underline_fr.gif b/e107_handlers/tiny_mce/themes/advanced/images/underline_fr.gif new file mode 100644 index 0000000000000000000000000000000000000000..551d9148d302c5f58b3b20d2c6a642450889a7ef GIT binary patch literal 79 zcmZ?wbhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz@*mGzw-23e(4zsAr}6}u9vvi dPIT?{=$xyxd19dGtWDy_KKDM~70ke34FHj_7K8u* literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/underline_ru.gif b/e107_handlers/tiny_mce/themes/advanced/images/underline_ru.gif new file mode 100644 index 0000000000000000000000000000000000000000..b78e2a498fb9406ef378d7c543756db552d87cba GIT binary patch literal 77 zcmZ?wbhEHb6k!lyn83i`>+8$Fz@Ye(g^_`QkwFK@28xR?Ffgg~^shYqmVYseNK2Ny ft@O9qnGc`Wq;$3l?I>E+zBOCw^tWDnRt9STq^=gR literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/undo.gif b/e107_handlers/tiny_mce/themes/advanced/images/undo.gif new file mode 100644 index 0000000000000000000000000000000000000000..520796d69defa118055d191eec33cc67f7551710 GIT binary patch literal 175 zcmV;g08sx&Nk%w1VH5xq0K*FaI$fTWtk6Go+_}Zyr?=K#e#T#ZwX4DHa-Hu#XSz{; z-OtzKVv^{Tv+z=g@&Et;A^8LW000jFEC2ui02BZe000DB@X1N5y*TU5^*Z3vJx60U zVAe<_A|#2DUTDd{g#kDRhWrRvKmt&#E(`|)VHiweM~gz>Krlp-Snncu!2ps)!r>e} d2m*##Qg9H=3xcDt9yk2euEN*a>RflBvc=VMi?aIs{*Scsi=V=*#PZ+j z{;astf|jzv(Biz+@&Et;A^8LW000jFEC2ui02BZe000Dg@X1N5y*TU5Y5N}`E=ypZ zo?#$r>naM6uI>xVQ-d%k;xmkbaDbB#Q~{NMWoQ&&iQ?mEND2guCgGWgQWh%TE;t;R zrC?g~sYnb2jsrT}bhh1bIVEWT3JYd|XL~9PPy-4A2LldqQhZ!)ii>%V0GF7VnjM^- Io)i%PJHdZeUH||9 literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/xp/tab_bg.gif b/e107_handlers/tiny_mce/themes/advanced/images/xp/tab_bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..897a01f2baea1ae5f61f642f508c27f356b35260 GIT binary patch literal 694 zcmV;n0!jTxNk%w1VUPh50K@Fo9O z^8Eb#`uh6u@89F;?DO;Q@$v2O@aq2l{`U6r`uh3s@ay>a_VV)W^z`ua^X~Tc^Y!)d z@$u}Dr?mh7{{R30A^8LV00000EC2ui0FVI^000I5U_%&PX`X1Ru59bRa4gSsZQppV z?|kpu1Vq9^EE3jl(HgoTEOh>41ejE#aB*8r|OC z;Njxq>Ry;kxw7TUm@{kM z%(=7Y&!9t#9!C>oFt6t5TbcX>0AjqCgySDAyxO3~?&AYen-@t=y!-i+yC*K5ef#nAwj*aBzkGe++J%)n_rHGi z_~ZNgpFh5P|L(<$r}sa8c>VI(gJ+NLe*5z2!~0iHAKiNQ_Sx$f58u3gI&t|H25dm_ zCkt3u2SkGGWMEZW;Gomm$lxyIF~cPBOsnm+7=M9lPo_41opD-0LNQ51q(`+gvyFkl F8UVy~RVDxc literal 0 HcmV?d00001 diff --git a/e107_handlers/tiny_mce/themes/advanced/images/xp/tab_sel_bg.gif b/e107_handlers/tiny_mce/themes/advanced/images/xp/tab_sel_bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..9dc8abe1a4f20643367ea9548fa2d93be7f0fb0b GIT binary patch literal 428 zcmV;d0aN}*Nk%w1VJrbC0J8u9k(-?1#*X>8IO~@#-Jw(NpE2?8-}$*X|HwS%i!A@g zJpcdy{QUj^0000000000A^8LV00000EC2ui04xD0000F4(1ekyy*TU5yZ>M)j$~<` zXsV(?aUgIk&vb3yc&_h!@BhG{a7Zi;2?B+3$!t2G(5Q4uty-_xtai)odcR%(V@xia z&uH^v&2GEj@VIuMl4*~XmY0~BntqX! zo@AS$qNAjxdYzx1rmL*2u8ydwlCQM2wzqGwvV^$3zQ3WmyOhAi#>ard!)M6N&d+hm z%Vp5j*2mJ*W7pi>w%OX=;^U>@)8y#sm*(2-?(gvN^7Hid)9m*7`uqI-{{IZ{0USuM zpuvOl1R`9>u%W|(3Li?GNU@@fG5cC(oZi'; + html += '' + tinyMCE.getLang('lang_author') + ''; + html += '' + tinyMCE.getLang('lang_version') + ''; + html += ''; + html += ''; + html += ''; + + for (var i=0; i' + info.longname + ''; + else + html += '' + info.longname + ''; + + if (info.authorurl != null && info.authorurl != '') + html += '' + info.author + ''; + else + html += '' + info.author + ''; + + html += '' + info.version + ''; + html += ''; + } + + html += ''; + html += ''; + + tcont.innerHTML = html; +} + +function getPluginInfo(name) { + if (tinyMCE.plugins[name].getInfo) + return tinyMCE.plugins[name].getInfo(); + + return { + longname : name, + authorurl : '', + infourl : '', + author : '--', + version : '--' + }; +} + +function insertHelpIFrame() { + var html = ''; + + document.getElementById('iframecontainer').innerHTML = html; + + html = ''; + html += 'Got Moxie? '; + html += 'Hosted By Sourceforge '; + html += 'Also on freshmeat '; + + document.getElementById('buttoncontainer').innerHTML = html; +} diff --git a/e107_handlers/tiny_mce/themes/advanced/jscripts/anchor.js b/e107_handlers/tiny_mce/themes/advanced/jscripts/anchor.js new file mode 100644 index 000000000..f2e5d4829 --- /dev/null +++ b/e107_handlers/tiny_mce/themes/advanced/jscripts/anchor.js @@ -0,0 +1,74 @@ +var action, element; + +function init() { + tinyMCEPopup.resizeToInnerSize(); + + var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id')); + var anchor = tinyMCE.getParentElement(inst.getFocusElement(), "a", "name"); + var img = inst.getFocusElement(); + action = 'insert'; + + if (anchor != null) { + element = anchor; + action = "update"; + } + + if (tinyMCE.getAttrib(img, "class") == "mceItemAnchor") { + element = img; + action = "update"; + } + + if (action == "update") + document.forms[0].anchorName.value = element.nodeName == "IMG" ? element.getAttribute("title") : element.getAttribute("name"); + + document.forms[0].insert.value = tinyMCE.getLang('lang_' + action, 'Insert', true); +} + +function insertAnchor() { + var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id')); + var name = document.forms[0].anchorName.value, e; + + tinyMCEPopup.execCommand("mceBeginUndoLevel"); + + if (action == "update") { + if (element.nodeName == "IMG") + element.setAttribute("title", name); + else + element.setAttribute("name", name); + } else { + var rng = inst.getRng(); + + if (rng.collapse) + rng.collapse(false); + + name = name.replace(/&/g, '&'); + name = name.replace(/\"/g, '"'); + name = name.replace(//g, '>'); + + // Fix for bug #1447335 + if (tinyMCE.isGecko) + html = ''; + else + html = ''; + + tinyMCEPopup.execCommand("mceInsertContent", false, html); + + // Fix for bug #1447335 force cursor after the anchor element + if (tinyMCE.isGecko) { + e = inst.getDoc().getElementById('mceNewAnchor'); + + if (e) { + inst.selection.selectNode(e, true, false, false); + e.removeAttribute('id'); + } + } + + tinyMCE.handleVisualAid(inst.getBody(), true, inst.visualAid, inst); + } + + tinyMCEPopup.execCommand("mceEndUndoLevel"); + + tinyMCE.triggerNodeChange(); + tinyMCEPopup.close(); +} diff --git a/e107_handlers/tiny_mce/themes/advanced/jscripts/charmap.js b/e107_handlers/tiny_mce/themes/advanced/jscripts/charmap.js new file mode 100644 index 000000000..c4ec3261c --- /dev/null +++ b/e107_handlers/tiny_mce/themes/advanced/jscripts/charmap.js @@ -0,0 +1,326 @@ +function init() { + tinyMCEPopup.resizeToInnerSize(); +} + +var charmap = new Array(); + +// for mor details please see w3c.org +// now here is the complete list ;) + +charmap = [ + [' ', ' ', true, 'no-break space'], + ['&', '&', true, 'ampersand'], + ['"', '"', true, 'quotation mark'], +// finance + ['¢', '¢', true, 'cent sign'], + ['€', '€', true, 'euro sign'], + ['£', '£', true, 'pound sign'], + ['¥', '¥', true, 'yen sign'], +// signs + ['©', '©', true, 'copyright sign'], + ['®', '®', true, 'registered sign'], + ['™', '™', true, 'trade mark sign'], + ['‰', '‰', true, 'per mille sign'], + ['µ', 'µ', true, 'micro sign'], + ['·', '·', true, 'middle dot'], + ['•', '•', true, 'bullet'], + ['…', '…', true, 'three dot leader'], + ['′', '′', true, 'minutes / feet'], + ['″', '″', true, 'seconds / inches'], + ['§', '§', true, 'section sign'], + ['¶', '¶', true, 'paragraph sign'], + ['ß', 'ß', true, 'sharp s / ess-zed'], +// quotations + ['‹', '‹', true, 'single left-pointing angle quotation mark'], + ['›', '›', true, 'single right-pointing angle quotation mark'], + ['«', '«', true, 'left pointing guillemet'], + ['»', '»', true, 'right pointing guillemet'], + ['‘', '‘', true, 'left single quotation mark'], + ['’', '’', true, 'right single quotation mark'], + ['“', '“', true, 'left double quotation mark'], + ['”', '”', true, 'right double quotation mark'], + ['‚', '‚', true, 'single low-9 quotation mark'], + ['„', '„', true, 'double low-9 quotation mark'], + ['<', '<', true, 'less-than sign'], + ['>', '>', true, 'greater-than sign'], + ['≤', '≤', true, 'less-than or equal to'], + ['≥', '≥', true, 'greater-than or equal to'], + ['–', '–', true, 'en dash'], + ['—', '—', true, 'em dash'], + ['¯', '¯', true, 'macron'], + ['‾', '‾', true, 'overline'], + ['¤', '¤', true, 'currency sign'], + ['¦', '¦', true, 'broken bar'], + ['¨', '¨', true, 'diaeresis'], + ['¡', '¡', true, 'inverted exclamation mark'], + ['¿', '¿', true, 'turned question mark'], + ['ˆ', 'ˆ', true, 'circumflex accent'], + ['˜', '˜', true, 'small tilde'], + ['°', '°', true, 'degree sign'], + ['−', '−', true, 'minus sign'], + ['±', '±', true, 'plus-minus sign'], + ['÷', '÷', true, 'division sign'], + ['⁄', '⁄', true, 'fraction slash'], + ['×', '×', true, 'multiplication sign'], + ['¹', '¹', true, 'superscript one'], + ['²', '²', true, 'superscript two'], + ['³', '³', true, 'superscript three'], + ['¼', '¼', true, 'fraction one quarter'], + ['½', '½', true, 'fraction one half'], + ['¾', '¾', true, 'fraction three quarters'], +// math / logical + ['ƒ', 'ƒ', true, 'function / florin'], + ['∫', '∫', true, 'integral'], + ['∑', '∑', true, 'n-ary sumation'], + ['∞', '∞', true, 'infinity'], + ['√', '√', true, 'square root'], + ['∼', '∼', false,'similar to'], + ['≅', '≅', false,'approximately equal to'], + ['≈', '≈', true, 'almost equal to'], + ['≠', '≠', true, 'not equal to'], + ['≡', '≡', true, 'identical to'], + ['∈', '∈', false,'element of'], + ['∉', '∉', false,'not an element of'], + ['∋', '∋', false,'contains as member'], + ['∏', '∏', true, 'n-ary product'], + ['∧', '∧', false,'logical and'], + ['∨', '∨', false,'logical or'], + ['¬', '¬', true, 'not sign'], + ['∩', '∩', true, 'intersection'], + ['∪', '∪', false,'union'], + ['∂', '∂', true, 'partial differential'], + ['∀', '∀', false,'for all'], + ['∃', '∃', false,'there exists'], + ['∅', '∅', false,'diameter'], + ['∇', '∇', false,'backward difference'], + ['∗', '∗', false,'asterisk operator'], + ['∝', '∝', false,'proportional to'], + ['∠', '∠', false,'angle'], +// undefined + ['´', '´', true, 'acute accent'], + ['¸', '¸', true, 'cedilla'], + ['ª', 'ª', true, 'feminine ordinal indicator'], + ['º', 'º', true, 'masculine ordinal indicator'], + ['†', '†', true, 'dagger'], + ['‡', '‡', true, 'double dagger'], +// alphabetical special chars + ['À', 'À', true, 'A - grave'], + ['Á', 'Á', true, 'A - acute'], + ['Â', 'Â', true, 'A - circumflex'], + ['Ã', 'Ã', true, 'A - tilde'], + ['Ä', 'Ä', true, 'A - diaeresis'], + ['Å', 'Å', true, 'A - ring above'], + ['Æ', 'Æ', true, 'ligature AE'], + ['Ç', 'Ç', true, 'C - cedilla'], + ['È', 'È', true, 'E - grave'], + ['É', 'É', true, 'E - acute'], + ['Ê', 'Ê', true, 'E - circumflex'], + ['Ë', 'Ë', true, 'E - diaeresis'], + ['Ì', 'Ì', true, 'I - grave'], + ['Í', 'Í', true, 'I - acute'], + ['Î', 'Î', true, 'I - circumflex'], + ['Ï', 'Ï', true, 'I - diaeresis'], + ['Ð', 'Ð', true, 'ETH'], + ['Ñ', 'Ñ', true, 'N - tilde'], + ['Ò', 'Ò', true, 'O - grave'], + ['Ó', 'Ó', true, 'O - acute'], + ['Ô', 'Ô', true, 'O - circumflex'], + ['Õ', 'Õ', true, 'O - tilde'], + ['Ö', 'Ö', true, 'O - diaeresis'], + ['Ø', 'Ø', true, 'O - slash'], + ['Œ', 'Œ', true, 'ligature OE'], + ['Š', 'Š', true, 'S - caron'], + ['Ù', 'Ù', true, 'U - grave'], + ['Ú', 'Ú', true, 'U - acute'], + ['Û', 'Û', true, 'U - circumflex'], + ['Ü', 'Ü', true, 'U - diaeresis'], + ['Ý', 'Ý', true, 'Y - acute'], + ['Ÿ', 'Ÿ', true, 'Y - diaeresis'], + ['Þ', 'Þ', true, 'THORN'], + ['à', 'à', true, 'a - grave'], + ['á', 'á', true, 'a - acute'], + ['â', 'â', true, 'a - circumflex'], + ['ã', 'ã', true, 'a - tilde'], + ['ä', 'ä', true, 'a - diaeresis'], + ['å', 'å', true, 'a - ring above'], + ['æ', 'æ', true, 'ligature ae'], + ['ç', 'ç', true, 'c - cedilla'], + ['è', 'è', true, 'e - grave'], + ['é', 'é', true, 'e - acute'], + ['ê', 'ê', true, 'e - circumflex'], + ['ë', 'ë', true, 'e - diaeresis'], + ['ì', 'ì', true, 'i - grave'], + ['í', 'í', true, 'i - acute'], + ['î', 'î', true, 'i - circumflex'], + ['ï', 'ï', true, 'i - diaeresis'], + ['ð', 'ð', true, 'eth'], + ['ñ', 'ñ', true, 'n - tilde'], + ['ò', 'ò', true, 'o - grave'], + ['ó', 'ó', true, 'o - acute'], + ['ô', 'ô', true, 'o - circumflex'], + ['õ', 'õ', true, 'o - tilde'], + ['ö', 'ö', true, 'o - diaeresis'], + ['ø', 'ø', true, 'o slash'], + ['œ', 'œ', true, 'ligature oe'], + ['š', 'š', true, 's - caron'], + ['ù', 'ù', true, 'u - grave'], + ['ú', 'ú', true, 'u - acute'], + ['û', 'û', true, 'u - circumflex'], + ['ü', 'ü', true, 'u - diaeresis'], + ['ý', 'ý', true, 'y - acute'], + ['þ', 'þ', true, 'thorn'], + ['ÿ', 'ÿ', true, 'y - diaeresis'], + ['Α', 'Α', true, 'Alpha'], + ['Β', 'Β', true, 'Beta'], + ['Γ', 'Γ', true, 'Gamma'], + ['Δ', 'Δ', true, 'Delta'], + ['Ε', 'Ε', true, 'Epsilon'], + ['Ζ', 'Ζ', true, 'Zeta'], + ['Η', 'Η', true, 'Eta'], + ['Θ', 'Θ', true, 'Theta'], + ['Ι', 'Ι', true, 'Iota'], + ['Κ', 'Κ', true, 'Kappa'], + ['Λ', 'Λ', true, 'Lambda'], + ['Μ', 'Μ', true, 'Mu'], + ['Ν', 'Ν', true, 'Nu'], + ['Ξ', 'Ξ', true, 'Xi'], + ['Ο', 'Ο', true, 'Omicron'], + ['Π', 'Π', true, 'Pi'], + ['Ρ', 'Ρ', true, 'Rho'], + ['Σ', 'Σ', true, 'Sigma'], + ['Τ', 'Τ', true, 'Tau'], + ['Υ', 'Υ', true, 'Upsilon'], + ['Φ', 'Φ', true, 'Phi'], + ['Χ', 'Χ', true, 'Chi'], + ['Ψ', 'Ψ', true, 'Psi'], + ['Ω', 'Ω', true, 'Omega'], + ['α', 'α', true, 'alpha'], + ['β', 'β', true, 'beta'], + ['γ', 'γ', true, 'gamma'], + ['δ', 'δ', true, 'delta'], + ['ε', 'ε', true, 'epsilon'], + ['ζ', 'ζ', true, 'zeta'], + ['η', 'η', true, 'eta'], + ['θ', 'θ', true, 'theta'], + ['ι', 'ι', true, 'iota'], + ['κ', 'κ', true, 'kappa'], + ['λ', 'λ', true, 'lambda'], + ['μ', 'μ', true, 'mu'], + ['ν', 'ν', true, 'nu'], + ['ξ', 'ξ', true, 'xi'], + ['ο', 'ο', true, 'omicron'], + ['π', 'π', true, 'pi'], + ['ρ', 'ρ', true, 'rho'], + ['ς', 'ς', true, 'final sigma'], + ['σ', 'σ', true, 'sigma'], + ['τ', 'τ', true, 'tau'], + ['υ', 'υ', true, 'upsilon'], + ['φ', 'φ', true, 'phi'], + ['χ', 'χ', true, 'chi'], + ['ψ', 'ψ', true, 'psi'], + ['ω', 'ω', true, 'omega'], +// symbols + ['ℵ', 'ℵ', false,'alef symbol'], + ['ϖ', 'ϖ', false,'pi symbol'], + ['ℜ', 'ℜ', false,'real part symbol'], + ['ϑ','ϑ', false,'theta symbol'], + ['ϒ', 'ϒ', false,'upsilon - hook symbol'], + ['℘', '℘', false,'Weierstrass p'], + ['ℑ', 'ℑ', false,'imaginary part'], +// arrows + ['←', '←', true, 'leftwards arrow'], + ['↑', '↑', true, 'upwards arrow'], + ['→', '→', true, 'rightwards arrow'], + ['↓', '↓', true, 'downwards arrow'], + ['↔', '↔', true, 'left right arrow'], + ['↵', '↵', false,'carriage return'], + ['⇐', '⇐', false,'leftwards double arrow'], + ['⇑', '⇑', false,'upwards double arrow'], + ['⇒', '⇒', false,'rightwards double arrow'], + ['⇓', '⇓', false,'downwards double arrow'], + ['⇔', '⇔', false,'left right double arrow'], + ['∴', '∴', false,'therefore'], + ['⊂', '⊂', false,'subset of'], + ['⊃', '⊃', false,'superset of'], + ['⊄', '⊄', false,'not a subset of'], + ['⊆', '⊆', false,'subset of or equal to'], + ['⊇', '⊇', false,'superset of or equal to'], + ['⊕', '⊕', false,'circled plus'], + ['⊗', '⊗', false,'circled times'], + ['⊥', '⊥', false,'perpendicular'], + ['⋅', '⋅', false,'dot operator'], + ['⌈', '⌈', false,'left ceiling'], + ['⌉', '⌉', false,'right ceiling'], + ['⌊', '⌊', false,'left floor'], + ['⌋', '⌋', false,'right floor'], + ['⟨', '〈', false,'left-pointing angle bracket'], + ['⟩', '〉', false,'right-pointing angle bracket'], + ['◊', '◊', true,'lozenge'], + ['♠', '♠', false,'black spade suit'], + ['♣', '♣', true, 'black club suit'], + ['♥', '♥', true, 'black heart suit'], + ['♦', '♦', true, 'black diamond suit'], + [' ', ' ', false,'en space'], + [' ', ' ', false,'em space'], + [' ', ' ', false,'thin space'], + ['‌', '‌', false,'zero width non-joiner'], + ['‍', '‍', false,'zero width joiner'], + ['‎', '‎', false,'left-to-right mark'], + ['‏', '‏', false,'right-to-left mark'], + ['­', '­', false,'soft hyphen'] +]; + +function renderCharMapHTML() { + var charsPerRow = 20, tdWidth=20, tdHeight=20; + var html = ''; + var cols=-1; + for (var i=0; i' + + charmap[i][1] + + ''; + if ((cols+1) % charsPerRow == 0) + html += ''; + } + } + if (cols % charsPerRow > 0) { + var padd = charsPerRow - (cols % charsPerRow); + for (var i=0; i '; + } + html += '
    '; + document.write(html); +} + +function insertChar(chr) { + tinyMCEPopup.execCommand('mceInsertContent', false, '&#' + chr + ';'); + + // Refocus in window + if (tinyMCEPopup.isWindow) + window.focus(); + + tinyMCEPopup.close(); +} + +function previewChar(codeA, codeB, codeN) { + var elmA = document.getElementById('codeA'); + var elmB = document.getElementById('codeB'); + var elmV = document.getElementById('codeV'); + var elmN = document.getElementById('codeN'); + + if (codeA=='#160;') { + elmV.innerHTML = '__'; + } else { + elmV.innerHTML = '&' + codeA; + } + + elmB.innerHTML = '&' + codeA; + elmA.innerHTML = '&' + codeB; + elmN.innerHTML = codeN; +} diff --git a/e107_handlers/tiny_mce/themes/advanced/jscripts/color_picker.js b/e107_handlers/tiny_mce/themes/advanced/jscripts/color_picker.js new file mode 100644 index 000000000..aa80714ad --- /dev/null +++ b/e107_handlers/tiny_mce/themes/advanced/jscripts/color_picker.js @@ -0,0 +1,108 @@ +function init() { + if (tinyMCE.isMSIE) + tinyMCEPopup.resizeToInnerSize(); +} + +function selectColor() { + var color = document.getElementById("selectedColorBox").value; + + tinyMCEPopup.execCommand(tinyMCE.getWindowArg('command'), false, color); + tinyMCEPopup.close(); +} + +function showColor(color) { + document.getElementById("selectedColor").style.backgroundColor = color; + document.getElementById("selectedColorBox").value = color; +} + +var colors = new Array( + "#000000","#000033","#000066","#000099","#0000cc","#0000ff","#330000","#330033", + "#330066","#330099","#3300cc","#3300ff","#660000","#660033","#660066","#660099", + "#6600cc","#6600ff","#990000","#990033","#990066","#990099","#9900cc","#9900ff", + "#cc0000","#cc0033","#cc0066","#cc0099","#cc00cc","#cc00ff","#ff0000","#ff0033", + "#ff0066","#ff0099","#ff00cc","#ff00ff","#003300","#003333","#003366","#003399", + "#0033cc","#0033ff","#333300","#333333","#333366","#333399","#3333cc","#3333ff", + "#663300","#663333","#663366","#663399","#6633cc","#6633ff","#993300","#993333", + "#993366","#993399","#9933cc","#9933ff","#cc3300","#cc3333","#cc3366","#cc3399", + "#cc33cc","#cc33ff","#ff3300","#ff3333","#ff3366","#ff3399","#ff33cc","#ff33ff", + "#006600","#006633","#006666","#006699","#0066cc","#0066ff","#336600","#336633", + "#336666","#336699","#3366cc","#3366ff","#666600","#666633","#666666","#666699", + "#6666cc","#6666ff","#996600","#996633","#996666","#996699","#9966cc","#9966ff", + "#cc6600","#cc6633","#cc6666","#cc6699","#cc66cc","#cc66ff","#ff6600","#ff6633", + "#ff6666","#ff6699","#ff66cc","#ff66ff","#009900","#009933","#009966","#009999", + "#0099cc","#0099ff","#339900","#339933","#339966","#339999","#3399cc","#3399ff", + "#669900","#669933","#669966","#669999","#6699cc","#6699ff","#999900","#999933", + "#999966","#999999","#9999cc","#9999ff","#cc9900","#cc9933","#cc9966","#cc9999", + "#cc99cc","#cc99ff","#ff9900","#ff9933","#ff9966","#ff9999","#ff99cc","#ff99ff", + "#00cc00","#00cc33","#00cc66","#00cc99","#00cccc","#00ccff","#33cc00","#33cc33", + "#33cc66","#33cc99","#33cccc","#33ccff","#66cc00","#66cc33","#66cc66","#66cc99", + "#66cccc","#66ccff","#99cc00","#99cc33","#99cc66","#99cc99","#99cccc","#99ccff", + "#cccc00","#cccc33","#cccc66","#cccc99","#cccccc","#ccccff","#ffcc00","#ffcc33", + "#ffcc66","#ffcc99","#ffcccc","#ffccff","#00ff00","#00ff33","#00ff66","#00ff99", + "#00ffcc","#00ffff","#33ff00","#33ff33","#33ff66","#33ff99","#33ffcc","#33ffff", + "#66ff00","#66ff33","#66ff66","#66ff99","#66ffcc","#66ffff","#99ff00","#99ff33", + "#99ff66","#99ff99","#99ffcc","#99ffff","#ccff00","#ccff33","#ccff66","#ccff99", + "#ccffcc","#ccffff","#ffff00","#ffff33","#ffff66","#ffff99","#ffffcc","#ffffff" +); + +function convertRGBToHex(col) { + var re = new RegExp("rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)", "gi"); + + var rgb = col.replace(re, "$1,$2,$3").split(','); + if (rgb.length == 3) { + r = parseInt(rgb[0]).toString(16); + g = parseInt(rgb[1]).toString(16); + b = parseInt(rgb[2]).toString(16); + + r = r.length == 1 ? '0' + r : r; + g = g.length == 1 ? '0' + g : g; + b = b.length == 1 ? '0' + b : b; + + return "#" + r + g + b; + } + + return col; +} + +function convertHexToRGB(col) { + if (col.indexOf('#') != -1) { + col = col.replace(new RegExp('[^0-9A-F]', 'gi'), ''); + + r = parseInt(col.substring(0, 2), 16); + g = parseInt(col.substring(2, 4), 16); + b = parseInt(col.substring(4, 6), 16); + + return "rgb(" + r + "," + g + "," + b + ")"; + } + + return col; +} + +function renderColorMap() { + var html = ""; + var inputColor = convertRGBToHex(tinyMCE.getWindowArg('input_color')); + + html += '' + + ''; + for (var i=0; i' + + '' + + '' + colors[i] +  ''; + if ((i+1) % 18 == 0) + html += ''; + } + html += '' + + '
    ' + + '' + + '' + + '
    ' + + '' + + '' + + '' + + '
    ' + + '
    ' + + '
    ' + + '
    '; + + document.write(html); +} \ No newline at end of file diff --git a/e107_handlers/tiny_mce/themes/advanced/jscripts/image.js b/e107_handlers/tiny_mce/themes/advanced/jscripts/image.js new file mode 100644 index 000000000..950c043ab --- /dev/null +++ b/e107_handlers/tiny_mce/themes/advanced/jscripts/image.js @@ -0,0 +1,81 @@ +var url = tinyMCE.getParam("external_image_list_url"); +if (url != null) { + // Fix relative + if (url.charAt(0) != '/' && url.indexOf('://') == -1) + url = tinyMCE.documentBasePath + "/" + url; + + document.write(''); +} + +function insertImage() { + var src = document.forms[0].src.value; + var alt = document.forms[0].alt.value; + var border = document.forms[0].border.value; + var vspace = document.forms[0].vspace.value; + var hspace = document.forms[0].hspace.value; + var width = document.forms[0].width.value; + var height = document.forms[0].height.value; + var align = document.forms[0].align.options[document.forms[0].align.selectedIndex].value; + + tinyMCEPopup.restoreSelection(); + tinyMCE.themes['advanced']._insertImage(src, alt, border, hspace, vspace, width, height, align); + tinyMCEPopup.close(); +} + +function init() { + tinyMCEPopup.resizeToInnerSize(); + + document.getElementById('srcbrowsercontainer').innerHTML = getBrowserHTML('srcbrowser','src','image','theme_advanced_image'); + + var formObj = document.forms[0]; + + for (var i=0; i 0) { + for (var i=0; i'); +} + +function init() { + tinyMCEPopup.resizeToInnerSize(); + + document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser','href','file','theme_advanced_link'); + + // Handle file browser + if (isVisible('hrefbrowser')) + document.getElementById('href').style.width = '180px'; + + var formObj = document.forms[0]; + + for (var i=0; i 0) { + var formObj = document.forms[0]; + + for (var i=0; i + + {$lang_insert_link_title} + + + + + + + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    + + + + +
     
    +
    +
    +
    + +
    +
    + +
    + +
    + +
    +
    +
    + + diff --git a/e107_handlers/tiny_mce/themes/advanced/source_editor.htm b/e107_handlers/tiny_mce/themes/advanced/source_editor.htm new file mode 100644 index 000000000..84fbb4981 --- /dev/null +++ b/e107_handlers/tiny_mce/themes/advanced/source_editor.htm @@ -0,0 +1,32 @@ + + + + {$lang_theme_code_title} + + + + + +
    +
    {$lang_theme_code_title}
    + +
    + +
    + +
    + + + +
    +
    + +
    + +
    + +
    +
    +
    + + diff --git a/e107_handlers/tiny_mce/tiny_mce.js b/e107_handlers/tiny_mce/tiny_mce.js new file mode 100644 index 000000000..00920a20b --- /dev/null +++ b/e107_handlers/tiny_mce/tiny_mce.js @@ -0,0 +1 @@ +function TinyMCE_Engine(){var ua;this.majorVersion="2";this.minorVersion="0.8";this.releaseDate="2006-10-23";this.instances=new Array();this.switchClassCache=new Array();this.windowArgs=new Array();this.loadedFiles=new Array();this.pendingFiles=new Array();this.loadingIndex=0;this.configs=new Array();this.currentConfig=0;this.eventHandlers=new Array();this.log=new Array();this.undoLevels=[];this.undoIndex=0;this.typingUndoIndex=-1;ua=navigator.userAgent;this.isMSIE=(navigator.appName=="Microsoft Internet Explorer");this.isMSIE5=this.isMSIE&&(ua.indexOf('MSIE 5')!=-1);this.isMSIE5_0=this.isMSIE&&(ua.indexOf('MSIE 5.0')!=-1);this.isMSIE7=this.isMSIE&&(ua.indexOf('MSIE 7')!=-1);this.isGecko=ua.indexOf('Gecko')!=-1;this.isSafari=ua.indexOf('Safari')!=-1;this.isOpera=ua.indexOf('Opera')!=-1;this.isMac=ua.indexOf('Mac')!=-1;this.isNS7=ua.indexOf('Netscape/7')!=-1;this.isNS71=ua.indexOf('Netscape/7.1')!=-1;this.dialogCounter=0;this.plugins=new Array();this.themes=new Array();this.menus=new Array();this.loadedPlugins=new Array();this.buttonMap=new Array();this.isLoaded=false;if(this.isOpera){this.isMSIE=true;this.isGecko=false;this.isSafari=false}this.isIE=this.isMSIE;this.isRealIE=this.isMSIE&&!this.isOpera;this.idCounter=0};TinyMCE_Engine.prototype={init:function(settings){var theme,nl,baseHREF="",i;if(this.isMSIE5_0)return;this.settings=settings;if(typeof(document.execCommand)=='undefined')return;if(!tinyMCE.baseURL){var elements=document.getElementsByTagName('script');nl=document.getElementsByTagName('base');for(i=0;i');this._def("font_size_classes",'');this._def("font_size_style_values",'xx-small,x-small,small,medium,large,x-large,xx-large',true);this._def("event_elements",'a,img',true);this._def("convert_urls",true);this._def("table_inline_editing",false);this._def("object_resizing",true);this._def("custom_shortcuts",true);this._def("convert_on_click",false);this._def("content_css",'');this._def("fix_list_elements",false);this._def("fix_table_elements",false);this._def("strict_loading_mode",document.contentType=='application/xhtml+xml');this._def("hidden_tab_class",'');this._def("display_tab_class",'');this._def("gecko_spellcheck",false);if(this.isMSIE&&!this.isOpera)this.settings.strict_loading_mode=false;if(this.isMSIE&&this.settings['browsers'].indexOf('msie')==-1)return;if(this.isGecko&&this.settings['browsers'].indexOf('gecko')==-1)return;if(this.isSafari&&this.settings['browsers'].indexOf('safari')==-1)return;if(this.isOpera&&this.settings['browsers'].indexOf('opera')==-1)return;baseHREF=tinyMCE.settings['document_base_url'];var h=document.location.href;var p=h.indexOf('://');if(p>0&&document.location.protocol!="file:"){p=h.indexOf('/',p+3);h=h.substring(0,p);if(baseHREF.indexOf('://')==-1)baseHREF=h+baseHREF;tinyMCE.settings['document_base_url']=baseHREF;tinyMCE.settings['document_base_prefix']=h}if(baseHREF.indexOf('?')!=-1)baseHREF=baseHREF.substring(0,baseHREF.indexOf('?'));this.settings['base_href']=baseHREF.substring(0,baseHREF.lastIndexOf('/'))+"/";theme=this.settings['theme'];this.inlineStrict='A|BR|SPAN|BDO|MAP|OBJECT|IMG|TT|I|B|BIG|SMALL|EM|STRONG|DFN|CODE|Q|SAMP|KBD|VAR|CITE|ABBR|ACRONYM|SUB|SUP|#text|#comment';this.inlineTransitional='A|BR|SPAN|BDO|OBJECT|APPLET|IMG|MAP|IFRAME|TT|I|B|U|S|STRIKE|BIG|SMALL|FONT|BASEFONT|EM|STRONG|DFN|CODE|Q|SAMP|KBD|VAR|CITE|ABBR|ACRONYM|SUB|SUP|INPUT|SELECT|TEXTAREA|LABEL|BUTTON|#text|#comment';this.blockElms='H[1-6]|P|DIV|ADDRESS|PRE|FORM|TABLE|LI|OL|UL|TD|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|FORM|NOSCRIPT|NOFRAMES|MENU|ISINDEX|SAMP';this.blockRegExp=new RegExp("^("+this.blockElms+")$","i");this.posKeyCodes=new Array(13,45,36,35,33,34,37,38,39,40);this.uniqueURL='javascript:TINYMCE_UNIQUEURL();';this.uniqueTag='';this.callbacks=new Array('onInit','getInfo','getEditorTemplate','setupContent','onChange','onPageLoad','handleNodeChange','initInstance','execCommand','getControlHTML','handleEvent','cleanup');this.settings['theme_href']=tinyMCE.baseURL+"/themes/"+theme;if(!tinyMCE.isIE||tinyMCE.isOpera)this.settings['force_br_newlines']=false;if(tinyMCE.getParam("popups_css",false)){var cssPath=tinyMCE.getParam("popups_css","");if(cssPath.indexOf('://')==-1&&cssPath.charAt(0)!='/')this.settings['popups_css']=this.documentBasePath+"/"+cssPath;else this.settings['popups_css']=cssPath}else this.settings['popups_css']=tinyMCE.baseURL+"/themes/"+theme+"/css/editor_popup.css";if(tinyMCE.getParam("editor_css",false)){var cssPath=tinyMCE.getParam("editor_css","");if(cssPath.indexOf('://')==-1&&cssPath.charAt(0)!='/')this.settings['editor_css']=this.documentBasePath+"/"+cssPath;else this.settings['editor_css']=cssPath}else{if(this.settings.editor_css!='')this.settings['editor_css']=tinyMCE.baseURL+"/themes/"+theme+"/css/editor_ui.css"}if(tinyMCE.settings['debug']){var msg="Debug: \n";msg+="baseURL: "+this.baseURL+"\n";msg+="documentBasePath: "+this.documentBasePath+"\n";msg+="content_css: "+this.settings['content_css']+"\n";msg+="popups_css: "+this.settings['popups_css']+"\n";msg+="editor_css: "+this.settings['editor_css']+"\n";alert(msg)}if(this.configs.length==0){if(typeof(TinyMCECompressed)=="undefined"){tinyMCE.addEvent(window,"DOMContentLoaded",TinyMCE_Engine.prototype.onLoad);if(tinyMCE.isRealIE){if(document.body)tinyMCE.addEvent(document.body,"readystatechange",TinyMCE_Engine.prototype.onLoad);else tinyMCE.addEvent(document,"readystatechange",TinyMCE_Engine.prototype.onLoad)}tinyMCE.addEvent(window,"load",TinyMCE_Engine.prototype.onLoad);tinyMCE._addUnloadEvents()}}this.loadScript(tinyMCE.baseURL+'/themes/'+this.settings['theme']+'/editor_template'+tinyMCE.srcMode+'.js');this.loadScript(tinyMCE.baseURL+'/langs/'+this.settings['language']+'.js');this.loadCSS(this.settings['editor_css']);var p=tinyMCE.getParam('plugins','',true,',');if(p.length>0){for(var i=0;i');this.loadedFiles[this.loadedFiles.length]=url},loadNextScript:function(){var d=document,se;if(!tinyMCE.settings.strict_loading_mode)return;if(this.loadingIndex0){for(i=0,lflen=this.loadedFiles.length;i');this.loadedFiles[this.loadedFiles.length]=ar[x]}}}},importCSS:function(doc,css){var css_ary=css.replace(/\s+/,'').split(',');var csslen,elm,headArr,x,css_file;for(x=0,csslen=css_ary.length;x0){if(css_file.indexOf('://')==-1&&css_file.charAt(0)!='/')css_file=this.documentBasePath+"/"+css_file;if(typeof(doc.createStyleSheet)=="undefined"){elm=doc.createElement("link");elm.rel="stylesheet";elm.href=css_file;if((headArr=doc.getElementsByTagName("head"))!=null&&headArr.length>0)headArr[0].appendChild(elm)}else doc.createStyleSheet(css_file)}}},confirmAdd:function(e,settings){var elm=tinyMCE.isIE?event.srcElement:e.target;var elementId=elm.name?elm.name:elm.id;tinyMCE.settings=settings;if(tinyMCE.settings['convert_on_click']||(!elm.getAttribute('mce_noask')&&confirm(tinyMCELang['lang_edit_confirm'])))tinyMCE.addMCEControl(elm,elementId);elm.setAttribute('mce_noask','true')},updateContent:function(form_element_name){var formElement=document.getElementById(form_element_name);for(var n in tinyMCE.instances){var inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;inst.switchSettings();if(inst.formElement==formElement){var doc=inst.getDoc();tinyMCE._setHTML(doc,inst.formElement.value);if(!tinyMCE.isIE)doc.body.innerHTML=tinyMCE._cleanupHTML(inst,doc,this.settings,doc.body,inst.visualAid)}}},addMCEControl:function(replace_element,form_element_name,target_document){var id="mce_editor_"+tinyMCE.idCounter++;var inst=new TinyMCE_Control(tinyMCE.settings);inst.editorId=id;this.instances[id]=inst;inst._onAdd(replace_element,form_element_name,target_document)},removeInstance:function(ti){var t=[],n,i;for(n in tinyMCE.instances){i=tinyMCE.instances[n];if(tinyMCE.isInstance(i)&&ti!=i)t[n]=i}tinyMCE.instances=t;n=[];t=tinyMCE.undoLevels;for(i=0;i0){tinyMCE.nextUndoRedoAction='Undo';inst=this.undoLevels[--this.undoIndex];inst.select();if(!tinyMCE.nextUndoRedoInstanceId)inst.execCommand('Undo')}}else inst.execCommand('Undo');return true;case"Redo":if(this.getParam('custom_undo_redo_global')){if(this.undoIndex<=this.undoLevels.length-1){tinyMCE.nextUndoRedoAction='Redo';inst=this.undoLevels[this.undoIndex++];inst.select();if(!tinyMCE.nextUndoRedoInstanceId)inst.execCommand('Redo')}}else inst.execCommand('Redo');return true;case'mceFocus':var inst=tinyMCE.getInstanceById(value);if(inst)inst.getWin().focus();return;case"mceAddControl":case"mceAddEditor":tinyMCE.addMCEControl(tinyMCE._getElementById(value),value);return;case"mceAddFrameControl":tinyMCE.addMCEControl(tinyMCE._getElementById(value['element'],value['document']),value['element'],value['document']);return;case"mceRemoveControl":case"mceRemoveEditor":tinyMCE.removeMCEControl(value);return;case"mceResetDesignMode":if(!tinyMCE.isIE){for(var n in tinyMCE.instances){if(!tinyMCE.isInstance(tinyMCE.instances[n]))continue;try{tinyMCE.instances[n].getDoc().designMode="on"}catch(e){}}}return}if(inst){inst.execCommand(command,user_interface,value)}else if(tinyMCE.settings['focus_alert'])alert(tinyMCELang['lang_focus_alert'])},_createIFrame:function(replace_element,doc,win){var iframe,id=replace_element.getAttribute("id");var aw,ah;if(typeof(doc)=="undefined")doc=document;if(typeof(win)=="undefined")win=window;iframe=doc.createElement("iframe");aw=""+tinyMCE.settings['area_width'];ah=""+tinyMCE.settings['area_height'];if(aw.indexOf('%')==-1){aw=parseInt(aw);aw=(isNaN(aw)||aw<0)?300:aw;aw=aw+"px"}if(ah.indexOf('%')==-1){ah=parseInt(ah);ah=(isNaN(ah)||ah<0)?240:ah;ah=ah+"px"}iframe.setAttribute("id",id);iframe.setAttribute("name",id);iframe.setAttribute("class","mceEditorIframe");iframe.setAttribute("border","0");iframe.setAttribute("frameBorder","0");iframe.setAttribute("marginWidth","0");iframe.setAttribute("marginHeight","0");iframe.setAttribute("leftMargin","0");iframe.setAttribute("topMargin","0");iframe.setAttribute("width",aw);iframe.setAttribute("height",ah);iframe.setAttribute("allowtransparency","true");iframe.className='mceEditorIframe';if(tinyMCE.settings["auto_resize"])iframe.setAttribute("scrolling","no");if(tinyMCE.isRealIE)iframe.setAttribute("src",this.settings['default_document']);iframe.style.width=aw;iframe.style.height=ah;if(tinyMCE.settings.strict_loading_mode)iframe.style.marginBottom='-5px';if(tinyMCE.isRealIE)replace_element.outerHTML=iframe.outerHTML;else replace_element.parentNode.replaceChild(iframe,replace_element);if(tinyMCE.isRealIE)return win.frames[id];else return iframe},setupContent:function(editor_id){var inst=tinyMCE.instances[editor_id],i;var doc=inst.getDoc();var head=doc.getElementsByTagName('head').item(0);var content=inst.startContent;if(tinyMCE.settings.strict_loading_mode){content=content.replace(/</g,'<');content=content.replace(/>/g,'>');content=content.replace(/"/g,'"');content=content.replace(/&/g,'&')}inst.switchSettings();if(!tinyMCE.isIE&&tinyMCE.getParam("setupcontent_reload",false)&&doc.title!="blank_page"){try{doc.location.href=tinyMCE.baseURL+"/blank.htm"}catch(ex){}window.setTimeout("tinyMCE.setupContent('"+editor_id+"');",1000);return}if(!head){window.setTimeout("tinyMCE.setupContent('"+editor_id+"');",10);return}tinyMCE.importCSS(inst.getDoc(),tinyMCE.baseURL+"/themes/"+inst.settings['theme']+"/css/editor_content.css");tinyMCE.importCSS(inst.getDoc(),inst.settings['content_css']);tinyMCE.dispatchCallback(inst,'init_instance_callback','initInstance',inst);if(tinyMCE.getParam('custom_undo_redo_keyboard_shortcuts')){inst.addShortcut('ctrl','z','lang_undo_desc','Undo');inst.addShortcut('ctrl','y','lang_redo_desc','Redo')}for(i=1;i<=6;i++)inst.addShortcut('ctrl',''+i,'','FormatBlock',false,'');inst.addShortcut('ctrl','7','','FormatBlock',false,'

    ');inst.addShortcut('ctrl','8','','FormatBlock',false,'

    ');inst.addShortcut('ctrl','9','','FormatBlock',false,'
    ');if(tinyMCE.isGecko){inst.addShortcut('ctrl','b','lang_bold_desc','Bold');inst.addShortcut('ctrl','i','lang_italic_desc','Italic');inst.addShortcut('ctrl','u','lang_underline_desc','Underline')}if(tinyMCE.getParam("convert_fonts_to_spans"))inst.getBody().setAttribute('id','mceSpanFonts');if(tinyMCE.settings['nowrap'])doc.body.style.whiteSpace="nowrap";doc.body.dir=this.settings['directionality'];doc.editorId=editor_id;if(!tinyMCE.isIE)doc.documentElement.editorId=editor_id;inst.setBaseHREF(tinyMCE.settings['base_href']);if(tinyMCE.settings['convert_newlines_to_brs']){content=tinyMCE.regexpReplace(content,"\r\n","
    ","gi");content=tinyMCE.regexpReplace(content,"\r","
    ","gi");content=tinyMCE.regexpReplace(content,"\n","
    ","gi")}content=tinyMCE.storeAwayURLs(content);content=tinyMCE._customCleanup(inst,"insert_to_editor",content);if(tinyMCE.isIE){window.setInterval('try{tinyMCE.getCSSClasses(tinyMCE.instances["'+editor_id+'"].getDoc(), "'+editor_id+'");}catch(e){}',500);if(tinyMCE.settings["force_br_newlines"])doc.styleSheets[0].addRule("p","margin: 0;");var body=inst.getBody();body.editorId=editor_id}content=tinyMCE.cleanupHTMLCode(content);if(!tinyMCE.isIE){var contentElement=inst.getDoc().createElement("body");var doc=inst.getDoc();contentElement.innerHTML=content;if(tinyMCE.isGecko&&tinyMCE.settings['remove_lt_gt'])content=content.replace(new RegExp('<>','g'),"");if(tinyMCE.settings['cleanup_on_startup'])tinyMCE.setInnerHTML(inst.getBody(),tinyMCE._cleanupHTML(inst,doc,this.settings,contentElement));else tinyMCE.setInnerHTML(inst.getBody(),content);tinyMCE.convertAllRelativeURLs(inst.getBody())}else{if(tinyMCE.settings['cleanup_on_startup']){tinyMCE._setHTML(inst.getDoc(),content);eval('try {tinyMCE.setInnerHTML(inst.getBody(), tinyMCE._cleanupHTML(inst, inst.contentDocument, this.settings, inst.getBody()));} catch(e) {}')}else tinyMCE._setHTML(inst.getDoc(),content)}var parentElm=inst.targetDoc.getElementById(inst.editorId+'_parent');inst.formElement=tinyMCE.isGecko?parentElm.previousSibling:parentElm.nextSibling;tinyMCE.handleVisualAid(inst.getBody(),true,tinyMCE.settings['visual'],inst);tinyMCE.dispatchCallback(inst,'setupcontent_callback','setupContent',editor_id,inst.getBody(),inst.getDoc());if(!tinyMCE.isIE)tinyMCE.addEventHandlers(inst);if(tinyMCE.isIE){tinyMCE.addEvent(inst.getBody(),"blur",TinyMCE_Engine.prototype._eventPatch);tinyMCE.addEvent(inst.getBody(),"beforedeactivate",TinyMCE_Engine.prototype._eventPatch);if(!tinyMCE.isOpera){tinyMCE.addEvent(doc.body,"mousemove",TinyMCE_Engine.prototype.onMouseMove);tinyMCE.addEvent(doc.body,"beforepaste",TinyMCE_Engine.prototype._eventPatch);tinyMCE.addEvent(doc.body,"drop",TinyMCE_Engine.prototype._eventPatch)}}inst.select();tinyMCE.selectedElement=inst.contentWindow.document.body;tinyMCE._customCleanup(inst,"insert_to_editor_dom",inst.getBody());tinyMCE._customCleanup(inst,"setup_content_dom",inst.getBody());tinyMCE._setEventsEnabled(inst.getBody(),false);tinyMCE.cleanupAnchors(inst.getDoc());if(tinyMCE.getParam("convert_fonts_to_spans"))tinyMCE.convertSpansToFonts(inst.getDoc());inst.startContent=tinyMCE.trim(inst.getBody().innerHTML);inst.undoRedo.add({content:inst.startContent});if(tinyMCE.isGecko){tinyMCE.selectNodes(inst.getBody(),function(n){if(n.nodeType==3||n.nodeType==8)n.nodeValue=n.nodeValue.replace(new RegExp('\\s(mce_src|mce_href)=\"[^\"]*\"','gi'),"");return false})}if(tinyMCE.isGecko)inst.getBody().spellcheck=tinyMCE.getParam("gecko_spellcheck");tinyMCE._removeInternal(inst.getBody());inst.select();tinyMCE.triggerNodeChange(false,true)},storeAwayURLs:function(s){if(!s.match(/(mce_src|mce_href)/gi,s)){s=s.replace(new RegExp('src\\s*=\\s*\"([^ >\"]*)\"','gi'),'src="$1" mce_src="$1"');s=s.replace(new RegExp('href\\s*=\\s*\"([^ >\"]*)\"','gi'),'href="$1" mce_href="$1"')}return s},_removeInternal:function(n){if(tinyMCE.isGecko){tinyMCE.selectNodes(n,function(n){if(n.nodeType==3||n.nodeType==8)n.nodeValue=n.nodeValue.replace(new RegExp('\\s(mce_src|mce_href)=\"[^\"]*\"','gi'),"");return false})}},handleEvent:function(e){var inst=tinyMCE.selectedInstance;if(typeof(tinyMCE)=="undefined")return true;if(tinyMCE.executeCallback(tinyMCE.selectedInstance,'handle_event_callback','handleEvent',e))return false;switch(e.type){case"beforedeactivate":case"blur":if(tinyMCE.selectedInstance)tinyMCE.selectedInstance.execCommand('mceEndTyping');tinyMCE.hideMenus();return;case"drop":case"beforepaste":if(tinyMCE.selectedInstance)tinyMCE.selectedInstance.setBaseHREF(null);if(tinyMCE.isRealIE){var ife=tinyMCE.selectedInstance.iframeElement;if(ife.style.height.indexOf('%')!=-1){ife._oldHeight=ife.style.height;ife.style.height=ife.clientHeight}}window.setTimeout("tinyMCE.selectedInstance.setBaseHREF(tinyMCE.settings['base_href']);tinyMCE._resetIframeHeight();",1);return;case"submit":tinyMCE.triggerSave();tinyMCE.isNotDirty=true;return;case"reset":var formObj=tinyMCE.isIE?window.event.srcElement:e.target;for(var i=0;i");rng.collapse(false);rng.select();tinyMCE.execCommand("mceAddUndoLevel");tinyMCE.triggerNodeChange(false);return false}}if(e.keyCode==8||e.keyCode==46){tinyMCE.selectedElement=e.target;tinyMCE.linkElement=tinyMCE.getParentElement(e.target,"a");tinyMCE.imgElement=tinyMCE.getParentElement(e.target,"img");tinyMCE.triggerNodeChange(false)}return false;break;case"keyup":case"keydown":tinyMCE.hideMenus();tinyMCE.hasMouseMoved=false;if(inst&&inst.handleShortcut(e))return false;if(e.target.editorId)tinyMCE.instances[e.target.editorId].select();if(tinyMCE.selectedInstance)tinyMCE.selectedInstance.switchSettings();var inst=tinyMCE.selectedInstance;if(tinyMCE.isGecko&&tinyMCE.settings['force_p_newlines']&&(e.keyCode==8||e.keyCode==46)&&!e.shiftKey){if(TinyMCE_ForceParagraphs._handleBackSpace(tinyMCE.selectedInstance,e.type)){tinyMCE.execCommand("mceAddUndoLevel");e.preventDefault();return false}}tinyMCE.selectedElement=null;tinyMCE.selectedNode=null;var elm=tinyMCE.selectedInstance.getFocusElement();tinyMCE.linkElement=tinyMCE.getParentElement(elm,"a");tinyMCE.imgElement=tinyMCE.getParentElement(elm,"img");tinyMCE.selectedElement=elm;if(tinyMCE.isGecko&&e.type=="keyup"&&e.keyCode==9)tinyMCE.handleVisualAid(tinyMCE.selectedInstance.getBody(),true,tinyMCE.settings['visual'],tinyMCE.selectedInstance);if(tinyMCE.isIE&&e.type=="keydown"&&e.keyCode==13)tinyMCE.enterKeyElement=tinyMCE.selectedInstance.getFocusElement();if(tinyMCE.isIE&&e.type=="keyup"&&e.keyCode==13){var elm=tinyMCE.enterKeyElement;if(elm){var re=new RegExp('^HR|IMG|BR$','g');var dre=new RegExp('^H[1-6]$','g');if(!elm.hasChildNodes()&&!re.test(elm.nodeName)){if(dre.test(elm.nodeName))elm.innerHTML="  ";else elm.innerHTML=" "}}}var keys=tinyMCE.posKeyCodes;var posKey=false;for(var i=0;i';h+='';h+=''}else{h+='';h+='';h+=''}return h},getMenuButtonHTML:function(id,lang,img,mcmd,cmd,ui,val){var h='',m,x;mcmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\''+mcmd+'\');';cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\''+cmd+'\'';if(typeof(ui)!="undefined"&&ui!=null)cmd+=','+ui;if(typeof(val)!="undefined"&&val!=null)cmd+=",'"+val+"'";cmd+=');';if(tinyMCE.getParam('button_tile_map')&&(!tinyMCE.isIE||tinyMCE.isOpera)&&(m=tinyMCE.buttonMap[id])!=null&&(tinyMCE.getParam("language")=="en"||img.indexOf('$lang')==-1)){x=0-(m*20)==0?'0':0-(m*20);if(tinyMCE.isRealIE)h+='';else h+='';h+='';h+='';h+='';h+=''}else{if(tinyMCE.isRealIE)h+='';else h+='';h+='';h+='';h+='';h+=''}return h},_menuButtonEvent:function(e,o){if(o.className=='mceMenuButtonFocus')return;if(e=='over')o.className=o.className+' mceMenuHover';else o.className=o.className.replace(/\s.*$/,'')},addButtonMap:function(m){var i,a=m.replace(/\s+/,'').split(',');for(i=0;i0);if(tinyMCE.settings['custom_undo_redo']){undoIndex=inst.undoRedo.undoIndex;undoLevels=inst.undoRedo.undoLevels.length}tinyMCE.dispatchCallback(inst,'handle_node_change_callback','handleNodeChange',editorId,elm,undoIndex,undoLevels,inst.visualAid,anySelection,setup_content)}if(this.selectedInstance&&(typeof(focus)=="undefined"||focus))this.selectedInstance.contentWindow.focus()},_customCleanup:function(inst,type,content){var pl,po,i;var customCleanup=tinyMCE.settings['cleanup_callback'];if(customCleanup!=""&&eval("typeof("+customCleanup+")")!="undefined")content=eval(customCleanup+"(type, content, inst);");po=tinyMCE.themes[tinyMCE.settings['theme']];if(po&&po.cleanup)content=po.cleanup(type,content,inst);pl=inst.plugins;for(i=0;i0)className+=" ";className+=classNames[i]}return className},handleVisualAid:function(el,deep,state,inst,skip_dispatch){if(!el)return;if(!skip_dispatch)tinyMCE.dispatchCallback(inst,'handle_visual_aid_callback','handleVisualAid',el,deep,state,inst);var tableElement=null;switch(el.nodeName){case"TABLE":var oldW=el.style.width;var oldH=el.style.height;var bo=tinyMCE.getAttrib(el,"border");bo=bo==""||bo=="0"?true:false;tinyMCE.setAttrib(el,"class",tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el,"class"),state&&bo));el.style.width=oldW;el.style.height=oldH;for(var y=0;y0){for(var x=0;x0)tinyMCE.cssClasses=output;return output},regexpReplace:function(in_str,reg_exp,replace_str,opts){if(in_str==null)return in_str;if(typeof(opts)=="undefined")opts='g';var re=new RegExp(reg_exp,opts);return in_str.replace(re,replace_str)},trim:function(s){return s.replace(/^\s*|\s*$/g,"")},cleanupEventStr:function(s){s=""+s;s=s.replace('function anonymous()\n{\n','');s=s.replace('\n}','');s=s.replace(/^return true;/gi,'');return s},getControlHTML:function(c){var i,l,n,o,v;l=tinyMCE.plugins;for(n in l){o=l[n];if(o.getControlHTML&&(v=o.getControlHTML(c))!='')return tinyMCE.replaceVar(v,"pluginurl",o.baseURL)}o=tinyMCE.themes[tinyMCE.settings['theme']];if(o.getControlHTML&&(v=o.getControlHTML(c))!='')return v;return''},evalFunc:function(f,idx,a,o){var s='(',i;for(i=idx;i0)return true;if(ins!=null){for(i=0,l=ins.plugins;i0)return true}}l=tinyMCE.themes;for(on in l){o=l[on];if(o[n]&&(v=tinyMCE.evalFunc(n,3,a,o))==s&&m>0)return true}return false},xmlEncode:function(s){return s?(''+s).replace(new RegExp('[<>&"\']','g'),function(c,b){switch(c){case'&':return'&';case'"':return'"';case'\'':return''';case'<':return'<';case'>':return'>'}return c}):s},extend:function(p,np){var o={};o.parent=p;for(n in p)o[n]=p[n];for(n in np)o[n]=np[n];return o},hideMenus:function(){var e=tinyMCE.lastSelectedMenuBtn;if(tinyMCE.lastMenu){tinyMCE.lastMenu.hide();tinyMCE.lastMenu=null}if(e){tinyMCE.switchClass(e,tinyMCE.lastMenuBtnClass);tinyMCE.lastSelectedMenuBtn=null}}};var TinyMCE=TinyMCE_Engine;var tinyMCE=new TinyMCE_Engine();var tinyMCELang={};function TinyMCE_Control(settings){var t,i,to,fu,p,x,fn,fu,pn,s=settings;this.undoRedoLevel=true;this.isTinyMCE_Control=true;this.settings=s;this.settings['theme']=tinyMCE.getParam("theme","default");this.settings['width']=tinyMCE.getParam("width",-1);this.settings['height']=tinyMCE.getParam("height",-1);this.selection=new TinyMCE_Selection(this);this.undoRedo=new TinyMCE_UndoRedo(this);this.cleanup=new TinyMCE_Cleanup();this.shortcuts=new Array();this.hasMouseMoved=false;this.foreColor=this.backColor="#999999";this.data={};this.cleanup.init({valid_elements:s.valid_elements,extended_valid_elements:s.extended_valid_elements,valid_child_elements:s.valid_child_elements,entities:s.entities,entity_encoding:s.entity_encoding,debug:s.cleanup_debug,url_converter:'TinyMCE_Cleanup.prototype._urlConverter',indent:s.apply_source_formatting,invalid_elements:s.invalid_elements,verify_html:s.verify_html,fix_content_duplication:s.fix_content_duplication});t=this.settings['theme'];if(!tinyMCE.hasTheme(t)){fn=tinyMCE.callbacks;to={};for(i=0;i0){for(i=0;i1&&tinyMCE.currentConfig!=this.settings['index']){tinyMCE.settings=this.settings;tinyMCE.currentConfig=this.settings['index']}},select:function(){var oldInst=tinyMCE.selectedInstance;if(oldInst!=this){if(oldInst)oldInst.execCommand('mceEndTyping');tinyMCE.dispatchCallback(this,'select_instance_callback','selectInstance',this,oldInst);tinyMCE.selectedInstance=this}},getBody:function(){return this.contentBody?this.contentBody:this.getDoc().body},getDoc:function(){return this.contentWindow.document},getWin:function(){return this.contentWindow},getContainerWin:function(){return this.containerWindow?this.containerWindow:window},getViewPort:function(){return tinyMCE.getViewPort(this.getWin())},getParentNode:function(n,f){return tinyMCE.getParentNode(n,f,this.getBody())},getParentElement:function(n,na,f){return tinyMCE.getParentElement(n,na,f,this.getBody())},getParentBlockElement:function(n){return tinyMCE.getParentBlockElement(n,this.getBody())},resizeToContent:function(){var d=this.getDoc(),b=d.body,de=d.documentElement;this.iframeElement.style.height=(tinyMCE.isRealIE)?b.scrollHeight:de.offsetHeight+'px'},addShortcut:function(m,k,d,cmd,ui,va){var n=typeof(k)=="number",ie=tinyMCE.isIE,c,sc,i,scl=this.shortcuts;if(!tinyMCE.getParam('custom_shortcuts'))return false;m=m.toLowerCase();k=ie&&!n?k.toUpperCase():k;c=n?null:k.charCodeAt(0);d=d&&d.indexOf('lang_')==0?tinyMCE.getLang(d):d;sc={alt:m.indexOf('alt')!=-1,ctrl:m.indexOf('ctrl')!=-1,shift:m.indexOf('shift')!=-1,charCode:c,keyCode:n?k:(ie?c:null),desc:d,cmd:cmd,ui:ui,val:va};for(i=0;i0)rng.pasteHTML('
    '+rng.htmlText+"
    ");tinyMCE.triggerNodeChange();return}}}switch(command){case"mceRepaint":this.repaint();return true;case"unlink":if(tinyMCE.isGecko&&this.getSel().isCollapsed){focusElm=tinyMCE.getParentElement(focusElm,'A');if(focusElm)this.selection.selectNode(focusElm,false)}this.getDoc().execCommand(command,user_interface,value);tinyMCE.isGecko&&this.getSel().collapseToEnd();tinyMCE.triggerNodeChange();return true;case"FormatBlock":if(!this.cleanup.isValid(value))return true;this.getDoc().execCommand(command,user_interface,value);tinyMCE.triggerNodeChange();break;case"InsertUnorderedList":case"InsertOrderedList":this.getDoc().execCommand(command,user_interface,value);tinyMCE.triggerNodeChange();break;case"Strikethrough":this.getDoc().execCommand(command,user_interface,value);tinyMCE.triggerNodeChange();break;case"mceSelectNode":this.selection.selectNode(value);tinyMCE.triggerNodeChange();tinyMCE.selectedNode=value;break;case"FormatBlock":if(value==null||value==""){var elm=tinyMCE.getParentElement(this.getFocusElement(),"p,div,h1,h2,h3,h4,h5,h6,pre,address,blockquote,dt,dl,dd,samp");if(elm)this.execCommand("mceRemoveNode",false,elm)}else{if(tinyMCE.isGecko&&new RegExp('<(div|blockquote|code|dt|dd|dl|samp)>','gi').test(value))value=value.replace(/[^a-z]/gi,'');if(tinyMCE.isIE&&new RegExp('blockquote|code|samp','gi').test(value)){var b=this.selection.getBookmark();this.getDoc().execCommand("FormatBlock",false,'

    ');tinyMCE.renameElement(tinyMCE.getParentBlockElement(this.getFocusElement()),value);this.selection.moveToBookmark(b)}else this.getDoc().execCommand("FormatBlock",false,value)}tinyMCE.triggerNodeChange();break;case"mceRemoveNode":if(!value)value=tinyMCE.getParentElement(this.getFocusElement());if(tinyMCE.isIE){value.outerHTML=value.innerHTML}else{var rng=value.ownerDocument.createRange();rng.setStartBefore(value);rng.setEndAfter(value);rng.deleteContents();rng.insertNode(rng.createContextualFragment(value.innerHTML))}tinyMCE.triggerNodeChange();break;case"mceSelectNodeDepth":var parentNode=this.getFocusElement();for(var i=0;parentNode;i++){if(parentNode.nodeName.toLowerCase()=="body")break;if(parentNode.nodeName.toLowerCase()=="#text"){i--;parentNode=parentNode.parentNode;continue}if(i==value){this.selection.selectNode(parentNode,false);tinyMCE.triggerNodeChange();tinyMCE.selectedNode=parentNode;return}parentNode=parentNode.parentNode}break;case"SetStyleInfo":var rng=this.getRng();var sel=this.getSel();var scmd=value['command'];var sname=value['name'];var svalue=value['value']==null?'':value['value'];var wrapper=value['wrapper']?value['wrapper']:"span";var parentElm=null;var invalidRe=new RegExp("^BODY|HTML$","g");var invalidParentsRe=tinyMCE.settings['merge_styles_invalid_parents']!=''?new RegExp(tinyMCE.settings['merge_styles_invalid_parents'],"gi"):null;if(tinyMCE.isIE){if(rng.item)parentElm=rng.item(0);else{var pelm=rng.parentElement();var prng=doc.selection.createRange();prng.moveToElementText(pelm);if(rng.htmlText==prng.htmlText||rng.boundingWidth==0){if(invalidParentsRe==null||!invalidParentsRe.test(pelm.nodeName))parentElm=pelm}}}else{var felm=this.getFocusElement();if(sel.isCollapsed||(new RegExp('td|tr|tbody|table','gi').test(felm.nodeName)&&sel.anchorNode==felm.parentNode))parentElm=felm}if(parentElm&&!invalidRe.test(parentElm.nodeName)){if(scmd=="setstyle")tinyMCE.setStyleAttrib(parentElm,sname,svalue);if(scmd=="setattrib")tinyMCE.setAttrib(parentElm,sname,svalue);if(scmd=="removeformat"){parentElm.style.cssText='';tinyMCE.setAttrib(parentElm,'class','')}var ch=tinyMCE.getNodeTree(parentElm,new Array(),1);for(var z=0;z=0;i--){var elm=nodes[i];var isNew=tinyMCE.getAttrib(elm,"mce_new")=="true";elm.removeAttribute("mce_new");if(elm.childNodes&&elm.childNodes.length==1&&elm.childNodes[0].nodeType==1){this._mergeElements(scmd,elm,elm.childNodes[0],isNew);continue}if(elm.parentNode.childNodes.length==1&&!invalidRe.test(elm.nodeName)&&!invalidRe.test(elm.parentNode.nodeName)){if(invalidParentsRe==null||!invalidParentsRe.test(elm.parentNode.nodeName))this._mergeElements(scmd,elm.parentNode,elm,false)}}var nodes=doc.getElementsByTagName(wrapper);for(var i=nodes.length-1;i>=0;i--){var elm=nodes[i];var isEmpty=true;var tmp=doc.createElement("body");tmp.appendChild(elm.cloneNode(false));tmp.innerHTML=tmp.innerHTML.replace(new RegExp('style=""|class=""','gi'),'');if(new RegExp('','gi').test(tmp.innerHTML)){for(var x=0;x0){value=tinyMCE.replaceVar(value,"selection",selectedText);tinyMCE.execCommand('mceInsertContent',false,value)}tinyMCE.triggerNodeChange();break;case"mceSetAttribute":if(typeof(value)=='object'){var targetElms=(typeof(value['targets'])=="undefined")?"p,img,span,div,td,h1,h2,h3,h4,h5,h6,pre,address":value['targets'];var targetNode=tinyMCE.getParentElement(this.getFocusElement(),targetElms);if(targetNode){targetNode.setAttribute(value['name'],value['value']);tinyMCE.triggerNodeChange()}}break;case"mceSetCSSClass":this.execCommand("SetStyleInfo",false,{command:"setattrib",name:"class",value:value});break;case"mceInsertRawHTML":var key='tiny_mce_marker';this.execCommand('mceBeginUndoLevel');this.execCommand('mceInsertContent',false,key);var scrollX=this.getBody().scrollLeft+this.getDoc().documentElement.scrollLeft;var scrollY=this.getBody().scrollTop+this.getDoc().documentElement.scrollTop;var html=this.getBody().innerHTML;if((pos=html.indexOf(key))!=-1)tinyMCE.setInnerHTML(this.getBody(),html.substring(0,pos)+value+html.substring(pos+key.length));this.contentWindow.scrollTo(scrollX,scrollY);this.execCommand('mceEndUndoLevel');break;case"mceInsertContent":if(!value)value='';var insertHTMLFailed=false;if(tinyMCE.isGecko||tinyMCE.isOpera){try{if(value.indexOf('<')==-1&&!value.match(/(&| |<|>)/g)){var r=this.getRng();var n=this.getDoc().createTextNode(tinyMCE.entityDecode(value));var s=this.getSel();var r2=r.cloneRange();s.removeAllRanges();r.deleteContents();r.insertNode(n);r2.selectNode(n);r2.collapse(false);s.removeAllRanges();s.addRange(r2)}else{value=tinyMCE.fixGeckoBaseHREFBug(1,this.getDoc(),value);this.getDoc().execCommand('inserthtml',false,value);tinyMCE.fixGeckoBaseHREFBug(2,this.getDoc(),value)}}catch(ex){insertHTMLFailed=true}if(!insertHTMLFailed){tinyMCE.triggerNodeChange();return}}if(!tinyMCE.isIE){var isHTML=value.indexOf('<')!=-1;var sel=this.getSel();var rng=this.getRng();if(isHTML){if(tinyMCE.isSafari){var tmpRng=this.getDoc().createRange();tmpRng.setStart(this.getBody(),0);tmpRng.setEnd(this.getBody(),0);value=tmpRng.createContextualFragment(value)}else value=rng.createContextualFragment(value)}else{var el=document.createElement("div");el.innerHTML=value;value=el.firstChild.nodeValue;value=doc.createTextNode(value)}if(tinyMCE.isSafari&&!isHTML){this.execCommand('InsertText',false,value.nodeValue);tinyMCE.triggerNodeChange();return true}else if(tinyMCE.isSafari&&isHTML){rng.deleteContents();rng.insertNode(value);tinyMCE.triggerNodeChange();return true}rng.deleteContents();if(rng.startContainer.nodeType==3){var node=rng.startContainer.splitText(rng.startOffset);node.parentNode.insertBefore(value,node)}else rng.insertNode(value);if(!isHTML){sel.selectAllChildren(doc.body);sel.removeAllRanges();var rng=doc.createRange();rng.selectNode(value);rng.collapse(false);sel.addRange(rng)}else rng.collapse(false);tinyMCE.fixGeckoBaseHREFBug(2,this.getDoc(),value)}else{var rng=doc.selection.createRange(),tmpRng=null;var c=value.indexOf('"}if(hc){cn=n.childNodes;for(i=0,l=cn.length;i';return h},_serializeAttribute:function(n,r,an){var av='',t,os=this.settings.on_save;if(os&&(an.indexOf('mce_')==0||an.indexOf('_moz')==0))return'';if(os&&this.mceAttribs[an])av=this._getAttrib(n,this.mceAttribs[an]);if(av.length==0)av=this._getAttrib(n,an);if(av.length==0&&r.defaultAttribs&&(t=r.defaultAttribs[an])){av=t;if(av=="mce_empty")return" "+an+'=""'}if(r.forceAttribs&&(t=r.forceAttribs[an]))av=t;if(os&&av.length!=0&&this.settings.url_converter.length!=0&&/^(src|href|longdesc)$/.test(an))av=eval(this.settings.url_converter+'(this, n, av)');if(av.length!=0&&r.validAttribValues&&r.validAttribValues[an]&&!r.validAttribValues[an].test(av))return"";if(av.length!=0&&av=="{$uid}")av="uid_"+(this.idCount++);if(av.length!=0){if(an.indexOf('on')!=0)av=this.xmlEncode(av);return" "+an+"="+'"'+av+'"'}return""},formatHTML:function(h){var s=this.settings,p='',i=0,li=0,o='',l;h=h.replace(/]*)>(.*?)<\/pre>/gi,function(a,b,c){c=c.replace(//gi,'\n');return''+c+''});h=h.replace(/\r/g,'');h='\n'+h;h=h.replace(new RegExp('\\n\\s+','gi'),'\n');h=h.replace(this.nlBeforeRe,'\n<$1$2>');h=h.replace(this.nlAfterRe,'<$1$2>\n');h=h.replace(this.nlBeforeAfterRe,'\n<$1$2$3>\n');h+='\n';while((i=h.indexOf('\n',i+1))!=-1){if((l=h.substring(li+1,i)).length!=0){if(this.ouRe.test(l)&&p.length>=s.indent_levels)p=p.substring(s.indent_levels);o+=p+l+'\n';if(this.inRe.test(l))p+=this.inStr}li=i}return o},xmlEncode:function(s){var cl=this;this._setupEntities();switch(this.settings.entity_encoding){case"raw":return tinyMCE.xmlEncode(s);case"named":return s.replace(new RegExp('[\u007F-\uFFFF<>&"\']','g'),function(c,b){b=cl.entities[c.charCodeAt(0)];return b?'&'+b+';':c});case"numeric":return s.replace(new RegExp('[\u007F-\uFFFF<>&"\']','g'),function(c,b){return b?'&#'+c.charCodeAt(0)+';':c})}return s},split:function(re,s){var c=s.split(re);var i,l,o=new Array();for(i=0,l=c.length;i':'>'+h+'';return o};TinyMCE_Engine.prototype.createTag=function(d,tn,a,h){var o=d.createElement(tn);if(a){for(n in a){if(typeof(a[n])!='function'&&a[n]!=null)tinyMCE.setAttrib(o,n,a[n])}}if(h)o.innerHTML=h;return o};TinyMCE_Engine.prototype.getElementByAttributeValue=function(n,e,a,v){return(n=this.getElementsByAttributeValue(n,e,a,v)).length==0?null:n[0]};TinyMCE_Engine.prototype.getElementsByAttributeValue=function(n,e,a,v){var i,nl=n.getElementsByTagName(e),o=new Array();for(i=0;i/gi,'');h=h.replace(/<\/em>/gi,'')}if(tinyMCE.isRealIE){h=h.replace(/\s\/>/g,'>');h=h.replace(/]*)>\u00A0?<\/p>/gi,' 

    ');h=h.replace(/]*)>\s* \s*<\/p>/gi,' 

    ');h=h.replace(/]*)>\s+<\/p>/gi,' 

    ');e.innerHTML=tinyMCE.uniqueTag+h;e.firstChild.removeNode(true);nl=e.getElementsByTagName("p");for(i=nl.length-1;i>=0;i--){n=nl[i];if(n.nodeName=='P'&&!n.hasChildNodes()&&!n.mce_keep)n.parentNode.removeChild(n)}}else{h=this.fixGeckoBaseHREFBug(1,e,h);e.innerHTML=h;this.fixGeckoBaseHREFBug(2,e,h)}};TinyMCE_Engine.prototype.getOuterHTML=function(e){if(tinyMCE.isIE)return e.outerHTML;var d=e.ownerDocument.createElement("body");d.appendChild(e.cloneNode(true));return d.innerHTML};TinyMCE_Engine.prototype.setOuterHTML=function(e,h,d){var d=typeof(d)=="undefined"?e.ownerDocument:d,i,nl,t;if(tinyMCE.isIE&&e.nodeType==1)e.outerHTML=h;else{t=d.createElement("body");t.innerHTML=h;for(i=0,nl=t.childNodes;i-1;i--){if(ar[i].specified&&ar[i].nodeValue)ne.setAttribute(ar[i].nodeName.toLowerCase(),ar[i].nodeValue)}ar=e.childNodes;for(i=0;i=strTok2.length){for(var i=0;i=strTok2.length||strTok1[i]!=strTok2[i]){breakPoint=i+1;break}}}if(strTok1.length=strTok1.length||strTok1[i]!=strTok2[i]){breakPoint=i+1;break}}}if(breakPoint==1)return targetURL.path;for(var i=0;i<(strTok1.length-(breakPoint-1));i++)outPath+="../";for(var i=breakPoint-1;i=0;i--){if(baseURLParts[i].length==0)continue;newBaseURLParts[newBaseURLParts.length]=baseURLParts[i]}baseURLParts=newBaseURLParts.reverse();var newRelURLParts=new Array();var numBack=0;for(var i=relURLParts.length-1;i>=0;i--){if(relURLParts[i].length==0||relURLParts[i]==".")continue;if(relURLParts[i]=='..'){numBack++;continue}if(numBack>0){numBack--;continue}newRelURLParts[newRelURLParts.length]=relURLParts[i]}relURLParts=newRelURLParts.reverse();var len=baseURLParts.length-numBack;var absPath=(len<=0?"":"/")+baseURLParts.slice(0,len).join('/')+"/"+relURLParts.join('/');var start="",end="";relURL.protocol=baseURL.protocol;relURL.host=baseURL.host;relURL.port=baseURL.port;if(relURL.path.charAt(relURL.path.length-1)=="/")absPath+="/";relURL.path=absPath;return this.serializeURL(relURL)};TinyMCE_Engine.prototype.convertURL=function(url,node,on_save){var prot=document.location.protocol;var host=document.location.hostname;var port=document.location.port;if(prot=="file:")return url;url=tinyMCE.regexpReplace(url,'(http|https):///','/');if(url.indexOf('mailto:')!=-1||url.indexOf('javascript:')!=-1||tinyMCE.regexpReplace(url,'[ \t\r\n\+]|%20','').charAt(0)=="#")return url;if(!tinyMCE.isIE&&!on_save&&url.indexOf("://")==-1&&url.charAt(0)!='/')return tinyMCE.settings['base_href']+url;if(on_save&&tinyMCE.getParam('relative_urls')){var curl=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],url);if(curl.charAt(0)=='/')curl=tinyMCE.settings['document_base_prefix']+curl;var urlParts=tinyMCE.parseURL(curl);var tmpUrlParts=tinyMCE.parseURL(tinyMCE.settings['document_base_url']);if(urlParts['host']==tmpUrlParts['host']&&(urlParts['port']==tmpUrlParts['port']))return tinyMCE.convertAbsoluteURLToRelativeURL(tinyMCE.settings['document_base_url'],curl)}if(!tinyMCE.getParam('relative_urls')){var urlParts=tinyMCE.parseURL(url);var baseUrlParts=tinyMCE.parseURL(tinyMCE.settings['base_href']);url=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],url);if(urlParts['anchor']&&urlParts['path']==baseUrlParts['path'])return"#"+urlParts['anchor']}if(tinyMCE.getParam('remove_script_host')){var start="",portPart="";if(port!="")portPart=":"+port;start=prot+"//"+host+portPart+"/";if(url.indexOf(start)==0)url=url.substring(start.length-1)}return url};TinyMCE_Engine.prototype.convertAllRelativeURLs=function(body){var i,elms,src,href,mhref,msrc;elms=body.getElementsByTagName("img");for(i=0;ibookmark.index){try{rng.addElement(nl[bookmark.index])}catch(ex){}}}else{try{if(bookmark.start<0)return true;rng=inst.getSel().createRange();rng.moveToElementText(inst.getBody());rng.collapse(true);rng.moveStart('character',bookmark.start);rng.moveEnd('character',bookmark.length)}catch(ex){return true}}rng.select();win.scrollTo(bookmark.scrollX,bookmark.scrollY);return true}if(tinyMCE.isGecko||tinyMCE.isOpera){if(bookmark.rng){sel.removeAllRanges();sel.addRange(bookmark.rng)}if(bookmark.start!=-1&&bookmark.end!=-1){try{sd=this._getTextPos(b,bookmark.start,bookmark.end);rng=doc.createRange();rng.setStart(sd.startNode,sd.startOffset);rng.setEnd(sd.endNode,sd.endOffset);sel.removeAllRanges();sel.addRange(rng);win.focus()}catch(ex){}}win.scrollTo(bookmark.scrollX,bookmark.scrollY);return true}return false},_getPosText:function(r,sn,en){var w=document.createTreeWalker(r,NodeFilter.SHOW_TEXT,null,false),n,p=0,d={};while((n=w.nextNode())!=null){if(n==sn)d.start=p;if(n==en){d.end=p;return d}p+=n.nodeValue?n.nodeValue.length:0}return null},_getTextPos:function(r,sp,ep){var w=document.createTreeWalker(r,NodeFilter.SHOW_TEXT,null,false),n,p=0,d={};while((n=w.nextNode())!=null){p+=n.nodeValue?n.nodeValue.length:0;if(p>=sp&&!d.startNode){d.startNode=n;d.startOffset=sp-(p-n.nodeValue.length)}if(p>=ep){d.endNode=n;d.endOffset=ep-(p-n.nodeValue.length);return d}}return null},selectNode:function(node,collapse,select_text_node,to_start){var inst=this.instance,sel,rng,nodes;if(!node)return;if(typeof(collapse)=="undefined")collapse=true;if(typeof(select_text_node)=="undefined")select_text_node=false;if(typeof(to_start)=="undefined")to_start=true;if(inst.settings.auto_resize)inst.resizeToContent();if(tinyMCE.isRealIE){rng=inst.getDoc().body.createTextRange();try{rng.moveToElementText(node);if(collapse)rng.collapse(to_start);rng.select()}catch(e){}}else{sel=this.getSel();if(!sel)return;if(tinyMCE.isSafari){sel.setBaseAndExtent(node,0,node,node.innerText.length);if(collapse){if(to_start)sel.collapseToStart();else sel.collapseToEnd()}this.scrollToNode(node);return}rng=inst.getDoc().createRange();if(select_text_node){nodes=tinyMCE.getNodeTree(node,new Array(),3);if(nodes.length>0)rng.selectNodeContents(nodes[0]);else rng.selectNodeContents(node)}else rng.selectNode(node);if(collapse){if(!to_start&&node.nodeType==3){rng.setStart(node,node.nodeValue.length);rng.setEnd(node,node.nodeValue.length)}else rng.collapse(to_start)}sel.removeAllRanges();sel.addRange(rng)}this.scrollToNode(node);tinyMCE.selectedElement=null;if(node.nodeType==1)tinyMCE.selectedElement=node},scrollToNode:function(node){var inst=this.instance,w=inst.getWin(),vp=inst.getViewPort(),pos=tinyMCE.getAbsPosition(node),cvp,p,cwin;if(pos.absLeftvp.left+vp.width||pos.absTopvp.top+(vp.height-25))w.scrollTo(pos.absLeft,pos.absTop-vp.height+25);if(inst.settings.auto_resize){cwin=inst.getContainerWin();cvp=tinyMCE.getViewPort(cwin);p=this.getAbsPosition(node);if(p.absLeftcvp.left+cvp.width||p.absTopcvp.top+cvp.height)cwin.scrollTo(p.absLeft,p.absTop-cvp.height+25)}},getAbsPosition:function(n){var pos=tinyMCE.getAbsPosition(n),ipos=tinyMCE.getAbsPosition(this.instance.iframeElement);return{absLeft:ipos.absLeft+pos.absLeft,absTop:ipos.absTop+pos.absTop}},getSel:function(){var inst=this.instance;if(tinyMCE.isRealIE)return inst.getDoc().selection;return inst.contentWindow.getSelection()},getRng:function(){var s=this.getSel();if(s==null)return null;if(tinyMCE.isRealIE)return s.createRange();if(tinyMCE.isSafari&&!s.getRangeAt)return''+window.getSelection();return s.getRangeAt(0)},getFocusElement:function(){var inst=this.instance,doc,rng,sel,elm;if(tinyMCE.isRealIE){doc=inst.getDoc();rng=doc.selection.createRange();elm=rng.item?rng.item(0):rng.parentElement()}else{if(!tinyMCE.isSafari&&inst.isHidden())return inst.getBody();sel=this.getSel();rng=this.getRng();if(!sel||!rng)return null;elm=rng.commonAncestorContainer;if(!rng.collapsed){if(rng.startContainer==rng.endContainer){if(rng.startOffset-rng.endOffset<2){if(rng.startContainer.hasChildNodes())elm=rng.startContainer.childNodes[rng.startOffset]}}}elm=tinyMCE.getParentElement(elm);}return elm}};function TinyMCE_UndoRedo(inst){this.instance=inst;this.undoLevels=new Array();this.undoIndex=0;this.typingUndoIndex=-1;this.undoRedo=true};TinyMCE_UndoRedo.prototype={add:function(l){var b,customUndoLevels,newHTML,inst=this.instance,i,ul,ur;if(l){this.undoLevels[this.undoLevels.length]=l;return true}if(this.typingUndoIndex!=-1){this.undoIndex=this.typingUndoIndex;if(tinyMCE.typingUndoIndex!=-1)tinyMCE.undoIndex=tinyMCE.typingUndoIndex}newHTML=tinyMCE.trim(inst.getBody().innerHTML);if(this.undoLevels[this.undoIndex]&&newHTML!=this.undoLevels[this.undoIndex].content){tinyMCE.dispatchCallback(inst,'onchange_callback','onChange',inst);customUndoLevels=tinyMCE.settings['custom_undo_redo_levels'];if(customUndoLevels!=-1&&this.undoLevels.length>customUndoLevels){for(i=0;i0){this.undoIndex--;tinyMCE.setInnerHTML(inst.getBody(),this.undoLevels[this.undoIndex].content);inst.repaint();if(inst.settings.custom_undo_redo_restore_selection)inst.selection.moveToBookmark(this.undoLevels[this.undoIndex].bookmark)}},redo:function(){var inst=this.instance;tinyMCE.execCommand("mceEndTyping");if(this.undoIndex<(this.undoLevels.length-1)){this.undoIndex++;tinyMCE.setInnerHTML(inst.getBody(),this.undoLevels[this.undoIndex].content);inst.repaint();if(inst.settings.custom_undo_redo_restore_selection)inst.selection.moveToBookmark(this.undoLevels[this.undoIndex].bookmark)}tinyMCE.triggerNodeChange()}};var TinyMCE_ForceParagraphs={_insertPara:function(inst,e){var doc=inst.getDoc(),sel=inst.getSel(),body=inst.getBody(),win=inst.contentWindow,rng=sel.getRangeAt(0);var rootElm=doc.documentElement,blockName="P",startNode,endNode,startBlock,endBlock;var rngBefore,rngAfter,direct,startNode,startOffset,endNode,endOffset,b=tinyMCE.isOpera?inst.selection.getBookmark():null;var paraBefore,paraAfter,startChop,endChop,contents;function isEmpty(para){function isEmptyHTML(html){return html.replace(new RegExp('[ \t\r\n]+','g'),'').toLowerCase()==""}if(para.getElementsByTagName("img").length>0)return false;if(para.getElementsByTagName("table").length>0)return false;if(para.getElementsByTagName("hr").length>0)return false;var nodes=tinyMCE.getNodeTree(para,new Array(),3);for(var i=0;i <"+blockName+"> ";paraAfter=body.childNodes[1]}inst.selection.moveToBookmark(b);inst.selection.selectNode(paraAfter,true,true);return true}if(startChop.nodeName==blockName)rngBefore.setStart(startChop,0);else rngBefore.setStartBefore(startChop);rngBefore.setEnd(startNode,startOffset);paraBefore.appendChild(rngBefore.cloneContents());rngAfter.setEndAfter(endChop);rngAfter.setStart(endNode,endOffset);contents=rngAfter.cloneContents();if(contents.firstChild&&contents.firstChild.nodeName==blockName){paraAfter.innerHTML=contents.firstChild.innerHTML}else paraAfter.appendChild(contents);if(isEmpty(paraBefore))paraBefore.innerHTML=" ";if(isEmpty(paraAfter))paraAfter.innerHTML=" ";rng=doc.createRange();if(!startChop.previousSibling&&startChop.parentNode.nodeName.toUpperCase()==blockName){rng.setStartBefore(startChop.parentNode)}else{if(rngBefore.startContainer.nodeName.toUpperCase()==blockName&&rngBefore.startOffset==0)rng.setStartBefore(rngBefore.startContainer);else rng.setStart(rngBefore.startContainer,rngBefore.startOffset)}if(!endChop.nextSibling&&endChop.parentNode.nodeName.toUpperCase()==blockName)rng.setEndAfter(endChop.parentNode);else rng.setEnd(rngAfter.endContainer,rngAfter.endOffset);rng.deleteContents();if(tinyMCE.isOpera){rng.insertNode(paraBefore);rng.insertNode(paraAfter)}else{rng.insertNode(paraAfter);rng.insertNode(paraBefore)}paraAfter.normalize();paraBefore.normalize();inst.selection.moveToBookmark(b);inst.selection.selectNode(paraAfter,true,true);return true},_handleBackSpace:function(inst){var r=inst.getRng(),sn=r.startContainer,nv,s=false;if(sn&&sn.nextSibling&&sn.nextSibling.nodeName=="BR"&&sn.parentNode.nodeName!="BODY"){nv=sn.nodeValue;if(nv!=null&&r.startOffset==nv.length)sn.nextSibling.parentNode.removeChild(sn.nextSibling)}if(inst.settings.auto_resize)inst.resizeToContent();return s}};function TinyMCE_Layer(id,bm){this.id=id;this.blockerElement=null;this.events=false;this.element=null;this.blockMode=typeof(bm)!='undefined'?bm:true;this.doc=document};TinyMCE_Layer.prototype={moveRelativeTo:function(re,p){var rep=this.getAbsPosition(re);var w=parseInt(re.offsetWidth);var h=parseInt(re.offsetHeight);var e=this.getElement();var ew=parseInt(e.offsetWidth);var eh=parseInt(e.offsetHeight);var x,y;switch(p){case"tl":x=rep.absLeft;y=rep.absTop;break;case"tr":x=rep.absLeft+w;y=rep.absTop;break;case"bl":x=rep.absLeft;y=rep.absTop+h;break;case"br":x=rep.absLeft+w;y=rep.absTop+h;break;case"cc":x=rep.absLeft+(w/ 2) - (ew /2);y=rep.absTop+(h/ 2) - (eh /2);break}this.moveTo(x,y)},moveBy:function(x,y){var e=this.getElement();this.moveTo(parseInt(e.style.left)+x,parseInt(e.style.top)+y)},moveTo:function(x,y){var e=this.getElement();e.style.left=x+"px";e.style.top=y+"px";this.updateBlocker()},resizeBy:function(w,h){var e=this.getElement();this.resizeTo(parseInt(e.style.width)+w,parseInt(e.style.height)+h)},resizeTo:function(w,h){var e=this.getElement();if(w!=null)e.style.width=w+"px";if(h!=null)e.style.height=h+"px";this.updateBlocker()},show:function(){this.getElement().style.display='block';this.updateBlocker()},hide:function(){this.getElement().style.display='none';this.updateBlocker()},isVisible:function(){return this.getElement().style.display=='block'},getElement:function(){if(!this.element)this.element=this.doc.getElementById(this.id);return this.element},setBlockMode:function(s){this.blockMode=s},updateBlocker:function(){var e,b,x,y,w,h;b=this.getBlocker();if(b){if(this.blockMode){e=this.getElement();x=this.parseInt(e.style.left);y=this.parseInt(e.style.top);w=this.parseInt(e.offsetWidth);h=this.parseInt(e.offsetHeight);b.style.left=x+'px';b.style.top=y+'px';b.style.width=w+'px';b.style.height=h+'px';b.style.display=e.style.display}else b.style.display='none'}},getBlocker:function(){var d,b;if(!this.blockerElement&&this.blockMode){d=this.doc;b=d.getElementById(this.id+"_blocker");if(!b){b=d.createElement("iframe");b.setAttribute('id',this.id+"_blocker");b.style.cssText='display: none; position: absolute; left: 0; top: 0';b.src='javascript:false;';b.frameBorder='0';b.scrolling='no';d.body.appendChild(b)}this.blockerElement=b}return this.blockerElement},getAbsPosition:function(n){var p={absLeft:0,absTop:0};while(n){p.absLeft+=n.offsetLeft;p.absTop+=n.offsetTop;n=n.offsetParent}return p},create:function(n,c,p,h){var d=this.doc,e=d.createElement(n);e.setAttribute('id',this.id);if(c)e.className=c;if(!p)p=d.body;if(h)e.innerHTML=h;p.appendChild(e);return this.element=e},exists:function(){return this.doc.getElementById(this.id)!=null},parseInt:function(s){if(s==null||s=='')return 0;return parseInt(s)}};function TinyMCE_Menu(){var id;if(typeof(tinyMCE.menuCounter)=="undefined")tinyMCE.menuCounter=0;id="mc_menu_"+tinyMCE.menuCounter++;TinyMCE_Layer.call(this,id,true);this.id=id;this.items=new Array();this.needsUpdate=true};TinyMCE_Menu.prototype=tinyMCE.extend(TinyMCE_Layer.prototype,{init:function(s){var n;this.settings={separator_class:'mceMenuSeparator',title_class:'mceMenuTitle',disabled_class:'mceMenuDisabled',menu_class:'mceMenu',drop_menu:true};for(n in s)this.settings[n]=s[n];this.create('div',this.settings.menu_class)},clear:function(){this.items=new Array()},addTitle:function(t){this.add({type:'title',text:t})},addDisabled:function(t){this.add({type:'disabled',text:t})},addSeparator:function(){this.add({type:'separator'})},addItem:function(t,js){this.add({text:t,js:js})},add:function(mi){this.items[this.items.length]=mi;this.needsUpdate=true},update:function(){var e=this.getElement(),h='',i,t,m=this.items,s=this.settings;if(this.settings.drop_menu)h+='';h+='';for(i=0;i'}h+='
    ';break;case'title':h+='
    '+t+'';break;case'disabled':h+='
    '+t+'';break;default:h+='
    '+t+''}h+='
    ';e.innerHTML=h;this.needsUpdate=false;this.updateBlocker()},show:function(){var nl,i;if(tinyMCE.lastMenu==this)return;if(this.needsUpdate)this.update();if(tinyMCE.lastMenu&&tinyMCE.lastMenu!=this)tinyMCE.lastMenu.hide();TinyMCE_Layer.prototype.show.call(this);if(!tinyMCE.isOpera){}tinyMCE.lastMenu=this}});if(!Function.prototype.call){Function.prototype.call=function(){var a=arguments,s=a[0],i,as='',r,o;for(i=1;i1?',':'')+'a['+i+']';o=s._fu;s._fu=this;r=eval('s._fu('+as+')');s._fu=o;return r}};TinyMCE_Engine.prototype.debug=function(){var m="",a,i,l=tinyMCE.log.length;for(i=0,a=this.debug.arguments;i -1) { + // Write main script and patch some things + if ($index == 0) { + TinyMCE_echo(file_get_contents(realpath("tiny_mce" . $suffix . ".js"))); + TinyMCE_echo('TinyMCE.prototype.loadScript = function() {};var realTinyMCE = tinyMCE;'); + } else + TinyMCE_echo('tinyMCE = realTinyMCE;'); + + // Do init based on index + TinyMCE_echo("tinyMCE.init(tinyMCECompressed.configs[" . $index . "]);"); + + // Load theme, language pack and theme language packs + if ($theme) { + TinyMCE_echo(file_get_contents(realpath("themes/" . $theme . "/editor_template" . $suffix . ".js"))); + TinyMCE_echo(file_get_contents(realpath("themes/" . $theme . "/langs/" . $lang . ".js"))); + } + + if ($language) + TinyMCE_echo(file_get_contents(realpath("langs/" . $language . ".js"))); + + // Load all plugins and their language packs + $plugins = explode(",", $plugins); + foreach ($plugins as $plugin) { + $pluginFile = realpath("plugins/" . $plugin . "/editor_plugin" . $suffix . ".js"); + $languageFile = realpath("plugins/" . $plugin . "/langs/" . $lang . ".js"); + + if ($pluginFile) + TinyMCE_echo(file_get_contents($pluginFile)); + + if ($languageFile) + TinyMCE_echo(file_get_contents($languageFile)); + } + + // Reset tinyMCE compressor engine + TinyMCE_echo("tinyMCE = tinyMCECompressed;"); + + // Write to cache + if ($diskCache) { + // Calculate compression ratio and debug target output path + if ($debug) { + $ratio = round(100 - strlen(gzencode($cacheData, 9, FORCE_GZIP)) / strlen($cacheData) * 100.0); + TinyMCE_echo("alert('TinyMCE was compressed by " . $ratio . "%.\\nOutput cache file: " . $cacheFile . "');"); + } + + $cacheData = gzencode($cacheData, 9, FORCE_GZIP); + + // Write to file if possible + $fp = @fopen($cacheFile, "wb"); + if ($fp) { + fwrite($fp, $cacheData); + fclose($fp); + } + + // Output + header("Content-Encoding: gzip"); + echo $cacheData; + } + + die; +} +?> + +function TinyMCECompressed() { + this.configs = new Array(); + this.loadedFiles = new Array(); + this.loadAdded = false; + this.isLoaded = false; +} + +TinyMCECompressed.prototype.init = function(settings) { + var elements = document.getElementsByTagName('script'); + var scriptURL = ""; + + for (var i=0; i'); + + if (!this.loadAdded) { + tinyMCE.addEvent(window, "DOMContentLoaded", TinyMCECompressed.prototype.onLoad); + tinyMCE.addEvent(window, "load", TinyMCECompressed.prototype.onLoad); + this.loadAdded = true; + } +} + +TinyMCECompressed.prototype.onLoad = function() { + if (tinyMCE.isLoaded) + return true; + + tinyMCE = realTinyMCE; + TinyMCE_Engine.prototype.onLoad(); + tinyMCE._addUnloadEvents(); + tinyMCE.isLoaded = true; +} + +TinyMCECompressed.prototype.addEvent = function(o, n, h) { + if (o.attachEvent) + o.attachEvent("on" + n, h); + else + o.addEventListener(n, h, false); +} + +TinyMCECompressed.prototype.getOnce = function(str) { + var ar = str.split(','); + + for (var i=0; i'); + + if (tinyMCE.getParam("popups_css_add")) { + c = tinyMCE.getParam("popups_css_add"); + + // Is relative + if (c.indexOf('://') == -1 && c.charAt(0) != '/') + c = tinyMCE.documentBasePath + "/" + c; + + document.write(''); + } + + tinyMCE.addEvent(window, "load", this.onLoad); + }, + + onLoad : function() { + var dir, i, elms, body = document.body; + + if (tinyMCE.getWindowArg('mce_replacevariables', true)) + body.innerHTML = tinyMCE.applyTemplate(body.innerHTML, tinyMCE.windowArgs); + + dir = tinyMCE.selectedInstance.settings['directionality']; + if (dir == "rtl" && document.forms && document.forms.length > 0) { + elms = document.forms[0].elements; + for (i=0; i=0; i--) { + if (wrapper.hasChildNodes()) + wrapper.insertBefore(nodes[i].cloneNode(true), wrapper.firstChild); + else + wrapper.appendChild(nodes[i].cloneNode(true)); + + nodes[i].parentNode.removeChild(nodes[i]); + } + + // Add wrapper + doc.body.appendChild(wrapper); + + // Create iframe + iframe = document.createElement("iframe"); + iframe.id = "mcWinIframe"; + iframe.src = document.location.href.toLowerCase().indexOf('https') == -1 ? "about:blank" : tinyMCE.settings['default_document']; + iframe.width = "100%"; + iframe.height = "100%"; + iframe.style.margin = '0'; + + // Add iframe + doc.body.appendChild(iframe); + + // Measure iframe + iframe = document.getElementById('mcWinIframe'); + dx = tinyMCE.getWindowArg('mce_width') - iframe.clientWidth; + dy = tinyMCE.getWindowArg('mce_height') - iframe.clientHeight; + + // Resize window + // tinyMCE.debug(tinyMCE.getWindowArg('mce_width') + "," + tinyMCE.getWindowArg('mce_height') + " - " + dx + "," + dy); + window.resizeBy(dx, dy); + + // Hide iframe and show wrapper + body.style.margin = oldMargin; + iframe.style.display = 'none'; + wrapper.style.display = 'block'; + } + }, + + resizeToContent : function() { + var isMSIE = (navigator.appName == "Microsoft Internet Explorer"); + var isOpera = (navigator.userAgent.indexOf("Opera") != -1); + + if (isOpera) + return; + + if (isMSIE) { + try { window.resizeTo(10, 10); } catch (e) {} + + var elm = document.body; + var width = elm.offsetWidth; + var height = elm.offsetHeight; + var dx = (elm.scrollWidth - width) + 4; + var dy = elm.scrollHeight - height; + + try { window.resizeBy(dx, dy); } catch (e) {} + } else { + window.scrollBy(1000, 1000); + if (window.scrollX > 0 || window.scrollY > 0) { + window.resizeBy(window.innerWidth * 2, window.innerHeight * 2); + window.sizeToContent(); + window.scrollTo(0, 0); + var x = parseInt(screen.width / 2.0) - (window.outerWidth / 2.0); + var y = parseInt(screen.height / 2.0) - (window.outerHeight / 2.0); + window.moveTo(x, y); + } + } + }, + + getWindowArg : function(name, default_value) { + return tinyMCE.getWindowArg(name, default_value); + }, + + restoreSelection : function() { + if (this.storeSelection) { + var inst = tinyMCE.selectedInstance; + + inst.getWin().focus(); + + if (inst.selectionBookmark) + inst.selection.moveToBookmark(inst.selectionBookmark); + } + }, + + execCommand : function(command, user_interface, value) { + var inst = tinyMCE.selectedInstance; + + this.restoreSelection(); + inst.execCommand(command, user_interface, value); + + // Store selection + if (this.storeSelection) + inst.selectionBookmark = inst.selection.getBookmark(true); + }, + + close : function() { + tinyMCE.closeWindow(window); + }, + + pickColor : function(e, element_id) { + tinyMCE.selectedInstance.execCommand('mceColorPicker', true, { + element_id : element_id, + document : document, + window : window, + store_selection : false + }); + }, + + openBrowser : function(element_id, type, option) { + var cb = tinyMCE.getParam(option, tinyMCE.getParam("file_browser_callback")); + var url = document.getElementById(element_id).value; + + tinyMCE.setWindowArg("window", window); + tinyMCE.setWindowArg("document", document); + + // Call to external callback + if (eval('typeof(tinyMCEPopup.windowOpener.' + cb + ')') == "undefined") + alert("Callback function: " + cb + " could not be found."); + else + eval("tinyMCEPopup.windowOpener." + cb + "(element_id, url, type, window);"); + }, + + importClass : function(c) { + window[c] = function() {}; + + for (var n in window.opener[c].prototype) + window[c].prototype[n] = window.opener[c].prototype[n]; + + window[c].constructor = window.opener[c].constructor; + } + + }; + +// Setup global instance +var tinyMCEPopup = new TinyMCE_Popup(); + +tinyMCEPopup.init(); diff --git a/e107_handlers/tiny_mce/tiny_mce_src.js b/e107_handlers/tiny_mce/tiny_mce_src.js new file mode 100644 index 000000000..ecd78a231 --- /dev/null +++ b/e107_handlers/tiny_mce/tiny_mce_src.js @@ -0,0 +1,7284 @@ + +/* file:jscripts/tiny_mce/classes/TinyMCE_Engine.class.js */ + +function TinyMCE_Engine() { + var ua; + + this.majorVersion = "2"; + this.minorVersion = "0.8"; + this.releaseDate = "2006-10-23"; + + this.instances = new Array(); + this.switchClassCache = new Array(); + this.windowArgs = new Array(); + this.loadedFiles = new Array(); + this.pendingFiles = new Array(); + this.loadingIndex = 0; + this.configs = new Array(); + this.currentConfig = 0; + this.eventHandlers = new Array(); + this.log = new Array(); + this.undoLevels = []; + this.undoIndex = 0; + this.typingUndoIndex = -1; + + // Browser check + ua = navigator.userAgent; + this.isMSIE = (navigator.appName == "Microsoft Internet Explorer"); + this.isMSIE5 = this.isMSIE && (ua.indexOf('MSIE 5') != -1); + this.isMSIE5_0 = this.isMSIE && (ua.indexOf('MSIE 5.0') != -1); + this.isMSIE7 = this.isMSIE && (ua.indexOf('MSIE 7') != -1); + this.isGecko = ua.indexOf('Gecko') != -1; + this.isSafari = ua.indexOf('Safari') != -1; + this.isOpera = ua.indexOf('Opera') != -1; + this.isMac = ua.indexOf('Mac') != -1; + this.isNS7 = ua.indexOf('Netscape/7') != -1; + this.isNS71 = ua.indexOf('Netscape/7.1') != -1; + this.dialogCounter = 0; + this.plugins = new Array(); + this.themes = new Array(); + this.menus = new Array(); + this.loadedPlugins = new Array(); + this.buttonMap = new Array(); + this.isLoaded = false; + + // Fake MSIE on Opera and if Opera fakes IE, Gecko or Safari cancel those + if (this.isOpera) { + this.isMSIE = true; + this.isGecko = false; + this.isSafari = false; + } + + this.isIE = this.isMSIE; + this.isRealIE = this.isMSIE && !this.isOpera; + + // TinyMCE editor id instance counter + this.idCounter = 0; +}; + +TinyMCE_Engine.prototype = { + init : function(settings) { + var theme, nl, baseHREF = "", i; + + // IE 5.0x is no longer supported since 5.5, 6.0 and 7.0 now exists. We can't support old browsers forever, sorry. + if (this.isMSIE5_0) + return; + + this.settings = settings; + + // Check if valid browser has execcommand support + if (typeof(document.execCommand) == 'undefined') + return; + + // Get script base path + if (!tinyMCE.baseURL) { + var elements = document.getElementsByTagName('script'); + + // If base element found, add that infront of baseURL + nl = document.getElementsByTagName('base'); + for (i=0; i'); + this._def("font_size_classes", ''); + this._def("font_size_style_values", 'xx-small,x-small,small,medium,large,x-large,xx-large', true); + this._def("event_elements", 'a,img', true); + this._def("convert_urls", true); + this._def("table_inline_editing", false); + this._def("object_resizing", true); + this._def("custom_shortcuts", true); + this._def("convert_on_click", false); + this._def("content_css", ''); + this._def("fix_list_elements", false); + this._def("fix_table_elements", false); + this._def("strict_loading_mode", document.contentType == 'application/xhtml+xml'); + this._def("hidden_tab_class", ''); + this._def("display_tab_class", ''); + this._def("gecko_spellcheck", false); + + // Force strict loading mode to false on non Gecko browsers + if (this.isMSIE && !this.isOpera) + this.settings.strict_loading_mode = false; + + // Browser check IE + if (this.isMSIE && this.settings['browsers'].indexOf('msie') == -1) + return; + + // Browser check Gecko + if (this.isGecko && this.settings['browsers'].indexOf('gecko') == -1) + return; + + // Browser check Safari + if (this.isSafari && this.settings['browsers'].indexOf('safari') == -1) + return; + + // Browser check Opera + if (this.isOpera && this.settings['browsers'].indexOf('opera') == -1) + return; + + // If not super absolute make it so + baseHREF = tinyMCE.settings['document_base_url']; + var h = document.location.href; + var p = h.indexOf('://'); + if (p > 0 && document.location.protocol != "file:") { + p = h.indexOf('/', p + 3); + h = h.substring(0, p); + + if (baseHREF.indexOf('://') == -1) + baseHREF = h + baseHREF; + + tinyMCE.settings['document_base_url'] = baseHREF; + tinyMCE.settings['document_base_prefix'] = h; + } + + // Trim away query part + if (baseHREF.indexOf('?') != -1) + baseHREF = baseHREF.substring(0, baseHREF.indexOf('?')); + + this.settings['base_href'] = baseHREF.substring(0, baseHREF.lastIndexOf('/')) + "/"; + + theme = this.settings['theme']; + this.inlineStrict = 'A|BR|SPAN|BDO|MAP|OBJECT|IMG|TT|I|B|BIG|SMALL|EM|STRONG|DFN|CODE|Q|SAMP|KBD|VAR|CITE|ABBR|ACRONYM|SUB|SUP|#text|#comment'; + this.inlineTransitional = 'A|BR|SPAN|BDO|OBJECT|APPLET|IMG|MAP|IFRAME|TT|I|B|U|S|STRIKE|BIG|SMALL|FONT|BASEFONT|EM|STRONG|DFN|CODE|Q|SAMP|KBD|VAR|CITE|ABBR|ACRONYM|SUB|SUP|INPUT|SELECT|TEXTAREA|LABEL|BUTTON|#text|#comment'; + this.blockElms = 'H[1-6]|P|DIV|ADDRESS|PRE|FORM|TABLE|LI|OL|UL|TD|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|FORM|NOSCRIPT|NOFRAMES|MENU|ISINDEX|SAMP'; + this.blockRegExp = new RegExp("^(" + this.blockElms + ")$", "i"); + this.posKeyCodes = new Array(13,45,36,35,33,34,37,38,39,40); + this.uniqueURL = 'javascript:TINYMCE_UNIQUEURL();'; // Make unique URL non real URL + this.uniqueTag = ''; + this.callbacks = new Array('onInit', 'getInfo', 'getEditorTemplate', 'setupContent', 'onChange', 'onPageLoad', 'handleNodeChange', 'initInstance', 'execCommand', 'getControlHTML', 'handleEvent', 'cleanup'); + + // Theme url + this.settings['theme_href'] = tinyMCE.baseURL + "/themes/" + theme; + + if (!tinyMCE.isIE || tinyMCE.isOpera) + this.settings['force_br_newlines'] = false; + + if (tinyMCE.getParam("popups_css", false)) { + var cssPath = tinyMCE.getParam("popups_css", ""); + + // Is relative + if (cssPath.indexOf('://') == -1 && cssPath.charAt(0) != '/') + this.settings['popups_css'] = this.documentBasePath + "/" + cssPath; + else + this.settings['popups_css'] = cssPath; + } else + this.settings['popups_css'] = tinyMCE.baseURL + "/themes/" + theme + "/css/editor_popup.css"; + + if (tinyMCE.getParam("editor_css", false)) { + var cssPath = tinyMCE.getParam("editor_css", ""); + + // Is relative + if (cssPath.indexOf('://') == -1 && cssPath.charAt(0) != '/') + this.settings['editor_css'] = this.documentBasePath + "/" + cssPath; + else + this.settings['editor_css'] = cssPath; + } else { + if (this.settings.editor_css != '') + this.settings['editor_css'] = tinyMCE.baseURL + "/themes/" + theme + "/css/editor_ui.css"; + } + + if (tinyMCE.settings['debug']) { + var msg = "Debug: \n"; + + msg += "baseURL: " + this.baseURL + "\n"; + msg += "documentBasePath: " + this.documentBasePath + "\n"; + msg += "content_css: " + this.settings['content_css'] + "\n"; + msg += "popups_css: " + this.settings['popups_css'] + "\n"; + msg += "editor_css: " + this.settings['editor_css'] + "\n"; + + alert(msg); + } + + // Only do this once + if (this.configs.length == 0) { + if (typeof(TinyMCECompressed) == "undefined") { + tinyMCE.addEvent(window, "DOMContentLoaded", TinyMCE_Engine.prototype.onLoad); + + if (tinyMCE.isRealIE) { + if (document.body) + tinyMCE.addEvent(document.body, "readystatechange", TinyMCE_Engine.prototype.onLoad); + else + tinyMCE.addEvent(document, "readystatechange", TinyMCE_Engine.prototype.onLoad); + } + + tinyMCE.addEvent(window, "load", TinyMCE_Engine.prototype.onLoad); + tinyMCE._addUnloadEvents(); + } + } + + this.loadScript(tinyMCE.baseURL + '/themes/' + this.settings['theme'] + '/editor_template' + tinyMCE.srcMode + '.js'); + this.loadScript(tinyMCE.baseURL + '/langs/' + this.settings['language'] + '.js'); + this.loadCSS(this.settings['editor_css']); + + // Add plugins + var p = tinyMCE.getParam('plugins', '', true, ','); + if (p.length > 0) { + for (var i=0; i'); + + this.loadedFiles[this.loadedFiles.length] = url; + }, + + loadNextScript : function() { + var d = document, se; + + if (!tinyMCE.settings.strict_loading_mode) + return; + + if (this.loadingIndex < this.pendingFiles.length) { + se = d.createElementNS('http://www.w3.org/1999/xhtml', 'script'); + se.setAttribute('language', 'javascript'); + se.setAttribute('type', 'text/javascript'); + se.setAttribute('src', this.pendingFiles[this.loadingIndex++]); + + d.getElementsByTagName("head")[0].appendChild(se); + } else + this.loadingIndex = -1; // Done with loading + }, + + loadCSS : function(url) { + var ar = url.replace(/\s+/, '').split(','); + var lflen = 0, csslen = 0; + var skip = false; + var x = 0, i = 0, nl, le; + + for (x = 0,csslen = ar.length; x 0) { + /* Make sure it doesn't exist. */ + for (i=0, lflen=this.loadedFiles.length; i'); + + this.loadedFiles[this.loadedFiles.length] = ar[x]; + } + } + } + }, + + importCSS : function(doc, css) { + var css_ary = css.replace(/\s+/, '').split(','); + var csslen, elm, headArr, x, css_file; + + for (x = 0, csslen = css_ary.length; x 0) { + // Is relative, make absolute + if (css_file.indexOf('://') == -1 && css_file.charAt(0) != '/') + css_file = this.documentBasePath + "/" + css_file; + + if (typeof(doc.createStyleSheet) == "undefined") { + elm = doc.createElement("link"); + + elm.rel = "stylesheet"; + elm.href = css_file; + + if ((headArr = doc.getElementsByTagName("head")) != null && headArr.length > 0) + headArr[0].appendChild(elm); + } else + doc.createStyleSheet(css_file); + } + } + }, + + confirmAdd : function(e, settings) { + var elm = tinyMCE.isIE ? event.srcElement : e.target; + var elementId = elm.name ? elm.name : elm.id; + + tinyMCE.settings = settings; + + if (tinyMCE.settings['convert_on_click'] || (!elm.getAttribute('mce_noask') && confirm(tinyMCELang['lang_edit_confirm']))) + tinyMCE.addMCEControl(elm, elementId); + + elm.setAttribute('mce_noask', 'true'); + }, + + updateContent : function(form_element_name) { + // Find MCE instance linked to given form element and copy it's value + var formElement = document.getElementById(form_element_name); + for (var n in tinyMCE.instances) { + var inst = tinyMCE.instances[n]; + if (!tinyMCE.isInstance(inst)) + continue; + + inst.switchSettings(); + + if (inst.formElement == formElement) { + var doc = inst.getDoc(); + + tinyMCE._setHTML(doc, inst.formElement.value); + + if (!tinyMCE.isIE) + doc.body.innerHTML = tinyMCE._cleanupHTML(inst, doc, this.settings, doc.body, inst.visualAid); + } + } + }, + + addMCEControl : function(replace_element, form_element_name, target_document) { + var id = "mce_editor_" + tinyMCE.idCounter++; + var inst = new TinyMCE_Control(tinyMCE.settings); + + inst.editorId = id; + this.instances[id] = inst; + + inst._onAdd(replace_element, form_element_name, target_document); + }, + + removeInstance : function(ti) { + var t = [], n, i; + + // Remove from instances + for (n in tinyMCE.instances) { + i = tinyMCE.instances[n]; + + if (tinyMCE.isInstance(i) && ti != i) + t[n] = i; + } + + tinyMCE.instances = t; + + // Remove from global undo/redo + n = []; + t = tinyMCE.undoLevels; + + for (i=0; i 0) { + tinyMCE.nextUndoRedoAction = 'Undo'; + inst = this.undoLevels[--this.undoIndex]; + inst.select(); + + if (!tinyMCE.nextUndoRedoInstanceId) + inst.execCommand('Undo'); + } + } else + inst.execCommand('Undo'); + return true; + + case "Redo": + if (this.getParam('custom_undo_redo_global')) { + if (this.undoIndex <= this.undoLevels.length - 1) { + tinyMCE.nextUndoRedoAction = 'Redo'; + inst = this.undoLevels[this.undoIndex++]; + inst.select(); + + if (!tinyMCE.nextUndoRedoInstanceId) + inst.execCommand('Redo'); + } + } else + inst.execCommand('Redo'); + + return true; + + case 'mceFocus': + var inst = tinyMCE.getInstanceById(value); + if (inst) + inst.getWin().focus(); + return; + + case "mceAddControl": + case "mceAddEditor": + tinyMCE.addMCEControl(tinyMCE._getElementById(value), value); + return; + + case "mceAddFrameControl": + tinyMCE.addMCEControl(tinyMCE._getElementById(value['element'], value['document']), value['element'], value['document']); + return; + + case "mceRemoveControl": + case "mceRemoveEditor": + tinyMCE.removeMCEControl(value); + return; + + case "mceResetDesignMode": + // Resets the designmode state of the editors in Gecko + if (!tinyMCE.isIE) { + for (var n in tinyMCE.instances) { + if (!tinyMCE.isInstance(tinyMCE.instances[n])) + continue; + + try { + tinyMCE.instances[n].getDoc().designMode = "on"; + } catch (e) { + // Ignore any errors + } + } + } + + return; + } + + if (inst) { + inst.execCommand(command, user_interface, value); + } else if (tinyMCE.settings['focus_alert']) + alert(tinyMCELang['lang_focus_alert']); + }, + + _createIFrame : function(replace_element, doc, win) { + var iframe, id = replace_element.getAttribute("id"); + var aw, ah; + + if (typeof(doc) == "undefined") + doc = document; + + if (typeof(win) == "undefined") + win = window; + + iframe = doc.createElement("iframe"); + + aw = "" + tinyMCE.settings['area_width']; + ah = "" + tinyMCE.settings['area_height']; + + if (aw.indexOf('%') == -1) { + aw = parseInt(aw); + aw = (isNaN(aw) || aw < 0) ? 300 : aw; + aw = aw + "px"; + } + + if (ah.indexOf('%') == -1) { + ah = parseInt(ah); + ah = (isNaN(ah) || ah < 0) ? 240 : ah; + ah = ah + "px"; + } + + iframe.setAttribute("id", id); + iframe.setAttribute("name", id); + iframe.setAttribute("class", "mceEditorIframe"); + iframe.setAttribute("border", "0"); + iframe.setAttribute("frameBorder", "0"); + iframe.setAttribute("marginWidth", "0"); + iframe.setAttribute("marginHeight", "0"); + iframe.setAttribute("leftMargin", "0"); + iframe.setAttribute("topMargin", "0"); + iframe.setAttribute("width", aw); + iframe.setAttribute("height", ah); + iframe.setAttribute("allowtransparency", "true"); + iframe.className = 'mceEditorIframe'; + + if (tinyMCE.settings["auto_resize"]) + iframe.setAttribute("scrolling", "no"); + + // Must have a src element in MSIE HTTPs breaks aswell as absoute URLs + if (tinyMCE.isRealIE) + iframe.setAttribute("src", this.settings['default_document']); + + iframe.style.width = aw; + iframe.style.height = ah; + + // Ugly hack for Gecko problem in strict mode + if (tinyMCE.settings.strict_loading_mode) + iframe.style.marginBottom = '-5px'; + + // MSIE 5.0 issue + if (tinyMCE.isRealIE) + replace_element.outerHTML = iframe.outerHTML; + else + replace_element.parentNode.replaceChild(iframe, replace_element); + + if (tinyMCE.isRealIE) + return win.frames[id]; + else + return iframe; + }, + + setupContent : function(editor_id) { + var inst = tinyMCE.instances[editor_id], i; + var doc = inst.getDoc(); + var head = doc.getElementsByTagName('head').item(0); + var content = inst.startContent; + + // HTML values get XML encoded in strict mode + if (tinyMCE.settings.strict_loading_mode) { + content = content.replace(/</g, '<'); + content = content.replace(/>/g, '>'); + content = content.replace(/"/g, '"'); + content = content.replace(/&/g, '&'); + } + + inst.switchSettings(); + + // Not loaded correctly hit it again, Mozilla bug #997860 + if (!tinyMCE.isIE && tinyMCE.getParam("setupcontent_reload", false) && doc.title != "blank_page") { + // This part will remove the designMode status + // Failes first time in Firefox 1.5b2 on Mac + try {doc.location.href = tinyMCE.baseURL + "/blank.htm";} catch (ex) {} + window.setTimeout("tinyMCE.setupContent('" + editor_id + "');", 1000); + return; + } + + if (!head) { + window.setTimeout("tinyMCE.setupContent('" + editor_id + "');", 10); + return; + } + + // Import theme specific content CSS the user specific + tinyMCE.importCSS(inst.getDoc(), tinyMCE.baseURL + "/themes/" + inst.settings['theme'] + "/css/editor_content.css"); + tinyMCE.importCSS(inst.getDoc(), inst.settings['content_css']); + tinyMCE.dispatchCallback(inst, 'init_instance_callback', 'initInstance', inst); + + // Setup keyboard shortcuts + if (tinyMCE.getParam('custom_undo_redo_keyboard_shortcuts')) { + inst.addShortcut('ctrl', 'z', 'lang_undo_desc', 'Undo'); + inst.addShortcut('ctrl', 'y', 'lang_redo_desc', 'Redo'); + } + + // BlockFormat shortcuts keys + for (i=1; i<=6; i++) + inst.addShortcut('ctrl', '' + i, '', 'FormatBlock', false, ''); + + inst.addShortcut('ctrl', '7', '', 'FormatBlock', false, '

    '); + inst.addShortcut('ctrl', '8', '', 'FormatBlock', false, '

    '); + inst.addShortcut('ctrl', '9', '', 'FormatBlock', false, '
    '); + + // Add default shortcuts for gecko + if (tinyMCE.isGecko) { + inst.addShortcut('ctrl', 'b', 'lang_bold_desc', 'Bold'); + inst.addShortcut('ctrl', 'i', 'lang_italic_desc', 'Italic'); + inst.addShortcut('ctrl', 'u', 'lang_underline_desc', 'Underline'); + } + + // Setup span styles + if (tinyMCE.getParam("convert_fonts_to_spans")) + inst.getBody().setAttribute('id', 'mceSpanFonts'); + + if (tinyMCE.settings['nowrap']) + doc.body.style.whiteSpace = "nowrap"; + + doc.body.dir = this.settings['directionality']; + doc.editorId = editor_id; + + // Add on document element in Mozilla + if (!tinyMCE.isIE) + doc.documentElement.editorId = editor_id; + + inst.setBaseHREF(tinyMCE.settings['base_href']); + + // Replace new line characters to BRs + if (tinyMCE.settings['convert_newlines_to_brs']) { + content = tinyMCE.regexpReplace(content, "\r\n", "
    ", "gi"); + content = tinyMCE.regexpReplace(content, "\r", "
    ", "gi"); + content = tinyMCE.regexpReplace(content, "\n", "
    ", "gi"); + } + + // Open closed anchors + // content = content.replace(new RegExp('', 'gi'), ''); + + // Call custom cleanup code + content = tinyMCE.storeAwayURLs(content); + content = tinyMCE._customCleanup(inst, "insert_to_editor", content); + + if (tinyMCE.isIE) { + // Ugly!!! + window.setInterval('try{tinyMCE.getCSSClasses(tinyMCE.instances["' + editor_id + '"].getDoc(), "' + editor_id + '");}catch(e){}', 500); + + if (tinyMCE.settings["force_br_newlines"]) + doc.styleSheets[0].addRule("p", "margin: 0;"); + + var body = inst.getBody(); + body.editorId = editor_id; + } + + content = tinyMCE.cleanupHTMLCode(content); + + // Fix for bug #958637 + if (!tinyMCE.isIE) { + var contentElement = inst.getDoc().createElement("body"); + var doc = inst.getDoc(); + + contentElement.innerHTML = content; + + // Remove weridness! + if (tinyMCE.isGecko && tinyMCE.settings['remove_lt_gt']) + content = content.replace(new RegExp('<>', 'g'), ""); + + if (tinyMCE.settings['cleanup_on_startup']) + tinyMCE.setInnerHTML(inst.getBody(), tinyMCE._cleanupHTML(inst, doc, this.settings, contentElement)); + else + tinyMCE.setInnerHTML(inst.getBody(), content); + + tinyMCE.convertAllRelativeURLs(inst.getBody()); + } else { + if (tinyMCE.settings['cleanup_on_startup']) { + tinyMCE._setHTML(inst.getDoc(), content); + + // Produces permission denied error in MSIE 5.5 + eval('try {tinyMCE.setInnerHTML(inst.getBody(), tinyMCE._cleanupHTML(inst, inst.contentDocument, this.settings, inst.getBody()));} catch(e) {}'); + } else + tinyMCE._setHTML(inst.getDoc(), content); + } + + // Fix for bug #957681 + //inst.getDoc().designMode = inst.getDoc().designMode; + + // Setup element references + var parentElm = inst.targetDoc.getElementById(inst.editorId + '_parent'); + inst.formElement = tinyMCE.isGecko ? parentElm.previousSibling : parentElm.nextSibling; + + tinyMCE.handleVisualAid(inst.getBody(), true, tinyMCE.settings['visual'], inst); + tinyMCE.dispatchCallback(inst, 'setupcontent_callback', 'setupContent', editor_id, inst.getBody(), inst.getDoc()); + + // Re-add design mode on mozilla + if (!tinyMCE.isIE) + tinyMCE.addEventHandlers(inst); + + // Add blur handler + if (tinyMCE.isIE) { + tinyMCE.addEvent(inst.getBody(), "blur", TinyMCE_Engine.prototype._eventPatch); + tinyMCE.addEvent(inst.getBody(), "beforedeactivate", TinyMCE_Engine.prototype._eventPatch); // Bug #1439953 + + // Workaround for drag drop/copy paste base href bug + if (!tinyMCE.isOpera) { + tinyMCE.addEvent(doc.body, "mousemove", TinyMCE_Engine.prototype.onMouseMove); + tinyMCE.addEvent(doc.body, "beforepaste", TinyMCE_Engine.prototype._eventPatch); + tinyMCE.addEvent(doc.body, "drop", TinyMCE_Engine.prototype._eventPatch); + } + } + + // Trigger node change, this call locks buttons for tables and so forth + inst.select(); + tinyMCE.selectedElement = inst.contentWindow.document.body; + + // Call custom DOM cleanup + tinyMCE._customCleanup(inst, "insert_to_editor_dom", inst.getBody()); + tinyMCE._customCleanup(inst, "setup_content_dom", inst.getBody()); + tinyMCE._setEventsEnabled(inst.getBody(), false); + tinyMCE.cleanupAnchors(inst.getDoc()); + + if (tinyMCE.getParam("convert_fonts_to_spans")) + tinyMCE.convertSpansToFonts(inst.getDoc()); + + inst.startContent = tinyMCE.trim(inst.getBody().innerHTML); + inst.undoRedo.add({ content : inst.startContent }); + + // Cleanup any mess left from storyAwayURLs + if (tinyMCE.isGecko) { + // Remove mce_src from textnodes and comments + tinyMCE.selectNodes(inst.getBody(), function(n) { + if (n.nodeType == 3 || n.nodeType == 8) + n.nodeValue = n.nodeValue.replace(new RegExp('\\s(mce_src|mce_href)=\"[^\"]*\"', 'gi'), ""); + + return false; + }); + } + + // Remove Gecko spellchecking + if (tinyMCE.isGecko) + inst.getBody().spellcheck = tinyMCE.getParam("gecko_spellcheck"); + + // Cleanup any mess left from storyAwayURLs + tinyMCE._removeInternal(inst.getBody()); + + inst.select(); + tinyMCE.triggerNodeChange(false, true); + }, + + storeAwayURLs : function(s) { + // Remove all mce_src, mce_href and replace them with new ones + // s = s.replace(new RegExp('mce_src\\s*=\\s*\"[^ >\"]*\"', 'gi'), ''); + // s = s.replace(new RegExp('mce_href\\s*=\\s*\"[^ >\"]*\"', 'gi'), ''); + + if (!s.match(/(mce_src|mce_href)/gi, s)) { + s = s.replace(new RegExp('src\\s*=\\s*\"([^ >\"]*)\"', 'gi'), 'src="$1" mce_src="$1"'); + s = s.replace(new RegExp('href\\s*=\\s*\"([^ >\"]*)\"', 'gi'), 'href="$1" mce_href="$1"'); + } + + return s; + }, + + _removeInternal : function(n) { + if (tinyMCE.isGecko) { + // Remove mce_src from textnodes and comments + tinyMCE.selectNodes(n, function(n) { + if (n.nodeType == 3 || n.nodeType == 8) + n.nodeValue = n.nodeValue.replace(new RegExp('\\s(mce_src|mce_href)=\"[^\"]*\"', 'gi'), ""); + + return false; + }); + } + }, + + handleEvent : function(e) { + var inst = tinyMCE.selectedInstance; + + // Remove odd, error + if (typeof(tinyMCE) == "undefined") + return true; + + //tinyMCE.debug(e.type + " " + e.target.nodeName + " " + (e.relatedTarget ? e.relatedTarget.nodeName : "")); + + if (tinyMCE.executeCallback(tinyMCE.selectedInstance, 'handle_event_callback', 'handleEvent', e)) + return false; + + switch (e.type) { + case "beforedeactivate": // Was added due to bug #1439953 + case "blur": + if (tinyMCE.selectedInstance) + tinyMCE.selectedInstance.execCommand('mceEndTyping'); + + tinyMCE.hideMenus(); + + return; + + // Workaround for drag drop/copy paste base href bug + case "drop": + case "beforepaste": + if (tinyMCE.selectedInstance) + tinyMCE.selectedInstance.setBaseHREF(null); + + // Fixes odd MSIE bug where drag/droping elements in a iframe with height 100% breaks + // This logic forces the width/height to be in pixels while the user is drag/dropping + if (tinyMCE.isRealIE) { + var ife = tinyMCE.selectedInstance.iframeElement; + + /*if (ife.style.width.indexOf('%') != -1) { + ife._oldWidth = ife.width.height; + ife.style.width = ife.clientWidth; + }*/ + + if (ife.style.height.indexOf('%') != -1) { + ife._oldHeight = ife.style.height; + ife.style.height = ife.clientHeight; + } + } + + window.setTimeout("tinyMCE.selectedInstance.setBaseHREF(tinyMCE.settings['base_href']);tinyMCE._resetIframeHeight();", 1); + return; + + case "submit": + tinyMCE.triggerSave(); + tinyMCE.isNotDirty = true; + return; + + case "reset": + var formObj = tinyMCE.isIE ? window.event.srcElement : e.target; + + for (var i=0; i"); + rng.collapse(false); + rng.select(); + + tinyMCE.execCommand("mceAddUndoLevel"); + tinyMCE.triggerNodeChange(false); + return false; + } + } + + // Backspace or delete + if (e.keyCode == 8 || e.keyCode == 46) { + tinyMCE.selectedElement = e.target; + tinyMCE.linkElement = tinyMCE.getParentElement(e.target, "a"); + tinyMCE.imgElement = tinyMCE.getParentElement(e.target, "img"); + tinyMCE.triggerNodeChange(false); + } + + return false; + break; + + case "keyup": + case "keydown": + tinyMCE.hideMenus(); + tinyMCE.hasMouseMoved = false; + + if (inst && inst.handleShortcut(e)) + return false; + + if (e.target.editorId) + tinyMCE.instances[e.target.editorId].select(); + + if (tinyMCE.selectedInstance) + tinyMCE.selectedInstance.switchSettings(); + + var inst = tinyMCE.selectedInstance; + + // Handle backspace + if (tinyMCE.isGecko && tinyMCE.settings['force_p_newlines'] && (e.keyCode == 8 || e.keyCode == 46) && !e.shiftKey) { + // Insert P element instead of BR + if (TinyMCE_ForceParagraphs._handleBackSpace(tinyMCE.selectedInstance, e.type)) { + // Cancel event + tinyMCE.execCommand("mceAddUndoLevel"); + e.preventDefault(); + return false; + } + } + + tinyMCE.selectedElement = null; + tinyMCE.selectedNode = null; + var elm = tinyMCE.selectedInstance.getFocusElement(); + tinyMCE.linkElement = tinyMCE.getParentElement(elm, "a"); + tinyMCE.imgElement = tinyMCE.getParentElement(elm, "img"); + tinyMCE.selectedElement = elm; + + // Update visualaids on tabs + if (tinyMCE.isGecko && e.type == "keyup" && e.keyCode == 9) + tinyMCE.handleVisualAid(tinyMCE.selectedInstance.getBody(), true, tinyMCE.settings['visual'], tinyMCE.selectedInstance); + + // Fix empty elements on return/enter, check where enter occured + if (tinyMCE.isIE && e.type == "keydown" && e.keyCode == 13) + tinyMCE.enterKeyElement = tinyMCE.selectedInstance.getFocusElement(); + + // Fix empty elements on return/enter + if (tinyMCE.isIE && e.type == "keyup" && e.keyCode == 13) { + var elm = tinyMCE.enterKeyElement; + if (elm) { + var re = new RegExp('^HR|IMG|BR$','g'); // Skip these + var dre = new RegExp('^H[1-6]$','g'); // Add double on these + + if (!elm.hasChildNodes() && !re.test(elm.nodeName)) { + if (dre.test(elm.nodeName)) + elm.innerHTML = "  "; + else + elm.innerHTML = " "; + } + } + } + + // Check if it's a position key + var keys = tinyMCE.posKeyCodes; + var posKey = false; + for (var i=0; i'; + h += ''; + h += ''; + } else { + // Normal button + h += ''; + h += ''; + h += ''; + } + + return h; + }, + + getMenuButtonHTML : function(id, lang, img, mcmd, cmd, ui, val) { + var h = '', m, x; + + mcmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'' + mcmd + '\');'; + cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'' + cmd + '\''; + + if (typeof(ui) != "undefined" && ui != null) + cmd += ',' + ui; + + if (typeof(val) != "undefined" && val != null) + cmd += ",'" + val + "'"; + + cmd += ');'; + + // Use tilemaps when enabled and found and never in MSIE since it loads the tile each time from cache if cahce is disabled + if (tinyMCE.getParam('button_tile_map') && (!tinyMCE.isIE || tinyMCE.isOpera) && (m = tinyMCE.buttonMap[id]) != null && (tinyMCE.getParam("language") == "en" || img.indexOf('$lang') == -1)) { + x = 0 - (m * 20) == 0 ? '0' : 0 - (m * 20); + + if (tinyMCE.isRealIE) + h += ''; + else + h += ''; + + h += ''; + h += ''; + h += ''; + h += ''; + } else { + if (tinyMCE.isRealIE) + h += ''; + else + h += ''; + + h += ''; + h += ''; + h += ''; + h += ''; + } + + return h; + }, + + _menuButtonEvent : function(e, o) { + if (o.className == 'mceMenuButtonFocus') + return; + + if (e == 'over') + o.className = o.className + ' mceMenuHover'; + else + o.className = o.className.replace(/\s.*$/, ''); + }, + + addButtonMap : function(m) { + var i, a = m.replace(/\s+/, '').split(','); + + for (i=0; i 0); + + if (tinyMCE.settings['custom_undo_redo']) { + undoIndex = inst.undoRedo.undoIndex; + undoLevels = inst.undoRedo.undoLevels.length; + } + + tinyMCE.dispatchCallback(inst, 'handle_node_change_callback', 'handleNodeChange', editorId, elm, undoIndex, undoLevels, inst.visualAid, anySelection, setup_content); + } + + if (this.selectedInstance && (typeof(focus) == "undefined" || focus)) + this.selectedInstance.contentWindow.focus(); + }, + + _customCleanup : function(inst, type, content) { + var pl, po, i; + + // Call custom cleanup + var customCleanup = tinyMCE.settings['cleanup_callback']; + if (customCleanup != "" && eval("typeof(" + customCleanup + ")") != "undefined") + content = eval(customCleanup + "(type, content, inst);"); + + // Trigger theme cleanup + po = tinyMCE.themes[tinyMCE.settings['theme']]; + if (po && po.cleanup) + content = po.cleanup(type, content, inst); + + // Trigger plugin cleanups + pl = inst.plugins; + for (i=0; i 0) + className += " "; + + className += classNames[i]; + } + + return className; + }, + + handleVisualAid : function(el, deep, state, inst, skip_dispatch) { + if (!el) + return; + + if (!skip_dispatch) + tinyMCE.dispatchCallback(inst, 'handle_visual_aid_callback', 'handleVisualAid', el, deep, state, inst); + + var tableElement = null; + + switch (el.nodeName) { + case "TABLE": + var oldW = el.style.width; + var oldH = el.style.height; + var bo = tinyMCE.getAttrib(el, "border"); + + bo = bo == "" || bo == "0" ? true : false; + + tinyMCE.setAttrib(el, "class", tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el, "class"), state && bo)); + + el.style.width = oldW; + el.style.height = oldH; + + for (var y=0; y<\/o:p>", "
    "); + html = tinyMCE.regexpReplace(html, " <\/o:p>", ""); + html = tinyMCE.regexpReplace(html, "", ""); + html = tinyMCE.regexpReplace(html, "

    <\/p>", ""); + html = tinyMCE.regexpReplace(html, "

    <\/p>\r\n

    <\/p>", ""); + html = tinyMCE.regexpReplace(html, "

     <\/p>", "
    "); + html = tinyMCE.regexpReplace(html, "

    \s*(

    \s*)?", "

    "); + html = tinyMCE.regexpReplace(html, "<\/p>\s*(<\/p>\s*)?", "

    "); + }*/ + + // Always set the htmlText output + tinyMCE.setInnerHTML(doc.body, html); + } + + tinyMCE.cleanupAnchors(doc); + + if (tinyMCE.getParam("convert_fonts_to_spans")) + tinyMCE.convertSpansToFonts(doc); + }, + + getEditorId : function(form_element) { + var inst = this.getInstanceById(form_element); + if (!inst) + return null; + + return inst.editorId; + }, + + getInstanceById : function(editor_id) { + var inst = this.instances[editor_id]; + if (!inst) { + for (var n in tinyMCE.instances) { + var instance = tinyMCE.instances[n]; + if (!tinyMCE.isInstance(instance)) + continue; + + if (instance.formTargetElementId == editor_id) { + inst = instance; + break; + } + } + } + + return inst; + }, + + queryInstanceCommandValue : function(editor_id, command) { + var inst = tinyMCE.getInstanceById(editor_id); + if (inst) + return inst.queryCommandValue(command); + + return false; + }, + + queryInstanceCommandState : function(editor_id, command) { + var inst = tinyMCE.getInstanceById(editor_id); + if (inst) + return inst.queryCommandState(command); + + return null; + }, + + setWindowArg : function(n, v) { + this.windowArgs[n] = v; + }, + + getWindowArg : function(n, d) { + return (typeof(this.windowArgs[n]) == "undefined") ? d : this.windowArgs[n]; + }, + + getCSSClasses : function(editor_id, doc) { + var output = new Array(); + + // Is cached, use that + if (typeof(tinyMCE.cssClasses) != "undefined") + return tinyMCE.cssClasses; + + if (typeof(editor_id) == "undefined" && typeof(doc) == "undefined") { + var instance; + + for (var instanceName in tinyMCE.instances) { + instance = tinyMCE.instances[instanceName]; + if (!tinyMCE.isInstance(instance)) + continue; + + break; + } + + doc = instance.getDoc(); + } + + if (typeof(doc) == "undefined") { + var instance = tinyMCE.getInstanceById(editor_id); + doc = instance.getDoc(); + } + + if (doc) { + var styles = doc.styleSheets; + + if (styles && styles.length > 0) { + for (var x=0; x 0) + tinyMCE.cssClasses = output; + + return output; + }, + + regexpReplace : function(in_str, reg_exp, replace_str, opts) { + if (in_str == null) + return in_str; + + if (typeof(opts) == "undefined") + opts = 'g'; + + var re = new RegExp(reg_exp, opts); + return in_str.replace(re, replace_str); + }, + + trim : function(s) { + return s.replace(/^\s*|\s*$/g, ""); + }, + + cleanupEventStr : function(s) { + s = "" + s; + s = s.replace('function anonymous()\n{\n', ''); + s = s.replace('\n}', ''); + s = s.replace(/^return true;/gi, ''); // Remove event blocker + + return s; + }, + + getControlHTML : function(c) { + var i, l, n, o, v; + + l = tinyMCE.plugins; + for (n in l) { + o = l[n]; + + if (o.getControlHTML && (v = o.getControlHTML(c)) != '') + return tinyMCE.replaceVar(v, "pluginurl", o.baseURL); + } + + o = tinyMCE.themes[tinyMCE.settings['theme']]; + if (o.getControlHTML && (v = o.getControlHTML(c)) != '') + return v; + + return ''; + }, + + evalFunc : function(f, idx, a, o) { + var s = '(', i; + + for (i=idx; i 0) + return true; + + if (ins != null) { + for (i=0, l = ins.plugins; i 0) + return true; + } + } + + l = tinyMCE.themes; + for (on in l) { + o = l[on]; + + if (o[n] && (v = tinyMCE.evalFunc(n, 3, a, o)) == s && m > 0) + return true; + } + + return false; + }, + + xmlEncode : function(s) { + return s ? ('' + s).replace(new RegExp('[<>&"\']', 'g'), function (c, b) { + switch (c) { + case '&': + return '&'; + + case '"': + return '"'; + + case '\'': + return '''; // ' is not working in MSIE + + case '<': + return '<'; + + case '>': + return '>'; + } + + return c; + }) : s; + }, + + extend : function(p, np) { + var o = {}; + + o.parent = p; + + for (n in p) + o[n] = p[n]; + + for (n in np) + o[n] = np[n]; + + return o; + }, + + hideMenus : function() { + var e = tinyMCE.lastSelectedMenuBtn; + + if (tinyMCE.lastMenu) { + tinyMCE.lastMenu.hide(); + tinyMCE.lastMenu = null; + } + + if (e) { + tinyMCE.switchClass(e, tinyMCE.lastMenuBtnClass); + tinyMCE.lastSelectedMenuBtn = null; + } + } + + }; + +// Global instances +var TinyMCE = TinyMCE_Engine; // Compatiblity with gzip compressors +var tinyMCE = new TinyMCE_Engine(); +var tinyMCELang = {}; + +/* file:jscripts/tiny_mce/classes/TinyMCE_Control.class.js */ + +function TinyMCE_Control(settings) { + var t, i, to, fu, p, x, fn, fu, pn, s = settings; + + this.undoRedoLevel = true; + this.isTinyMCE_Control = true; + + // Default settings + this.settings = s; + this.settings['theme'] = tinyMCE.getParam("theme", "default"); + this.settings['width'] = tinyMCE.getParam("width", -1); + this.settings['height'] = tinyMCE.getParam("height", -1); + this.selection = new TinyMCE_Selection(this); + this.undoRedo = new TinyMCE_UndoRedo(this); + this.cleanup = new TinyMCE_Cleanup(); + this.shortcuts = new Array(); + this.hasMouseMoved = false; + this.foreColor = this.backColor = "#999999"; + this.data = {}; + + this.cleanup.init({ + valid_elements : s.valid_elements, + extended_valid_elements : s.extended_valid_elements, + valid_child_elements : s.valid_child_elements, + entities : s.entities, + entity_encoding : s.entity_encoding, + debug : s.cleanup_debug, + url_converter : 'TinyMCE_Cleanup.prototype._urlConverter', + indent : s.apply_source_formatting, + invalid_elements : s.invalid_elements, + verify_html : s.verify_html, + fix_content_duplication : s.fix_content_duplication + }); + + // Wrap old theme + t = this.settings['theme']; + if (!tinyMCE.hasTheme(t)) { + fn = tinyMCE.callbacks; + to = {}; + + for (i=0; i 0) { + for (i=0; i 1 && tinyMCE.currentConfig != this.settings['index']) { + tinyMCE.settings = this.settings; + tinyMCE.currentConfig = this.settings['index']; + } + }, + + select : function() { + var oldInst = tinyMCE.selectedInstance; + + if (oldInst != this) { + if (oldInst) + oldInst.execCommand('mceEndTyping'); + + tinyMCE.dispatchCallback(this, 'select_instance_callback', 'selectInstance', this, oldInst); + tinyMCE.selectedInstance = this; + } + }, + + getBody : function() { + return this.contentBody ? this.contentBody : this.getDoc().body; + }, + + getDoc : function() { +// return this.contentDocument ? this.contentDocument : this.contentWindow.document; // Removed due to IE 5.5 ? + return this.contentWindow.document; + }, + + getWin : function() { + return this.contentWindow; + }, + + getContainerWin : function() { + return this.containerWindow ? this.containerWindow : window; + }, + + getViewPort : function() { + return tinyMCE.getViewPort(this.getWin()); + }, + + getParentNode : function(n, f) { + return tinyMCE.getParentNode(n, f, this.getBody()); + }, + + getParentElement : function(n, na, f) { + return tinyMCE.getParentElement(n, na, f, this.getBody()); + }, + + getParentBlockElement : function(n) { + return tinyMCE.getParentBlockElement(n, this.getBody()); + }, + + resizeToContent : function() { + var d = this.getDoc(), b = d.body, de = d.documentElement; + + this.iframeElement.style.height = (tinyMCE.isRealIE) ? b.scrollHeight : de.offsetHeight + 'px'; + }, + + addShortcut : function(m, k, d, cmd, ui, va) { + var n = typeof(k) == "number", ie = tinyMCE.isIE, c, sc, i, scl = this.shortcuts; + + if (!tinyMCE.getParam('custom_shortcuts')) + return false; + + m = m.toLowerCase(); + k = ie && !n ? k.toUpperCase() : k; + c = n ? null : k.charCodeAt(0); + d = d && d.indexOf('lang_') == 0 ? tinyMCE.getLang(d) : d; + + sc = { + alt : m.indexOf('alt') != -1, + ctrl : m.indexOf('ctrl') != -1, + shift : m.indexOf('shift') != -1, + charCode : c, + keyCode : n ? k : (ie ? c : null), + desc : d, + cmd : cmd, + ui : ui, + val : va + }; + + for (i=0; i 0) + rng.pasteHTML('
    ' + rng.htmlText + "
    "); + + tinyMCE.triggerNodeChange(); + return; + } + } + } + + switch (command) { + case "mceRepaint": + this.repaint(); + return true; + + case "unlink": + // Unlink if caret is inside link + if (tinyMCE.isGecko && this.getSel().isCollapsed) { + focusElm = tinyMCE.getParentElement(focusElm, 'A'); + + if (focusElm) + this.selection.selectNode(focusElm, false); + } + + this.getDoc().execCommand(command, user_interface, value); + + tinyMCE.isGecko && this.getSel().collapseToEnd(); + + tinyMCE.triggerNodeChange(); + + return true; + + case "FormatBlock": + if (!this.cleanup.isValid(value)) + return true; + + this.getDoc().execCommand(command, user_interface, value); + tinyMCE.triggerNodeChange(); + break; + + case "InsertUnorderedList": + case "InsertOrderedList": + this.getDoc().execCommand(command, user_interface, value); + tinyMCE.triggerNodeChange(); + break; + + case "Strikethrough": + this.getDoc().execCommand(command, user_interface, value); + tinyMCE.triggerNodeChange(); + break; + + case "mceSelectNode": + this.selection.selectNode(value); + tinyMCE.triggerNodeChange(); + tinyMCE.selectedNode = value; + break; + + case "FormatBlock": + if (value == null || value == "") { + var elm = tinyMCE.getParentElement(this.getFocusElement(), "p,div,h1,h2,h3,h4,h5,h6,pre,address,blockquote,dt,dl,dd,samp"); + + if (elm) + this.execCommand("mceRemoveNode", false, elm); + } else { + if (tinyMCE.isGecko && new RegExp('<(div|blockquote|code|dt|dd|dl|samp)>', 'gi').test(value)) + value = value.replace(/[^a-z]/gi, ''); + + if (tinyMCE.isIE && new RegExp('blockquote|code|samp', 'gi').test(value)) { + var b = this.selection.getBookmark(); + this.getDoc().execCommand("FormatBlock", false, '

    '); + tinyMCE.renameElement(tinyMCE.getParentBlockElement(this.getFocusElement()), value); + this.selection.moveToBookmark(b); + } else + this.getDoc().execCommand("FormatBlock", false, value); + } + + tinyMCE.triggerNodeChange(); + + break; + + case "mceRemoveNode": + if (!value) + value = tinyMCE.getParentElement(this.getFocusElement()); + + if (tinyMCE.isIE) { + value.outerHTML = value.innerHTML; + } else { + var rng = value.ownerDocument.createRange(); + rng.setStartBefore(value); + rng.setEndAfter(value); + rng.deleteContents(); + rng.insertNode(rng.createContextualFragment(value.innerHTML)); + } + + tinyMCE.triggerNodeChange(); + + break; + + case "mceSelectNodeDepth": + var parentNode = this.getFocusElement(); + for (var i=0; parentNode; i++) { + if (parentNode.nodeName.toLowerCase() == "body") + break; + + if (parentNode.nodeName.toLowerCase() == "#text") { + i--; + parentNode = parentNode.parentNode; + continue; + } + + if (i == value) { + this.selection.selectNode(parentNode, false); + tinyMCE.triggerNodeChange(); + tinyMCE.selectedNode = parentNode; + return; + } + + parentNode = parentNode.parentNode; + } + + break; + + case "SetStyleInfo": + var rng = this.getRng(); + var sel = this.getSel(); + var scmd = value['command']; + var sname = value['name']; + var svalue = value['value'] == null ? '' : value['value']; + //var svalue = value['value'] == null ? '' : value['value']; + var wrapper = value['wrapper'] ? value['wrapper'] : "span"; + var parentElm = null; + var invalidRe = new RegExp("^BODY|HTML$", "g"); + var invalidParentsRe = tinyMCE.settings['merge_styles_invalid_parents'] != '' ? new RegExp(tinyMCE.settings['merge_styles_invalid_parents'], "gi") : null; + + // Whole element selected check + if (tinyMCE.isIE) { + // Control range + if (rng.item) + parentElm = rng.item(0); + else { + var pelm = rng.parentElement(); + var prng = doc.selection.createRange(); + prng.moveToElementText(pelm); + + if (rng.htmlText == prng.htmlText || rng.boundingWidth == 0) { + if (invalidParentsRe == null || !invalidParentsRe.test(pelm.nodeName)) + parentElm = pelm; + } + } + } else { + var felm = this.getFocusElement(); + if (sel.isCollapsed || (new RegExp('td|tr|tbody|table', 'gi').test(felm.nodeName) && sel.anchorNode == felm.parentNode)) + parentElm = felm; + } + + // Whole element selected + if (parentElm && !invalidRe.test(parentElm.nodeName)) { + if (scmd == "setstyle") + tinyMCE.setStyleAttrib(parentElm, sname, svalue); + + if (scmd == "setattrib") + tinyMCE.setAttrib(parentElm, sname, svalue); + + if (scmd == "removeformat") { + parentElm.style.cssText = ''; + tinyMCE.setAttrib(parentElm, 'class', ''); + } + + // Remove style/attribs from all children + var ch = tinyMCE.getNodeTree(parentElm, new Array(), 1); + for (var z=0; z=0; i--) { + var elm = nodes[i]; + var isNew = tinyMCE.getAttrib(elm, "mce_new") == "true"; + + elm.removeAttribute("mce_new"); + + // Is only child a element + if (elm.childNodes && elm.childNodes.length == 1 && elm.childNodes[0].nodeType == 1) { + //tinyMCE.debug("merge1" + isNew); + this._mergeElements(scmd, elm, elm.childNodes[0], isNew); + continue; + } + + // Is I the only child + if (elm.parentNode.childNodes.length == 1 && !invalidRe.test(elm.nodeName) && !invalidRe.test(elm.parentNode.nodeName)) { + //tinyMCE.debug("merge2" + isNew + "," + elm.nodeName + "," + elm.parentNode.nodeName); + if (invalidParentsRe == null || !invalidParentsRe.test(elm.parentNode.nodeName)) + this._mergeElements(scmd, elm.parentNode, elm, false); + } + } + + // Remove empty wrappers + var nodes = doc.getElementsByTagName(wrapper); + for (var i=nodes.length-1; i>=0; i--) { + var elm = nodes[i]; + var isEmpty = true; + + // Check if it has any attribs + var tmp = doc.createElement("body"); + tmp.appendChild(elm.cloneNode(false)); + + // Is empty span, remove it + tmp.innerHTML = tmp.innerHTML.replace(new RegExp('style=""|class=""', 'gi'), ''); + //tinyMCE.debug(tmp.innerHTML); + if (new RegExp('', 'gi').test(tmp.innerHTML)) { + for (var x=0; x 0) { + value = tinyMCE.replaceVar(value, "selection", selectedText); + tinyMCE.execCommand('mceInsertContent', false, value); + } + + tinyMCE.triggerNodeChange(); + break; + + case "mceSetAttribute": + if (typeof(value) == 'object') { + var targetElms = (typeof(value['targets']) == "undefined") ? "p,img,span,div,td,h1,h2,h3,h4,h5,h6,pre,address" : value['targets']; + var targetNode = tinyMCE.getParentElement(this.getFocusElement(), targetElms); + + if (targetNode) { + targetNode.setAttribute(value['name'], value['value']); + tinyMCE.triggerNodeChange(); + } + } + break; + + case "mceSetCSSClass": + this.execCommand("SetStyleInfo", false, {command : "setattrib", name : "class", value : value}); + break; + + case "mceInsertRawHTML": + var key = 'tiny_mce_marker'; + + this.execCommand('mceBeginUndoLevel'); + + // Insert marker key + this.execCommand('mceInsertContent', false, key); + + // Store away scroll pos + var scrollX = this.getBody().scrollLeft + this.getDoc().documentElement.scrollLeft; + var scrollY = this.getBody().scrollTop + this.getDoc().documentElement.scrollTop; + + // Find marker and replace with RAW HTML + var html = this.getBody().innerHTML; + if ((pos = html.indexOf(key)) != -1) + tinyMCE.setInnerHTML(this.getBody(), html.substring(0, pos) + value + html.substring(pos + key.length)); + + // Restore scoll pos + this.contentWindow.scrollTo(scrollX, scrollY); + + this.execCommand('mceEndUndoLevel'); + + break; + + case "mceInsertContent": + // Force empty string + if (!value) + value = ''; + + var insertHTMLFailed = false; + + // Removed since it produced problems in IE + // this.getWin().focus(); + + if (tinyMCE.isGecko || tinyMCE.isOpera) { + try { + // Is plain text or HTML, &,   etc will be encoded wrong in FF + if (value.indexOf('<') == -1 && !value.match(/(&| |<|>)/g)) { + var r = this.getRng(); + var n = this.getDoc().createTextNode(tinyMCE.entityDecode(value)); + var s = this.getSel(); + var r2 = r.cloneRange(); + + // Insert text at cursor position + s.removeAllRanges(); + r.deleteContents(); + r.insertNode(n); + + // Move the cursor to the end of text + r2.selectNode(n); + r2.collapse(false); + s.removeAllRanges(); + s.addRange(r2); + } else { + value = tinyMCE.fixGeckoBaseHREFBug(1, this.getDoc(), value); + this.getDoc().execCommand('inserthtml', false, value); + tinyMCE.fixGeckoBaseHREFBug(2, this.getDoc(), value); + } + } catch (ex) { + insertHTMLFailed = true; + } + + if (!insertHTMLFailed) { + tinyMCE.triggerNodeChange(); + return; + } + } + + if (!tinyMCE.isIE) { + var isHTML = value.indexOf('<') != -1; + var sel = this.getSel(); + var rng = this.getRng(); + + if (isHTML) { + if (tinyMCE.isSafari) { + var tmpRng = this.getDoc().createRange(); + + tmpRng.setStart(this.getBody(), 0); + tmpRng.setEnd(this.getBody(), 0); + + value = tmpRng.createContextualFragment(value); + } else + value = rng.createContextualFragment(value); + } else { + // Setup text node + var el = document.createElement("div"); + el.innerHTML = value; + value = el.firstChild.nodeValue; + value = doc.createTextNode(value); + } + + // Insert plain text in Safari + if (tinyMCE.isSafari && !isHTML) { + this.execCommand('InsertText', false, value.nodeValue); + tinyMCE.triggerNodeChange(); + return true; + } else if (tinyMCE.isSafari && isHTML) { + rng.deleteContents(); + rng.insertNode(value); + tinyMCE.triggerNodeChange(); + return true; + } + + rng.deleteContents(); + + // If target node is text do special treatment, (Mozilla 1.3 fix) + if (rng.startContainer.nodeType == 3) { + var node = rng.startContainer.splitText(rng.startOffset); + node.parentNode.insertBefore(value, node); + } else + rng.insertNode(value); + + if (!isHTML) { + // Removes weird selection trails + sel.selectAllChildren(doc.body); + sel.removeAllRanges(); + + // Move cursor to end of content + var rng = doc.createRange(); + + rng.selectNode(value); + rng.collapse(false); + + sel.addRange(rng); + } else + rng.collapse(false); + + tinyMCE.fixGeckoBaseHREFBug(2, this.getDoc(), value); + } else { + var rng = doc.selection.createRange(), tmpRng = null; + var c = value.indexOf('"; + } + + if (hc) { + cn = n.childNodes; + + for (i=0, l=cn.length; i'; + + return h; + }, + + _serializeAttribute : function(n, r, an) { + var av = '', t, os = this.settings.on_save; + + if (os && (an.indexOf('mce_') == 0 || an.indexOf('_moz') == 0)) + return ''; + + if (os && this.mceAttribs[an]) + av = this._getAttrib(n, this.mceAttribs[an]); + + if (av.length == 0) + av = this._getAttrib(n, an); + + if (av.length == 0 && r.defaultAttribs && (t = r.defaultAttribs[an])) { + av = t; + + if (av == "mce_empty") + return " " + an + '=""'; + } + + if (r.forceAttribs && (t = r.forceAttribs[an])) + av = t; + + if (os && av.length != 0 && this.settings.url_converter.length != 0 && /^(src|href|longdesc)$/.test(an)) + av = eval(this.settings.url_converter + '(this, n, av)'); + + if (av.length != 0 && r.validAttribValues && r.validAttribValues[an] && !r.validAttribValues[an].test(av)) + return ""; + + if (av.length != 0 && av == "{$uid}") + av = "uid_" + (this.idCount++); + + if (av.length != 0) { + if (an.indexOf('on') != 0) + av = this.xmlEncode(av); + + return " " + an + "=" + '"' + av + '"'; + } + + return ""; + }, + + formatHTML : function(h) { + var s = this.settings, p = '', i = 0, li = 0, o = '', l; + + // Replace BR in pre elements to \n + h = h.replace(/]*)>(.*?)<\/pre>/gi, function (a, b, c) { + c = c.replace(//gi, '\n'); + return '' + c + ''; + }); + + h = h.replace(/\r/g, ''); // Windows sux, isn't carriage return a thing of the past :) + h = '\n' + h; + h = h.replace(new RegExp('\\n\\s+', 'gi'), '\n'); // Remove previous formatting + h = h.replace(this.nlBeforeRe, '\n<$1$2>'); + h = h.replace(this.nlAfterRe, '<$1$2>\n'); + h = h.replace(this.nlBeforeAfterRe, '\n<$1$2$3>\n'); + h += '\n'; + + //tinyMCE.debug(h); + + while ((i = h.indexOf('\n', i + 1)) != -1) { + if ((l = h.substring(li + 1, i)).length != 0) { + if (this.ouRe.test(l) && p.length >= s.indent_levels) + p = p.substring(s.indent_levels); + + o += p + l + '\n'; + + if (this.inRe.test(l)) + p += this.inStr; + } + + li = i; + } + + //tinyMCE.debug(h); + + return o; + }, + + xmlEncode : function(s) { + var cl = this; + + this._setupEntities(); // Will intialize lookup table + + switch (this.settings.entity_encoding) { + case "raw": + return tinyMCE.xmlEncode(s); + + case "named": + return s.replace(new RegExp('[\u007F-\uFFFF<>&"\']', 'g'), function (c, b) { + b = cl.entities[c.charCodeAt(0)]; + + return b ? '&' + b + ';' : c; + }); + + case "numeric": + return s.replace(new RegExp('[\u007F-\uFFFF<>&"\']', 'g'), function (c, b) { + return b ? '&#' + c.charCodeAt(0) + ';' : c; + }); + } + + return s; + }, + + split : function(re, s) { + var c = s.split(re); + var i, l, o = new Array(); + + for (i=0, l=c.length; i' : '>' + h + ''; + + return o; +}; + +TinyMCE_Engine.prototype.createTag = function(d, tn, a, h) { + var o = d.createElement(tn); + + if (a) { + for (n in a) { + if (typeof(a[n]) != 'function' && a[n] != null) + tinyMCE.setAttrib(o, n, a[n]); + } + } + + if (h) + o.innerHTML = h; + + return o; +}; + +TinyMCE_Engine.prototype.getElementByAttributeValue = function(n, e, a, v) { + return (n = this.getElementsByAttributeValue(n, e, a, v)).length == 0 ? null : n[0]; +}; + +TinyMCE_Engine.prototype.getElementsByAttributeValue = function(n, e, a, v) { + var i, nl = n.getElementsByTagName(e), o = new Array(); + + for (i=0; i/gi, ''); + h = h.replace(/<\/em>/gi, ''); + } + + if (tinyMCE.isRealIE) { + // Since MSIE handles invalid HTML better that valid XHTML we + // need to make some things invalid.


    gets converted to
    . + h = h.replace(/\s\/>/g, '>'); + + // Since MSIE auto generated emtpy P tags some times we must tell it to keep the real ones + h = h.replace(/]*)>\u00A0?<\/p>/gi, ' 

    '); // Keep empty paragraphs + h = h.replace(/]*)>\s* \s*<\/p>/gi, ' 

    '); // Keep empty paragraphs + h = h.replace(/]*)>\s+<\/p>/gi, ' 

    '); // Keep empty paragraphs + + // Remove first comment + e.innerHTML = tinyMCE.uniqueTag + h; + e.firstChild.removeNode(true); + + // Remove weird auto generated empty paragraphs unless it's supposed to be there + nl = e.getElementsByTagName("p"); + for (i=nl.length-1; i>=0; i--) { + n = nl[i]; + + if (n.nodeName == 'P' && !n.hasChildNodes() && !n.mce_keep) + n.parentNode.removeChild(n); + } + } else { + h = this.fixGeckoBaseHREFBug(1, e, h); + e.innerHTML = h; + this.fixGeckoBaseHREFBug(2, e, h); + } +}; + +TinyMCE_Engine.prototype.getOuterHTML = function(e) { + if (tinyMCE.isIE) + return e.outerHTML; + + var d = e.ownerDocument.createElement("body"); + d.appendChild(e.cloneNode(true)); + return d.innerHTML; +}; + +TinyMCE_Engine.prototype.setOuterHTML = function(e, h, d) { + var d = typeof(d) == "undefined" ? e.ownerDocument : d, i, nl, t; + + if (tinyMCE.isIE && e.nodeType == 1) + e.outerHTML = h; + else { + t = d.createElement("body"); + t.innerHTML = h; + + for (i=0, nl=t.childNodes; i-1; i--) { + if (ar[i].specified && ar[i].nodeValue) + ne.setAttribute(ar[i].nodeName.toLowerCase(), ar[i].nodeValue); + } + + ar = e.childNodes; + for (i=0; i= strTok2.length) { + for (var i=0; i= strTok2.length || strTok1[i] != strTok2[i]) { + breakPoint = i + 1; + break; + } + } + } + + if (strTok1.length < strTok2.length) { + for (var i=0; i= strTok1.length || strTok1[i] != strTok2[i]) { + breakPoint = i + 1; + break; + } + } + } + + if (breakPoint == 1) + return targetURL.path; + + for (var i=0; i<(strTok1.length-(breakPoint-1)); i++) + outPath += "../"; + + for (var i=breakPoint-1; i=0; i--) { + if (baseURLParts[i].length == 0) + continue; + + newBaseURLParts[newBaseURLParts.length] = baseURLParts[i]; + } + baseURLParts = newBaseURLParts.reverse(); + + // Merge relURLParts chunks + var newRelURLParts = new Array(); + var numBack = 0; + for (var i=relURLParts.length-1; i>=0; i--) { + if (relURLParts[i].length == 0 || relURLParts[i] == ".") + continue; + + if (relURLParts[i] == '..') { + numBack++; + continue; + } + + if (numBack > 0) { + numBack--; + continue; + } + + newRelURLParts[newRelURLParts.length] = relURLParts[i]; + } + + relURLParts = newRelURLParts.reverse(); + + // Remove end from absolute path + var len = baseURLParts.length-numBack; + var absPath = (len <= 0 ? "" : "/") + baseURLParts.slice(0, len).join('/') + "/" + relURLParts.join('/'); + var start = "", end = ""; + + // Build output URL + relURL.protocol = baseURL.protocol; + relURL.host = baseURL.host; + relURL.port = baseURL.port; + + // Re-add trailing slash if it's removed + if (relURL.path.charAt(relURL.path.length-1) == "/") + absPath += "/"; + + relURL.path = absPath; + + return this.serializeURL(relURL); +}; + +TinyMCE_Engine.prototype.convertURL = function(url, node, on_save) { + var prot = document.location.protocol; + var host = document.location.hostname; + var port = document.location.port; + + // Pass through file protocol + if (prot == "file:") + return url; + + // Something is wrong, remove weirdness + url = tinyMCE.regexpReplace(url, '(http|https):///', '/'); + + // Mailto link or anchor (Pass through) + if (url.indexOf('mailto:') != -1 || url.indexOf('javascript:') != -1 || tinyMCE.regexpReplace(url,'[ \t\r\n\+]|%20','').charAt(0) == "#") + return url; + + // Fix relative/Mozilla + if (!tinyMCE.isIE && !on_save && url.indexOf("://") == -1 && url.charAt(0) != '/') + return tinyMCE.settings['base_href'] + url; + + // Handle relative URLs + if (on_save && tinyMCE.getParam('relative_urls')) { + var curl = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], url); + if (curl.charAt(0) == '/') + curl = tinyMCE.settings['document_base_prefix'] + curl; + + var urlParts = tinyMCE.parseURL(curl); + var tmpUrlParts = tinyMCE.parseURL(tinyMCE.settings['document_base_url']); + + // Force relative + if (urlParts['host'] == tmpUrlParts['host'] && (urlParts['port'] == tmpUrlParts['port'])) + return tinyMCE.convertAbsoluteURLToRelativeURL(tinyMCE.settings['document_base_url'], curl); + } + + // Handle absolute URLs + if (!tinyMCE.getParam('relative_urls')) { + var urlParts = tinyMCE.parseURL(url); + var baseUrlParts = tinyMCE.parseURL(tinyMCE.settings['base_href']); + + // Force absolute URLs from relative URLs + url = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], url); + + // If anchor and path is the same page + if (urlParts['anchor'] && urlParts['path'] == baseUrlParts['path']) + return "#" + urlParts['anchor']; + } + + // Remove current domain + if (tinyMCE.getParam('remove_script_host')) { + var start = "", portPart = ""; + + if (port != "") + portPart = ":" + port; + + start = prot + "//" + host + portPart + "/"; + + if (url.indexOf(start) == 0) + url = url.substring(start.length-1); + } + + return url; +}; + +TinyMCE_Engine.prototype.convertAllRelativeURLs = function(body) { + var i, elms, src, href, mhref, msrc; + + // Convert all image URL:s to absolute URL + elms = body.getElementsByTagName("img"); + for (i=0; i bookmark.index) { + try { + rng.addElement(nl[bookmark.index]); + } catch (ex) { + // Might be thrown if the node no longer exists + } + } + } else { + // Try/catch needed since this operation breaks when TinyMCE is placed in hidden divs/tabs + try { + // Incorrect bookmark + if (bookmark.start < 0) + return true; + + rng = inst.getSel().createRange(); + rng.moveToElementText(inst.getBody()); + rng.collapse(true); + rng.moveStart('character', bookmark.start); + rng.moveEnd('character', bookmark.length); + } catch (ex) { + return true; + } + } + + rng.select(); + + win.scrollTo(bookmark.scrollX, bookmark.scrollY); + return true; + } + + if (tinyMCE.isGecko || tinyMCE.isOpera) { + if (bookmark.rng) { + sel.removeAllRanges(); + sel.addRange(bookmark.rng); + } + + if (bookmark.start != -1 && bookmark.end != -1) { + try { + sd = this._getTextPos(b, bookmark.start, bookmark.end); + rng = doc.createRange(); + rng.setStart(sd.startNode, sd.startOffset); + rng.setEnd(sd.endNode, sd.endOffset); + sel.removeAllRanges(); + sel.addRange(rng); + win.focus(); + } catch (ex) { + // Ignore + } + } + + /* + if (typeof(bookmark.index) != 'undefined') { + tinyMCE.selectElements(b, 'IMG', function (n) { + if (bookmark.index-- == 0) { + // Select image in Gecko here + } + + return false; + }); + } + */ + + win.scrollTo(bookmark.scrollX, bookmark.scrollY); + return true; + } + + return false; + }, + + _getPosText : function(r, sn, en) { + var w = document.createTreeWalker(r, NodeFilter.SHOW_TEXT, null, false), n, p = 0, d = {}; + + while ((n = w.nextNode()) != null) { + if (n == sn) + d.start = p; + + if (n == en) { + d.end = p; + return d; + } + + p += n.nodeValue ? n.nodeValue.length : 0; + } + + return null; + }, + + _getTextPos : function(r, sp, ep) { + var w = document.createTreeWalker(r, NodeFilter.SHOW_TEXT, null, false), n, p = 0, d = {}; + + while ((n = w.nextNode()) != null) { + p += n.nodeValue ? n.nodeValue.length : 0; + + if (p >= sp && !d.startNode) { + d.startNode = n; + d.startOffset = sp - (p - n.nodeValue.length); + } + + if (p >= ep) { + d.endNode = n; + d.endOffset = ep - (p - n.nodeValue.length); + + return d; + } + } + + return null; + }, + + selectNode : function(node, collapse, select_text_node, to_start) { + var inst = this.instance, sel, rng, nodes; + + if (!node) + return; + + if (typeof(collapse) == "undefined") + collapse = true; + + if (typeof(select_text_node) == "undefined") + select_text_node = false; + + if (typeof(to_start) == "undefined") + to_start = true; + + if (inst.settings.auto_resize) + inst.resizeToContent(); + + if (tinyMCE.isRealIE) { + rng = inst.getDoc().body.createTextRange(); + + try { + rng.moveToElementText(node); + + if (collapse) + rng.collapse(to_start); + + rng.select(); + } catch (e) { + // Throws illigal agrument in MSIE some times + } + } else { + sel = this.getSel(); + + if (!sel) + return; + + if (tinyMCE.isSafari) { + sel.setBaseAndExtent(node, 0, node, node.innerText.length); + + if (collapse) { + if (to_start) + sel.collapseToStart(); + else + sel.collapseToEnd(); + } + + this.scrollToNode(node); + + return; + } + + rng = inst.getDoc().createRange(); + + if (select_text_node) { + // Find first textnode in tree + nodes = tinyMCE.getNodeTree(node, new Array(), 3); + if (nodes.length > 0) + rng.selectNodeContents(nodes[0]); + else + rng.selectNodeContents(node); + } else + rng.selectNode(node); + + if (collapse) { + // Special treatment of textnode collapse + if (!to_start && node.nodeType == 3) { + rng.setStart(node, node.nodeValue.length); + rng.setEnd(node, node.nodeValue.length); + } else + rng.collapse(to_start); + } + + sel.removeAllRanges(); + sel.addRange(rng); + } + + this.scrollToNode(node); + + // Set selected element + tinyMCE.selectedElement = null; + if (node.nodeType == 1) + tinyMCE.selectedElement = node; + }, + + scrollToNode : function(node) { + var inst = this.instance, w = inst.getWin(), vp = inst.getViewPort(), pos = tinyMCE.getAbsPosition(node), cvp, p, cwin; + + // Only scroll if out of visible area + if (pos.absLeft < vp.left || pos.absLeft > vp.left + vp.width || pos.absTop < vp.top || pos.absTop > vp.top + (vp.height-25)) + w.scrollTo(pos.absLeft, pos.absTop - vp.height + 25); + + // Scroll container window + if (inst.settings.auto_resize) { + cwin = inst.getContainerWin(); + cvp = tinyMCE.getViewPort(cwin); + p = this.getAbsPosition(node); + + if (p.absLeft < cvp.left || p.absLeft > cvp.left + cvp.width || p.absTop < cvp.top || p.absTop > cvp.top + cvp.height) + cwin.scrollTo(p.absLeft, p.absTop - cvp.height + 25); + } + }, + + getAbsPosition : function(n) { + var pos = tinyMCE.getAbsPosition(n), ipos = tinyMCE.getAbsPosition(this.instance.iframeElement); + + return { + absLeft : ipos.absLeft + pos.absLeft, + absTop : ipos.absTop + pos.absTop + }; + }, + + getSel : function() { + var inst = this.instance; + + if (tinyMCE.isRealIE) + return inst.getDoc().selection; + + return inst.contentWindow.getSelection(); + }, + + getRng : function() { + var s = this.getSel(); + + if (s == null) + return null; + + if (tinyMCE.isRealIE) + return s.createRange(); + + if (tinyMCE.isSafari && !s.getRangeAt) + return '' + window.getSelection(); + + return s.getRangeAt(0); + }, + + getFocusElement : function() { + var inst = this.instance, doc, rng, sel, elm; + + if (tinyMCE.isRealIE) { + doc = inst.getDoc(); + rng = doc.selection.createRange(); + + // if (rng.collapse) + // rng.collapse(true); + + elm = rng.item ? rng.item(0) : rng.parentElement(); + } else { + if (!tinyMCE.isSafari && inst.isHidden()) + return inst.getBody(); + + sel = this.getSel(); + rng = this.getRng(); + + if (!sel || !rng) + return null; + + elm = rng.commonAncestorContainer; + //elm = (sel && sel.anchorNode) ? sel.anchorNode : null; + + // Handle selection a image or other control like element such as anchors + if (!rng.collapsed) { + // Is selection small + if (rng.startContainer == rng.endContainer) { + if (rng.startOffset - rng.endOffset < 2) { + if (rng.startContainer.hasChildNodes()) + elm = rng.startContainer.childNodes[rng.startOffset]; + } + } + } + + // Get the element parent of the node + elm = tinyMCE.getParentElement(elm); + + //if (tinyMCE.selectedElement != null && tinyMCE.selectedElement.nodeName.toLowerCase() == "img") + // elm = tinyMCE.selectedElement; + } + + return elm; + } + + }; + +/* file:jscripts/tiny_mce/classes/TinyMCE_UndoRedo.class.js */ + +function TinyMCE_UndoRedo(inst) { + this.instance = inst; + this.undoLevels = new Array(); + this.undoIndex = 0; + this.typingUndoIndex = -1; + this.undoRedo = true; +}; + +TinyMCE_UndoRedo.prototype = { + add : function(l) { + var b, customUndoLevels, newHTML, inst = this.instance, i, ul, ur; + + if (l) { + this.undoLevels[this.undoLevels.length] = l; + return true; + } + + if (this.typingUndoIndex != -1) { + this.undoIndex = this.typingUndoIndex; + + if (tinyMCE.typingUndoIndex != -1) + tinyMCE.undoIndex = tinyMCE.typingUndoIndex; + } + + newHTML = tinyMCE.trim(inst.getBody().innerHTML); + if (this.undoLevels[this.undoIndex] && newHTML != this.undoLevels[this.undoIndex].content) { + //tinyMCE.debug(newHTML, this.undoLevels[this.undoIndex].content); + + tinyMCE.dispatchCallback(inst, 'onchange_callback', 'onChange', inst); + + // Time to compress + customUndoLevels = tinyMCE.settings['custom_undo_redo_levels']; + if (customUndoLevels != -1 && this.undoLevels.length > customUndoLevels) { + for (i=0; i 0) { + this.undoIndex--; + + tinyMCE.setInnerHTML(inst.getBody(), this.undoLevels[this.undoIndex].content); + inst.repaint(); + + if (inst.settings.custom_undo_redo_restore_selection) + inst.selection.moveToBookmark(this.undoLevels[this.undoIndex].bookmark); + } + }, + + redo : function() { + var inst = this.instance; + + tinyMCE.execCommand("mceEndTyping"); + + if (this.undoIndex < (this.undoLevels.length-1)) { + this.undoIndex++; + + tinyMCE.setInnerHTML(inst.getBody(), this.undoLevels[this.undoIndex].content); + inst.repaint(); + + if (inst.settings.custom_undo_redo_restore_selection) + inst.selection.moveToBookmark(this.undoLevels[this.undoIndex].bookmark); + } + + tinyMCE.triggerNodeChange(); + } + + }; + +/* file:jscripts/tiny_mce/classes/TinyMCE_ForceParagraphs.class.js */ + +var TinyMCE_ForceParagraphs = { + _insertPara : function(inst, e) { + var doc = inst.getDoc(), sel = inst.getSel(), body = inst.getBody(), win = inst.contentWindow, rng = sel.getRangeAt(0); + var rootElm = doc.documentElement, blockName = "P", startNode, endNode, startBlock, endBlock; + var rngBefore, rngAfter, direct, startNode, startOffset, endNode, endOffset, b = tinyMCE.isOpera ? inst.selection.getBookmark() : null; + var paraBefore, paraAfter, startChop, endChop, contents; + + function isEmpty(para) { + function isEmptyHTML(html) { + return html.replace(new RegExp('[ \t\r\n]+', 'g'), '').toLowerCase() == ""; + } + + // Check for images + if (para.getElementsByTagName("img").length > 0) + return false; + + // Check for tables + if (para.getElementsByTagName("table").length > 0) + return false; + + // Check for HRs + if (para.getElementsByTagName("hr").length > 0) + return false; + + // Check all textnodes + var nodes = tinyMCE.getNodeTree(para, new Array(), 3); + for (var i=0; i <" + blockName + "> "; + paraAfter = body.childNodes[1]; + } + + inst.selection.moveToBookmark(b); + inst.selection.selectNode(paraAfter, true, true); + + return true; + } + + // Place first part within new paragraph + if (startChop.nodeName == blockName) + rngBefore.setStart(startChop, 0); + else + rngBefore.setStartBefore(startChop); + + rngBefore.setEnd(startNode, startOffset); + paraBefore.appendChild(rngBefore.cloneContents()); + + // Place secound part within new paragraph + rngAfter.setEndAfter(endChop); + rngAfter.setStart(endNode, endOffset); + contents = rngAfter.cloneContents(); + + if (contents.firstChild && contents.firstChild.nodeName == blockName) { + /* var nodes = contents.firstChild.childNodes; + for (var i=0; i= r.startOffset && nv.charAt(r.startOffset - 1) == ' ') + s = true;*/ + + // Only remove BRs if we are at the end of line #bug 1464152 + if (nv != null && r.startOffset == nv.length) + sn.nextSibling.parentNode.removeChild(sn.nextSibling); + } + + if (inst.settings.auto_resize) + inst.resizeToContent(); + + return s; + } + + }; + +/* file:jscripts/tiny_mce/classes/TinyMCE_Layer.class.js */ + +function TinyMCE_Layer(id, bm) { + this.id = id; + this.blockerElement = null; + this.events = false; + this.element = null; + this.blockMode = typeof(bm) != 'undefined' ? bm : true; + this.doc = document; +}; + +TinyMCE_Layer.prototype = { + moveRelativeTo : function(re, p) { + var rep = this.getAbsPosition(re); + var w = parseInt(re.offsetWidth); + var h = parseInt(re.offsetHeight); + var e = this.getElement(); + var ew = parseInt(e.offsetWidth); + var eh = parseInt(e.offsetHeight); + var x, y; + + switch (p) { + case "tl": + x = rep.absLeft; + y = rep.absTop; + break; + + case "tr": + x = rep.absLeft + w; + y = rep.absTop; + break; + + case "bl": + x = rep.absLeft; + y = rep.absTop + h; + break; + + case "br": + x = rep.absLeft + w; + y = rep.absTop + h; + break; + + case "cc": + x = rep.absLeft + (w / 2) - (ew / 2); + y = rep.absTop + (h / 2) - (eh / 2); + break; + } + + this.moveTo(x, y); + }, + + moveBy : function(x, y) { + var e = this.getElement(); + this.moveTo(parseInt(e.style.left) + x, parseInt(e.style.top) + y); + }, + + moveTo : function(x, y) { + var e = this.getElement(); + + e.style.left = x + "px"; + e.style.top = y + "px"; + + this.updateBlocker(); + }, + + resizeBy : function(w, h) { + var e = this.getElement(); + this.resizeTo(parseInt(e.style.width) + w, parseInt(e.style.height) + h); + }, + + resizeTo : function(w, h) { + var e = this.getElement(); + + if (w != null) + e.style.width = w + "px"; + + if (h != null) + e.style.height = h + "px"; + + this.updateBlocker(); + }, + + show : function() { + this.getElement().style.display = 'block'; + this.updateBlocker(); + }, + + hide : function() { + this.getElement().style.display = 'none'; + this.updateBlocker(); + }, + + isVisible : function() { + return this.getElement().style.display == 'block'; + }, + + getElement : function() { + if (!this.element) + this.element = this.doc.getElementById(this.id); + + return this.element; + }, + + setBlockMode : function(s) { + this.blockMode = s; + }, + + updateBlocker : function() { + var e, b, x, y, w, h; + + b = this.getBlocker(); + if (b) { + if (this.blockMode) { + e = this.getElement(); + x = this.parseInt(e.style.left); + y = this.parseInt(e.style.top); + w = this.parseInt(e.offsetWidth); + h = this.parseInt(e.offsetHeight); + + b.style.left = x + 'px'; + b.style.top = y + 'px'; + b.style.width = w + 'px'; + b.style.height = h + 'px'; + b.style.display = e.style.display; + } else + b.style.display = 'none'; + } + }, + + getBlocker : function() { + var d, b; + + if (!this.blockerElement && this.blockMode) { + d = this.doc; + b = d.getElementById(this.id + "_blocker"); + + if (!b) { + b = d.createElement("iframe"); + + b.setAttribute('id', this.id + "_blocker"); + b.style.cssText = 'display: none; position: absolute; left: 0; top: 0'; + b.src = 'javascript:false;'; + b.frameBorder = '0'; + b.scrolling = 'no'; + + d.body.appendChild(b); + } + + this.blockerElement = b; + } + + return this.blockerElement; + }, + + getAbsPosition : function(n) { + var p = {absLeft : 0, absTop : 0}; + + while (n) { + p.absLeft += n.offsetLeft; + p.absTop += n.offsetTop; + n = n.offsetParent; + } + + return p; + }, + + create : function(n, c, p, h) { + var d = this.doc, e = d.createElement(n); + + e.setAttribute('id', this.id); + + if (c) + e.className = c; + + if (!p) + p = d.body; + + if (h) + e.innerHTML = h; + + p.appendChild(e); + + return this.element = e; + }, + + exists : function() { + return this.doc.getElementById(this.id) != null; + }, + + parseInt : function(s) { + if (s == null || s == '') + return 0; + + return parseInt(s); + } + + }; + +/* file:jscripts/tiny_mce/classes/TinyMCE_Menu.class.js */ + +function TinyMCE_Menu() { + var id; + + if (typeof(tinyMCE.menuCounter) == "undefined") + tinyMCE.menuCounter = 0; + + id = "mc_menu_" + tinyMCE.menuCounter++; + + TinyMCE_Layer.call(this, id, true); + + this.id = id; + this.items = new Array(); + this.needsUpdate = true; +}; + +TinyMCE_Menu.prototype = tinyMCE.extend(TinyMCE_Layer.prototype, { + init : function(s) { + var n; + + // Default params + this.settings = { + separator_class : 'mceMenuSeparator', + title_class : 'mceMenuTitle', + disabled_class : 'mceMenuDisabled', + menu_class : 'mceMenu', + drop_menu : true + }; + + for (n in s) + this.settings[n] = s[n]; + + this.create('div', this.settings.menu_class); + }, + + clear : function() { + this.items = new Array(); + }, + + addTitle : function(t) { + this.add({type : 'title', text : t}); + }, + + addDisabled : function(t) { + this.add({type : 'disabled', text : t}); + }, + + addSeparator : function() { + this.add({type : 'separator'}); + }, + + addItem : function(t, js) { + this.add({text : t, js : js}); + }, + + add : function(mi) { + this.items[this.items.length] = mi; + this.needsUpdate = true; + }, + + update : function() { + var e = this.getElement(), h = '', i, t, m = this.items, s = this.settings; + + if (this.settings.drop_menu) + h += ''; + + h += ''; + + for (i=0; i'; + } + + h += '
    '; + break; + + case 'title': + h += '
    ' + t + ''; + break; + + case 'disabled': + h += '
    ' + t + ''; + break; + + default: + h += '
    ' + t + ''; + } + + h += '
    '; + + e.innerHTML = h; + + this.needsUpdate = false; + this.updateBlocker(); + }, + + show : function() { + var nl, i; + + if (tinyMCE.lastMenu == this) + return; + + if (this.needsUpdate) + this.update(); + + if (tinyMCE.lastMenu && tinyMCE.lastMenu != this) + tinyMCE.lastMenu.hide(); + + TinyMCE_Layer.prototype.show.call(this); + + if (!tinyMCE.isOpera) { + // Accessibility stuff +/* nl = this.getElement().getElementsByTagName("a"); + if (nl.length > 0) + nl[0].focus();*/ + } + + tinyMCE.lastMenu = this; + } + + }); + +/* file:jscripts/tiny_mce/classes/TinyMCE_Compatibility.class.js */ + +if (!Function.prototype.call) { + Function.prototype.call = function() { + var a = arguments, s = a[0], i, as = '', r, o; + + for (i=1; i 1 ? ',' : '') + 'a[' + i + ']'; + + o = s._fu; + s._fu = this; + r = eval('s._fu(' + as + ')'); + s._fu = o; + + return r; + }; +}; + +/* file:jscripts/tiny_mce/classes/TinyMCE_Debug.class.js */ + +TinyMCE_Engine.prototype.debug = function() { + var m = "", a, i, l = tinyMCE.log.length; + + for (i=0, a = this.debug.arguments; i'; + h += ''; + + return h; +} + +function pickColor(e, target_form_element) { + if ((e.keyCode == 32 || e.keyCode == 13) || e.type == "mousedown") + tinyMCEPopup.pickColor(e, target_form_element); +} + +function updateColor(img_id, form_element_id) { + document.getElementById(img_id).style.backgroundColor = document.forms[0].elements[form_element_id].value; +} + +function setBrowserDisabled(id, state) { + var img = document.getElementById(id); + var lnk = document.getElementById(id + "_link"); + + if (lnk) { + if (state) { + lnk.setAttribute("realhref", lnk.getAttribute("href")); + lnk.removeAttribute("href"); + tinyMCE.switchClass(img, 'mceButtonDisabled', true); + } else { + lnk.setAttribute("href", lnk.getAttribute("realhref")); + tinyMCE.switchClass(img, 'mceButtonNormal', false); + } + } +} + +function getBrowserHTML(id, target_form_element, type, prefix) { + var option = prefix + "_" + type + "_browser_callback"; + var cb = tinyMCE.getParam(option, tinyMCE.getParam("file_browser_callback")); + if (cb == null) + return ""; + + var html = ""; + + html += ''; + html += ''; + + return html; +} + +function openBrower(img_id, target_form_element, type, option) { + var img = document.getElementById(img_id); + + if (img.className != "mceButtonDisabled") + tinyMCEPopup.openBrowser(target_form_element, type, option); +} + +function selectByValue(form_obj, field_name, value, add_custom, ignore_case) { + if (!form_obj || !form_obj.elements[field_name]) + return; + + var sel = form_obj.elements[field_name]; + + var found = false; + for (var i=0; i x && mx < x + w && my > y && my < y + h)) { + MCLayer.visibleLayer = null; + + if (l.autoHideCallback && l.autoHideCallback(l, e, mx, my)) + return true; + + l.hide(); + } + } + }, + + addCSSClass : function(e, c) { + this.removeCSSClass(e, c); + var a = this.explode(' ', e.className); + a[a.length] = c; + e.className = a.join(' '); + }, + + removeCSSClass : function(e, c) { + var a = this.explode(' ', e.className), i; + + for (i=0; i parseInt(v)) + st = this.mark(f, n); + } + } + + return st; + }, + + hasClass : function(n, c, d) { + return new RegExp('\\b' + c + (d ? '[0-9]+' : '') + '\\b', 'g').test(n.className); + }, + + getNum : function(n, c) { + c = n.className.match(new RegExp('\\b' + c + '([0-9]+)\\b', 'g'))[0]; + c = c.replace(/[^0-9]/g, ''); + + return c; + }, + + addClass : function(n, c, b) { + var o = this.removeClass(n, c); + n.className = b ? c + (o != '' ? (' ' + o) : '') : (o != '' ? (o + ' ') : '') + c; + }, + + removeClass : function(n, c) { + c = n.className.replace(new RegExp("(^|\\s+)" + c + "(\\s+|$)"), ' '); + return n.className = c != ' ' ? c : ''; + }, + + tags : function(f, s) { + return f.getElementsByTagName(s); + }, + + mark : function(f, n) { + var s = this.settings; + + this.addClass(n, s.invalid_cls); + this.markLabels(f, n, s.invalid_cls); + + return false; + }, + + markLabels : function(f, n, ic) { + var nl, i; + + nl = this.tags(f, "label"); + for (i=0; i "ar", + "Danish" => "da", + "Dutch" => "nl", + "English" => "en", + "Farsi" => "fa", + "French" => "fr", + "German" => "de", + "Greek" => "el", + "Hebrew" => " ", + "Hungarian" => "hu", + "Italian" => "it", + "Japanese" => "ja", + "Korean" => "ko", + "Norwegian" => "nb", + "Polish" => "pl", + "Russian" => "ru", + "Slovak" => "sk", + "Spanish" => "es", + "Swedish" => "sv" +); + +if(!$tinylang[$lang]){ + $tinylang[$lang] = "en"; +} + +$thescript = (strpos($_SERVER['SERVER_SOFTWARE'],"mod_gzip")) ? "tiny_mce_gzip.php" : "tiny_mce.js"; + +$text = "\n"; + +$text .= "\n +"; + +return $text; + +} + + +?> diff --git a/e107_handlers/traffic_class.php b/e107_handlers/traffic_class.php new file mode 100644 index 000000000..7d82a49f0 --- /dev/null +++ b/e107_handlers/traffic_class.php @@ -0,0 +1,208 @@ +Bump('foo',$b,$e); + // ~15 usec err: $eTraffic->Bump('foo',$b,microtime()); + // ~25 usec err: $eTraffic->Bump('foo',$b); + + if (!defined("E107_DBG_TRAFFIC") || !E107_DBG_TRAFFIC) { + return; + } + + if ($tStart) { + $vName = 'aTrafficTimed'; + $bTimed = TRUE; + } else { + $vName = 'aTraffic'; + $bTimed = FALSE; + } + if (!isset($this->{$vName}[$sWhat])) { + $this->{$vName}[$sWhat] = array(); + $t = & $this->{$vName}[$sWhat]; + $t['Count'] = 0; + if ($bTimed) { + $t['Time'] = 0.0; + $t['Min'] = 999999999.0; + $t['Max'] = 0.0; + } + } + + $this->{$vName}[$sWhat]['Count']++; + + if ($bTimed) { + $t = & $this->aTrafficTimed[$sWhat]; + if (!$tFinish) { + $tFinish = $x; + $offset = $this->calPassOne; + } else { + $offset = $this->calPassBoth; + } + $time = $this->TimeDelta($tStart, $tFinish ) - $offset; + $this->calTime += $offset; + $t['Time'] += $time; + if ($time < $t['Min']) $t['Min'] = $time; + if ($time > $t['Max']) $t['Max'] = $time; + } + } + + /** + * @return void + * @param string $sWhat what to count + * @param int $level who to record: default caller. 1-999=N levels up the call tree + * @param time $tStart Start time - unexploded microtime result + * @param time $tStop Finish time - unexploded microtime result + * @desc Count one of anything, optionally with time used. + * @access public + */ + function BumpWho($sWhat, $level = 0, $tStart = 0, $tFinish = 0) { + $x = microtime(); + if (!defined("E107_DBG_TRAFFIC") || !E107_DBG_TRAFFIC) { + return; + } + + $this->Bump($sWhat, $tStart, ($tFinish? $tFinish : $x)); + + if (!isset($this->aTrafficWho[$sWhat])) { + $this->aTrafficWho[$sWhat] = array(); + } + $aTrace = debug_backtrace(); + if ($level >= count($aTrace)) { + $level = count($aTrace)-1; + } + $sFile = $aTrace[$level]['file']; + $sLine = $aTrace[$level]['line']; + + $this->aTrafficWho[$sWhat][] = "$sFile($sLine)"; + } + + function Calibrate($tObject, $count = 10 ) { + if (!defined("E107_DBG_TRAFFIC") || !E107_DBG_TRAFFIC) { + return; + } + if ($tObject != $this) { + message_handler("CRITICAL_ERROR", "Bad traffic object", __LINE__-2, __FILE__); + } + if ($count <= 0) return; // no calibration + + $this->calPassBoth = $this->calPassOne = 0.0; + + for ($i = 0; $i < $count; $i++) { + $b = microtime(); + $e = microtime(); + $tObject->Bump('TRAF_CAL1', $b, $e); // emulate the normal non-insider call + $b = microtime(); + $tObject->Bump('TRAF_CAL2', $b); + } + $t = $tObject->aTrafficTimed['TRAF_CAL1']; + $this->calPassBoth = $t['Time']/$t['Count']; + $t = $tObject->aTrafficTimed['TRAF_CAL2']; + $this->calPassOne = $t['Time']/$t['Count']; + } + + function Display() { + if (!defined("E107_DBG_TRAFFIC") || !E107_DBG_TRAFFIC) { + return ''; + } + + $text = ''; + @include_once(e_HANDLER.'traffic_class_display.php'); + return $text; + } +} + + +// +// This is a set of quick-n-simple tools to measure ONE bit of render time, +// without any need for debug to be working. You can copy to somewhere else if needed +// such as before this class has been loaded + +if (!isset($qTimeOn)) { + $qTimeOn=0; + $qTimeTotal=0; + function eQTimeOn() { + $GLOBALS['qTimeOn']=explode(' ',microtime()); + } + function eQTimeOff() { + $e=explode(' ',microtime()); + $diff=((float)$e[0] + (float)$e[1]) - ((float)$qTimeOn[0] + (float)$qTimeOn[1]); + $GLOBALS['qTimeTotal'] += $diff; + } + function eQTimeElapsed() { + // return elapsed time so far, as text in microseconds, or blank if zero + if ($GLOBALS['qTimeTotal']) { + return number_format($GLOBALS['qTimeTotal']*1000000.0,1); + } else { + return ''; + } + } + +} + +?> diff --git a/e107_handlers/traffic_class_display.php b/e107_handlers/traffic_class_display.php new file mode 100644 index 000000000..1ce990691 --- /dev/null +++ b/e107_handlers/traffic_class_display.php @@ -0,0 +1,121 @@ +aTraffic)) { // Simple counts + $text .= "\n\n"; + $text .= " + + + \n"; + foreach ($this->aTraffic as $key=>$aVals) { + $text .= " + + \n"; + + if (isset($this->aTrafficWho[$key])) { + $text .= " + \n"; + } + + } + $text .="
    ItemCount  
    ". + $key."". + $aVals['Count']."  
    Callers:"; + $bFirst=TRUE; + foreach ($this->aTrafficWho[$key] as $sWho) { + if ($bFirst ) { + $bFirst = FALSE; + } else { + $text .= "
    \n"; + } + $text .= $sWho; + } + $text .= "

    \n"; + } + // + // Fancy timed counts + // + if (count($this->aTrafficTimed)) { + $text .= "\n\n"; + $text .= " + + + + + \n"; + foreach ($this->aTrafficTimed as $key=>$aVals) { + if (substr($key,0,8)=='TRAF_CAL') continue; + $text .= " + + "; + if ($aVals['Count'] && isset($aVals['Time']) && $aVals['Time']) { + $sTot = number_format($aVals['Time']*1000.0,4); + $sAvg = number_format($aVals['Time']*1000000.0/$aVals['Count'],1); + $sMin = number_format($aVals['Min']*1000000.0,1); + $sMax = number_format($aVals['Max']*1000000.0,1); + } else { + $sTot = $sAvg = $sMin = $sMax = ''; + } + $text .= " + + + + \n"; + + if (isset($this->aTrafficWho[$key])) { + $text .= " + \n"; + } + + } + $cal1 = number_format($this->calPassOne*1000000.0,1); + $cal2 = number_format($this->calPassBoth*1000000.0,1); + $cTot = number_format($this->calTime*1000.0,4); + + $text .="\n"; + $text .="
    ItemCount Tot Time (ms) Avg Time (us) Min Time (us) Max Time (us) 
    ". + $key."". + $aVals['Count']." ". + $sTot." ". + $sAvg." ". + $sMin." ". + $sMax." 
    Callers:"; + $bFirst=TRUE; + foreach ($this->aTrafficWho[$key] as $sWho) { + if ($bFirst ) { + $bFirst = FALSE; + } else { + $text .= "
    \n"; + } + $text .= $sWho; + } + $text .= "
    + Note: These times have been decreased by the calibration offset:
    + $cal2 usec per call(start,stop); $cal1 usec per call(start). Total adjustment: $cTot msec.

    \n"; + } +?> \ No newline at end of file diff --git a/e107_handlers/upload_handler.php b/e107_handlers/upload_handler.php new file mode 100644 index 000000000..6818af62e --- /dev/null +++ b/e107_handlers/upload_handler.php @@ -0,0 +1,202 @@ +db_Insert("rbinary", "0, '".$tp -> toDB($file_name, true)."', '".$tp -> toDB($file_userfile['type'][$c], true)."', '$data' "); + $uploaded[$c]['name'] = "Binary ".mysql_insert_id()."/".$file_name; + $uploaded[$c]['type'] = $file_userfile['type'][$c]; + $uploaded[$c]['size'] = $file_userfile['size'][$c]; + } + } + return $uploaded; + } + /* + if (ini_get('open_basedir') != ''){ + require_once(e_HANDLER."message_handler.php"); + message_handler("MESSAGE", "'open_basedir' restriction is in effect, unable to move uploaded file, deleting ...", __LINE__, __FILE__); + return FALSE; + } + */ + + // echo "
    "; print_r($_FILES); echo "
    "; exit; + + $files = $_FILES['file_userfile']; + if (!is_array($files)) + { + return FALSE; + } + + $c = 0; + foreach($files['name'] as $key => $name) + { + + if ($files['size'][$key]) + { + $filesize[] = $files['size'][$key]; + $name = preg_replace("/[^a-z0-9._-]/", "", str_replace(" ", "_", str_replace("%20", "_", strtolower($name)))); + if ($avatar == "attachment") { + $name = time()."_".USERID."_".$fileinfo.$name; + } + + $destination_file = getcwd()."/".$uploaddir."/".$name; + if ($avatar == "unique" && file_exists($destination_file)) + { + $name = time()."_".$name; + $destination_file = getcwd()."/".$uploaddir."/".$name; + } + if (file_exists($destination_file) && !$overwrite) + { + require_once(e_HANDLER."message_handler.php"); + message_handler("MESSAGE", LANUPLOAD_10, __LINE__, __FILE__); // duplicate file + $f_message .= LANUPLOAD_10 . __LINE__ . __FILE__; + $dupe_found = TRUE; + } + else + { + $uploadfile = $files['tmp_name'][$key]; + $fileext1 = substr(strrchr($files['name'][$key], "."), 1); + $fileext2 = substr(strrchr($files['name'][$key], "."), 0); + if (!in_array($fileext1, $allowed_filetypes) && !in_array(strtolower($fileext1), $allowed_filetypes) && !in_array(strtolower($files['type'][$c]), $allowed_filetypes)) + { + if (!in_array($fileext2, $allowed_filetypes) && !in_array(strtolower($fileext2), $allowed_filetypes) && !in_array(strtolower($files['type'][$c]), $allowed_filetypes)) + { + require_once(e_HANDLER."message_handler.php"); + message_handler("MESSAGE", LANUPLOAD_1." ".$files['type'][$key]." ".LANUPLOAD_2.".", __LINE__, __FILE__); + $f_message .= LANUPLOAD_1." ".$files['type'][$key]." ".LANUPLOAD_2."." . __LINE__ . __FILE__; + return FALSE; + require_once(FOOTERF); + exit; + } + } + + $uploaded[$c]['name'] = $name; + $uploaded[$c]['type'] = $files['type'][$key]; + $uploaded[$c]['size'] = 0; + + $method = (OPEN_BASEDIR == FALSE ? "copy" : "move_uploaded_file"); + + if (@$method($uploadfile, $destination_file)) + { + @chmod($destination_file, 0644); + $_tmp = explode('.', $name); + $fext = array_pop($_tmp); + $fname = basename($name, '.'.$fext); + $tmp = pathinfo($name); + $rename = substr($fname, 0, 15).".".time().".".$fext; + if (@rename(e_FILE."public/avatars/".$name, e_FILE."public/avatars/".$rename)) + { + $uploaded[$c]['name'] = $rename; + } + + if ($method == "copy") + { + @unlink($uploadfile); + } + + if(!$dupe_found) + { // don't display 'success message' when duplicate file found. + require_once(e_HANDLER."message_handler.php"); + message_handler("MESSAGE", "".LANUPLOAD_3." '".$files['name'][$key]."'", __LINE__, __FILE__); + $f_message .= "".LANUPLOAD_3." '".$files['name'][$key]."'.
    "; + } + $uploaded[$c]['size'] = $files['size'][$key]; + + } + else + { + $uploaded[$c]['error'] = $files['error'][$key]; + switch ($files['error'][$key]) + { + case 0: + $error = LANUPLOAD_4." [".str_replace("../", "", $uploaddir)."]"; + break; + case 1: + $error = LANUPLOAD_5; + break; + case 2: + $error = LANUPLOAD_6; + break; + case 3: + $error = LANUPLOAD_7; + break; + case 4: + $error = LANUPLOAD_8; + break; + case 5: + $error = LANUPLOAD_9; + break; + } + require_once(e_HANDLER."message_handler.php"); + message_handler("MESSAGE", LANUPLOAD_11." '".$files['name'][$key]."'
    ".LANUPLOAD_12.": ".$error, __LINE__, __FILE__); + $f_message .= LANUPLOAD_11." '".$files['name'][$key]."'
    ".LANUPLOAD_12.": ".$error . __LINE__ . __FILE__; + + } + } + } + $c++; + } + define("F_MESSAGE", "
    ".$f_message); + + return $uploaded; +} +?> \ No newline at end of file diff --git a/e107_handlers/user_extended_class.php b/e107_handlers/user_extended_class.php new file mode 100755 index 000000000..874751336 --- /dev/null +++ b/e107_handlers/user_extended_class.php @@ -0,0 +1,488 @@ +typeArray = array( + 'text' => 1, + 'radio' => 2, + 'dropdown' => 3, + 'db field' => 4, + 'textarea' => 5, + 'integer' => 6, + 'date' => 7, + 'language' => 8 + ); + $this->user_extended_types = array( + 1 => UE_LAN_1, + 2 => UE_LAN_2, + 3 => UE_LAN_3, + 4 => UE_LAN_4, + 5 => UE_LAN_5, + 6 => UE_LAN_6, + 7 => UE_LAN_7, + 8 => UE_LAN_8 + ); + + //load array with field names from main user table, so we can disallow these + $this->reserved_names = array ( + 'id', 'name', 'loginname', 'customtitle', 'password', + 'sess', 'email', 'signature', 'image', 'timezone', 'hideemail', + 'join', 'lastvisit', 'currentvisit', 'lastpost', 'chats', + 'comments', 'forums', 'ip', 'ban', 'prefs', 'new', 'viewed', + 'visits', 'admin', 'login', 'class', 'perms', 'realm', 'pwchange', + 'xup' + ); + + } + + function user_extended_reserved($name) + { + return (in_array($name, $this->reserved_names)); + } + + function user_extended_get_categories($byID = TRUE) + { + global $sql; + if($sql->db_Select("user_extended_struct", "*", "user_extended_struct_type = 0 ORDER BY user_extended_struct_order ASC")) + { + + if($byID == TRUE) + { + while($row = $sql->db_Fetch()) + { + $ret[$row['user_extended_struct_id']][] = $row; + } + } + else + { + $ret = $sql->db_getList(); + } + } + return $ret; + } + + function user_extended_get_fields($cat = "") + { + global $sql; + $more = ($cat) ? " AND user_extended_struct_parent = ".intval($cat)." " : ""; + if($sql->db_Select("user_extended_struct", "*", "user_extended_struct_type > 0 {$more} ORDER BY user_extended_struct_order ASC")) + { + while($row = $sql->db_Fetch()) + { + $ret[$row['user_extended_struct_parent']][] = $row; + } + } + return $ret; + } + + function user_extended_get_fieldList() + { + global $sql; + $more = ($cat) ? " AND user_extended_struct_parent = ".intval($cat)." " : ""; + if($sql->db_Select("user_extended_struct", "*", "user_extended_struct_type > 0 {$more} ORDER BY user_extended_struct_order ASC")) + { + while($row = $sql->db_Fetch()) + { + $ret[$row['user_extended_struct_id']] = $row; + } + } + return $ret; + } + + function user_extended_type_text($type, $default) + { + global $tp; + switch ($type) + { + + case 6: + // integer, + $db_type = 'INT(11)'; + break; + + case 7: + // date, + $db_type = 'DATE NOT NULL'; + break; + + case 1: + case 2: + case 3: + case 4: + case 8: + //text, dropdown, radio, db_field, language + $db_type = 'VARCHAR(255)'; + break; + + case 5: + //textarea + $db_type = 'TEXT'; + break; + } + if($type != 4 && $default != '') + { + $default_text = " DEFAULT '".$tp -> toDB($default, true)."'"; + } + else + { + $default_text = ''; + } + return $db_type.$default_text; + } + + function user_extended_field_exist($name) + { + global $sql, $tp; + return $sql->db_Count('user_extended_struct','(*)', "WHERE user_extended_struct_name = '".$tp -> toDB($name, true)."'"); + } + + function user_extended_add($name, $text, $type, $parms, $values, $default, $required, $read, $write, $applicable, $order='', $parent) + { + global $sql, $tp; + if(is_array($name)) + { + extract($name); + } + if(!is_numeric($type)) + { + $type = $this->typeArray[$type]; + } + + if (!$this->user_extended_field_exist($name) && !$this->user_extended_reserved($name)) + { + $field_info = $this->user_extended_type_text($type, $default); + if($order === '') + { + if($sql->db_Select("user_extended_struct","MAX(user_extended_struct_order) as maxorder","1")) + { + $row = $sql->db_Fetch(); + if(is_numeric($row['maxorder'])) + { + $order = $row['maxorder']+1; + } + } + } + $sql->db_Select_gen("ALTER TABLE #user_extended ADD user_".$tp -> toDB($name, true)." ".$field_info); + $sql->db_Insert("user_extended_struct","0,'".$tp -> toDB($name, true)."','".$tp -> toDB($text, true)."','".intval($type)."','".$tp -> toDB($parms, true)."','".$tp -> toDB($values, true)."', '".$tp -> toDB($default, true)."', '".intval($read)."', '".intval($write)."', '".intval($required)."', '0', '".intval($applicable)."', '".intval($order)."', '".intval($parent)."'"); + if ($this->user_extended_field_exist($name)) + { + return TRUE; + } + } + return FALSE; + } + + function user_extended_modify($id, $name, $text, $type, $parms, $values, $default, $required, $read, $write, $applicable, $parent) + { + global $sql, $tp; + if ($this->user_extended_field_exist($name)) + { + $field_info = $this->user_extended_type_text($type, $default); + $sql->db_Select_gen("ALTER TABLE #user_extended MODIFY user_".$tp -> toDB($name, true)." ".$field_info); + $newfield_info = " + user_extended_struct_text = '".$tp -> toDB($text, true)."', + user_extended_struct_type = '".intval($type)."', + user_extended_struct_parms = '".$tp -> toDB($parms, true)."', + user_extended_struct_values = '".$tp -> toDB($values, true)."', + user_extended_struct_default = '".$tp -> toDB($default, true)."', + user_extended_struct_required = '".intval($required)."', + user_extended_struct_read = '".intval($read)."', + user_extended_struct_write = '".intval($write)."', + user_extended_struct_applicable = '".intval($applicable)."', + user_extended_struct_parent = '".intval($parent)."' + WHERE user_extended_struct_id = '".intval($id)."' + "; + return $sql->db_Update("user_extended_struct", $newfield_info); + } + } + + function user_extended_remove($id, $name) + { + global $sql, $tp; + if ($this->user_extended_field_exist($name)) + { + $sql->db_Select_gen("ALTER TABLE #user_extended DROP user_".$tp -> toDB($name, true)); + if(is_numeric($id)) + { + $sql->db_Delete("user_extended_struct", "user_extended_struct_id = '".intval($id)."' "); + } + else + { + $sql->db_Delete("user_extended_struct", "user_extended_struct_name = '".$tp -> toDB($id, true)."' "); + } + return !($this->user_extended_field_exist($name)); + } + } + + function user_extended_hide($struct, $curval) + { + $chk = ($curval) ? " checked='checked' " : ""; + $name = "hide[user_".$struct['user_extended_struct_name']."]"; + return " ".UE_LAN_HIDE; + } + + function user_extended_edit($struct, $curval) + { + global $cal, $tp; + $choices = explode(",",$struct['user_extended_struct_values']); + if(trim($curval) == "" && $struct['user_extended_struct_default'] != "") + { + $curval = $struct['user_extended_struct_default']; + } + foreach($choices as $k => $v) + { + $choices[$k] = str_replace("[E_COMMA]", ",", $choices[$k]); + } + $parms = explode("^,^",$struct['user_extended_struct_parms']); + $include = preg_replace("/\n/", " ", $tp->toText($parms[0])); + $regex = $tp->toText($parms[1]); + $regexfail = $tp->toText($parms[2]); + $fname = "ue[user_".$struct['user_extended_struct_name']."]"; + if(strpos($include, 'class') === FALSE) { + $include .= " class='tbox' "; + } + + switch($struct['user_extended_struct_type']) + { + case 1: //textbox + case 6: //integer + $ret = ""; + return $ret; + break; + + case 2: //radio + foreach($choices as $choice) + { + $choice = trim($choice); + $chk = ($curval == $choice)? " checked='checked' " : ""; + $ret .= " {$choice}"; + } + return $ret; + break; + + case 3: //dropdown + $ret = "\n"; + return $ret; + break; + + case 4: //db_field + global $sql; + $order = ($choices[3]) ? "ORDER BY ".$tp -> toDB($choices[3], true) : ""; + + if($sql->db_Select($tp -> toDB($choices[0], true), $tp -> toDB($choices[1], true).",".$tp -> toDB($choices[2], true), "1 $order")){ + $choiceList = $sql->db_getList('ALL',FALSE); + $ret = "\n"; + return $ret; + } else { + return ""; + } + break; + + case 5: //textarea + return ""; + break; + + case 7: //date + return $cal->make_input_field( + array( + 'ifFormat' => '%Y-%m-%d' + ), + array( + 'class' => 'tbox', + 'name' => $fname, + 'value' => $curval + ) + ); + break; + + case 8: // language + require_once(e_HANDLER."file_class.php"); + $fl = new e_file; + $lanlist = $fl->get_dirs(e_LANGUAGEDIR); + sort($lanlist); + $ret = "\n"; + break; + + } + + return $ret; + } + + function user_extended_getStruct($orderby="user_extended_struct_order") + { + if($ueStruct = getcachedvars('ue_struct')) + { + return $ueStruct; + } + global $sql, $tp; + $ret = array(); + $parms = ""; + if($orderby != "") + { + $parms = "1 ORDER BY ".$tp -> toDB($orderby, true); + } + if($sql->db_Select('user_extended_struct','*',$parms)) + { + while($row = $sql->db_Fetch()) + { + $ret['user_'.$row['user_extended_struct_name']] = $row; + } + } + cachevars('ue_struct',$ret); + return $ret; + } + + function parse_extended_xml($contents, $no_cache = FALSE) + { + if($no_cache == FALSE && $this->extended_xml) + { + return $this->extended_xml; + } + + require_once(e_HANDLER."xml_class.php"); + $xml = new CXml; + if("getfile" == $contents) + { + $contents = file_get_contents(e_FILE."cache/user_extended.xml"); + } + $xml->Set_XML_data($contents); + $data = $xml->obj_data->e107_extended_user_fields[0]; + $ret['version'] = $data->version; + unset($info); + foreach($data->item as $item) + { + $info = array( + "name" => $item->name, + "text" => "UE_LAN_".strtoupper($item->name), + "type" => $item->type[0], + "values" => $item->values[0], + "default" => $item->default[0], + "required" => $item->required[0], + "read" => $item->read[0], + "write" => $item->write[0], + "applicable" => $item->applicable[0], + "include_text" => $item->include_text[0], + "parms" => $item->include_text[0], + "regex" => $item->regex[0] + ); + if(is_array($item->default) && $item->default[0] == '') + { + $info['default'] = 0; + } + if($item->regex[0]) + { + $info['parms'] .= $item->include_text[0]."^,^".$item->regex[0]."^,^LAN_UE_FAIL_".strtoupper($item->name); + } + $ret[$item->name] = $info; + } + $this->extended_xml = $ret; + return $this->extended_xml; + } + + function convert_old_fields() + { + global $sql; + $preList = $this->parse_extended_xml('getfile'); + $flist = array('user_aim', 'user_birthday', 'user_homepage', 'user_icq', 'user_msn', 'user_location'); + foreach($flist as $f) + { + $f = substr($f, 5); + $preList[$f]['parms'] = addslashes($preList[$f]['parms']); + $this->user_extended_add($preList[$f]); + } + $sql->db_Select_gen("INSERT IGNORE INTO #user_extended (user_extended_id) SELECT user_id FROM #user "); + $qry = " + UPDATE #user_extended AS ue , #user as u SET + ue.user_aim = u.user_aim, + ue.user_birthday = u.user_birthday, + ue.user_homepage = u.user_homepage, + ue.user_icq = u.user_icq, + ue.user_msn = u.user_msn, + ue.user_location = u.user_location + WHERE ue.user_extended_id = u.user_id + "; + $sql->db_Select_gen($qry); + $dlist = implode(", DROP ", $flist); + $dlist = "DROP ".$dlist; + $qry = "ALTER TABLE #user ".$dlist; + $sql->db_Select_gen($qry); + } +} +?> diff --git a/e107_handlers/user_func.php b/e107_handlers/user_func.php new file mode 100644 index 000000000..d9daa0d93 --- /dev/null +++ b/e107_handlers/user_func.php @@ -0,0 +1,51 @@ +db_Select("user", "user_class, user_admin", "user_id=".intval($user_id))) + { + $row = $uc_sql->db_Fetch(); + $uc = $row['user_class']; + $uc .= ",".e_UC_MEMBER; + if($row['user_admin']) + { + $uc .= ",".e_UC_ADMIN; + } + return $uc; + } + else + { + return ""; + } + } +} +?> \ No newline at end of file diff --git a/e107_handlers/user_select_class.php b/e107_handlers/user_select_class.php new file mode 100644 index 000000000..ff08f61b4 --- /dev/null +++ b/e107_handlers/user_select_class.php @@ -0,0 +1,227 @@ + popup(); +} + +include_lan(e_LANGUAGEDIR.e_LANGUAGE."/lan_user_select.php"); + +class user_select { + + function user_list($class, $form_name) { + global $pref, $sql, $tp; + if($class === FALSE) { $class = e_UC_MEMBER;} + switch ($class) + { + case e_UC_ADMIN: + $where = "user_admin = 1"; + break; + + case e_UC_MEMBER: + $where = "1"; + break; + + case e_UC_NOBODY: + return ""; + break; + + default: + $where = "user_class REGEXP '(^|,)(".$tp -> toDB($class, true).")(,|$)'"; + break; + } + + $text = ""; + return $text; + } + + function class_list($class, $form_name) { + global $pref, $sql; + $text = " "; + } + else + { + $text .= " "; + } + $text .= "".US_LAN_4."..."; + } + + if ($class !== false) { + if (($class < e_UC_NOBODY && USERCLASS) || ADMINPERMS == '0') { + $text .= ' '.$this -> class_list($class, 'class'); + } + } + + return $text; + } + + function real_name($_id) { + global $sql; + $sql -> db_Select("user", "user_name", "user_id='".intval($_id)."' "); + if ($row = $sql -> db_Fetch()) { + return $row['user_name']; + } + } + + function popup() { + global $ns, $tp; + list($elementType, $elementID) = explode(".", e_QUERY); + if($elementType == 'textarea') + { + $job = " + curval = parent.opener.document.getElementById('{$elementID}').value; + lastchr = curval.substring(curval.length-1, curval.length); + if(lastchr != '\\n' && curval.length > 0) + { + curval = curval+'\\n'; + } + parent.opener.document.getElementById('{$elementID}').value = curval+d+'\\n';"; + } + else + { + if($elementID == "") + { + $elementID = $elementType; + } + $job = "parent.opener.document.getElementById('{$elementID}').value = d;"; + } + echo " + + "; + + $text = "
    + + + + +
    +
    +
    + "; + + if ($_POST['dosrch']) { + $userlist = $this -> findusers($_POST['srch']); + if($userlist == FALSE) + { + $fcount= 0; + } + else + { + $fcount = count($userlist); + } + $text .= "
    + + + + + + +
    {$fcount} ".US_LAN_5."
    + + +
    +
    + "; + } + + $ns -> tablerender(US_LAN_4, $text); + } + + function findusers($s) { + global $sql, $tp; + if ($sql->db_Select("user", "*", "user_name LIKE '%".$tp -> toDB($s)."%' ")) { + while ($row = $sql -> db_Fetch()) { + $ret[strtolower($row['user_name'])] = $row['user_name']; + } + ksort($ret); + } else { + $ret = FALSE; + } + return $ret; + } + +} + +?> \ No newline at end of file diff --git a/e107_handlers/userclass_class.php b/e107_handlers/userclass_class.php new file mode 100644 index 000000000..a2e40a3ed --- /dev/null +++ b/e107_handlers/userclass_class.php @@ -0,0 +1,323 @@ +\n"; + if (!$optlist || strpos($optlist, "public") !== FALSE) { + $s = ($curval == e_UC_PUBLIC) ? "selected='selected'" : ""; + $text .= "\n"; + } + + if (!$optlist || strpos($optlist, "guest") !== FALSE) { + $s = ($curval == e_UC_GUEST) ? "selected='selected'" : ""; + $text .= "\n"; + } + if (!$optlist || strpos($optlist, "nobody") !== FALSE) { + $s = ($curval == e_UC_NOBODY) ? "selected='selected'" : ""; + $text .= "\n"; + } + if (!$optlist || strpos($optlist, "member") !== FALSE) { + $s = ($curval == e_UC_MEMBER) ? "selected='selected'" : ""; + $text .= "\n"; + } + if ($mode != "off" || strpos($optlist, "admin") !== FALSE) + { + $s = ($curval == e_UC_ADMIN) ? "selected='selected'" : ""; + $text .= "\n"; + } + if ($mode != "off" || strpos($optlist, "main") !== FALSE) + { + $s = ($curval == e_UC_MAINADMIN) ? "selected='selected'" : ""; + $text .= "\n"; + } + if (!$optlist || strpos($optlist, "classes") !== FALSE) + { + $classList = get_userclass_list(); + foreach($classList as $row) + { + extract($row); + if (strpos($optlist, "matchclass") === FALSE || getperms("0") || check_class($userclass_id)) + { + $s = ($userclass_id == $curval) ? "selected='selected'" : ""; + $text .= "\n"; + } + } + } + if (($mode != "off" && $mode != "admin") || strpos($optlist, "readonly") !== FALSE) + { + $s = ($curval == e_UC_READONLY) ? "selected='selected'" : ""; + $text .= "\n"; + } + + if (strpos($optlist, "language") !== FALSE && $pref['multilanguage']) { + $text .= "\n"; + $tmpl = explode(",",e_LANLIST); + foreach($tmpl as $lang){ + $s = ($curval == $lang) ? " selected='selected'" : ""; + $text .= "\n"; + } + } + + + $text .= "\n"; + return $text; +} + +function r_userclass_radio($fieldname, $curval = '') +{ + $sql = new db; + ($curval == e_UC_PUBLIC) ? $c = " checked" : $c = ""; + $text = "".UC_LAN_0."
    "; + ($curval == e_UC_NOBODY) ? $c = " checked" : $c = ""; + $text .= "".UC_LAN_2."
    "; + ($curval == e_UC_GUEST) ? $c = " checked" : $c = ""; + $text .= "".UC_LAN_1."
    "; + ($curval == e_UC_MEMBER) ? $c = " checked" : $c = ""; + $text .= "".UC_LAN_3."
    "; + $classList = get_userclass_list(); + foreach($classList as $row) + { + extract($row); + ($row['userclass_id'] == $curval) ? $c = " checked" : $c = ""; + $text .= "{$row['userclass_name']}
    "; + } + return $text; +} + +function r_userclass_check($fieldname, $curval = '', $optlist = "") +{ + global $pref; + $sql = new db; + $curArray = explode(",", $curval); + $ret = ""; + $ret .= "
    "; + if (!$optlist || strpos($optlist, "public") !== FALSE) + { + $c = (in_array(e_UC_PUBLIC, $curArray)) ? " checked='checked' " : ""; + $ret .= "
    "; + } + + if (!$optlist || strpos($optlist, "guest") !== FALSE) + { + $c = (in_array(e_UC_GUEST, $curArray)) ? " checked='checked' " : ""; + $ret .= "
    "; + } + + if (!$optlist || strpos($optlist, "nobody") !== FALSE) + { + $c = (in_array(e_UC_NOBODY, $curArray)) ? " checked='checked' " : ""; + $ret .= "
    "; + } + + if (!$optlist || strpos($optlist, "member") !== FALSE) + { + $c = (in_array(e_UC_MEMBER, $curArray)) ? " checked='checked' " : ""; + $ret .= "
    "; + } + + if (!$optlist || strpos($optlist, "admin") !== FALSE) + { + $c = (in_array(e_UC_ADMIN, $curArray)) ? " checked='checked' " : ""; + $ret .= "
    "; + } + + if (!$optlist || strpos($optlist, "readonly") !== FALSE) + { + $c = (in_array(e_UC_READONLY, $curArray)) ? " checked='checked' " : ""; + $ret .= "
    "; + } + + if (!$optlist || strpos($optlist, "classes") !== FALSE) + { + $classList = get_userclass_list(); + foreach($classList as $row) + { + if (strpos($optlist, "matchclass") === FALSE || getperms("0") || check_class($row['userclass_id'])) { + $c = (in_array($row['userclass_id'], $curArray)) ? " checked='checked' " : ""; + $ret .= "
    "; + } + } + } + + if (strpos($optlist, "language") !== FALSE && $pref['multilanguage']) { + $ret .= "
    \n"; + $tmpl = explode(",",e_LANLIST); + foreach($tmpl as $lang){ + $c = (in_array($lang, $curArray)) ? " checked='checked' " : ""; + $ret .= "
    "; + } + } + + + + $ret .= "
    "; + return $ret; +} + +function get_userclass_list() +{ + global $sql; + if($classList = getcachedvars('uclass_list')) + { + return $classList; + } + else + { + $sql->db_Select('userclass_classes', "*", "ORDER BY userclass_name", "nowhere"); + $classList = $sql->db_getList(); + cachevars('uclass_list', $classList); + return $classList; + } +} + +function r_userclass_name($id) { + $sql = new db; + $class_names = getcachedvars('userclass_names'); + if(!is_array($class_names)) + { + $class_names[e_UC_PUBLIC] = UC_LAN_0; + $class_names[e_UC_GUEST] = UC_LAN_1; + $class_names[e_UC_NOBODY] = UC_LAN_2; + $class_names[e_UC_MEMBER] = UC_LAN_3; + $class_names[e_UC_READONLY] = UC_LAN_4; + $class_names[e_UC_ADMIN] = UC_LAN_5; + if ($sql->db_Select("userclass_classes", "userclass_id, userclass_name", "ORDER BY userclass_name", "nowhere")) + { + while($row = $sql->db_Fetch()) + { + $class_names[$row['userclass_id']] = $row['userclass_name']; + } + } + cachevars('userclass_names', $class_names); + } + return $class_names[$id]; +} + +class e_userclass { + function class_add($cid, $uinfoArray) + { + global $tp; + $sql2 = new db; + foreach($uinfoArray as $uid => $curclass) + { + if ($curclass) + { + $newarray = array_unique(array_merge(explode(',', $curclass), array($cid))); + $new_userclass = implode(',', $newarray); + } + else + { + $new_userclass = $cid; + } + $sql2->db_Update('user', "user_class='".$tp -> toDB($new_userclass, true)."' WHERE user_id=".intval($uid)); + } + } + + function class_remove($cid, $uinfoArray) + { + global $tp; + $sql2 = new db; + foreach($uinfoArray as $uid => $curclass) + { + $newarray = array_diff(explode(',', $curclass), array('', $cid)); + if (count($newarray) > 1) + { + $new_userclass = implode(',', $newarray); + } + else + { + $new_userclass = $newarray[0]; + } + $sql2->db_Update('user', "user_class='".$tp -> toDB($new_userclass, true)."' WHERE user_id=".intval($uid)); + } + } + + function class_create($ulist, $class_prefix = "NEW_CLASS_", $num = 0) + { + global $sql; + $varname = "uc_".$ulist; + if($ret = getcachedvars($varname)) + { + return $ret; + } + $ul = explode(",", $ulist); + array_walk($ul, array($this, 'munge')); + $qry = " + SELECT user_id, user_class from #user AS u + WHERE user_name = ".implode(" OR user_name = ", $ul); + if($sql->db_Select_gen($qry)) + { + while($row = $sql->db_Fetch()) + { + $idList[$row['user_id']] = $row['user_class']; + + } + while($sql->db_Count("userclass_classes","(*)","WHERE userclass_name = '".strtoupper($class_prefix.$num)."'")) + { + $num++; + } + $newname = strtoupper($class_prefix.$num); + $i = 1; + while ($sql->db_Select('userclass_classes', '*', "userclass_id='".intval($i)."' ") && $i < 255) + { + $i++; + } + if ($i < 255) + { + $sql->db_Insert("userclass_classes", "{$i}, '{$newname}', 'Auto_created_class', 254"); + $this->class_add($i, $idList); + cachevars($varname, $i); + return $i; + } + } + + } + + function munge(&$value, &$key) + { + $value = "'".trim($value)."'"; + } +} + +?> \ No newline at end of file diff --git a/e107_handlers/usersession_class.php b/e107_handlers/usersession_class.php new file mode 100644 index 000000000..1e270a1a4 --- /dev/null +++ b/e107_handlers/usersession_class.php @@ -0,0 +1,243 @@ +_SessionName = session_name(); + $this->_UserTrackingType = $pref['user_tracking']; + $this->_CookieName = $pref['cookie_name']; + + global $e107; + $e107->getip; + } + + function UserSessionStart() { + print_r($_POST); + + if ($_POST['username'] && $_POST['userpass']) { + if (ini_get('magic_quotes_gpc' != 1)) { + $_POST['username'] = addslashes($_POST['username']); + $_POST['userpass'] = addslashes($_POST['userpass']); + } + $_POST['autologin'] = intval($_POST['autologin']); + $this->LoginUser(USERLOGIN_TYPE_POST, $_POST['username'], $_POST['userpass'], false, $_POST['autologin']); + } elseif ($this->_UserTrackingType == 'session' && $_COOKIE[$this->$_SessionName]) { + } elseif ($this->_UserTrackingType == 'cookie' && isset($_COOKIE[$this->_CookieName])) { + $Cookie = explode('.', $_COOKIE[$this->_CookieName]); + if (count($Cookie) != 2) { + $this->_LoginResult = LOGINRESULT_INVALIDCOOKIE; + } elseif(preg_match('/^[A-Fa-f0-9]{32}$/', $Cookie[1]) && intval($Cookie[0]) > 0) { + $this->LoginUser(USERLOGIN_TYPE_COOKIE, false, $Cookie[1], $Cookie[0]); + } else { + $this->_LoginResult = LOGINRESULT_INVALIDCOOKIE; + } + } else { + $this->AnonUser(); + $this->_LoginResult = LOGINRESULT_NOTLOGGEDIN; + } + if ($this->_LoginResult != LOGINRESULT_OK) { + $this->AnonUser(); + } + $this->CompatabiltyMode(); + } + + function LoginUser($LoginType = false, $UserName = false, $UserPassword = false, $UserID = false, $AutoLogin = false) { + global $sql, $tp; + switch ($LoginType) { + case USERLOGIN_TYPE_COOKIE: + if (!$sql->db_Select('user', '*', "user_id = '".intval($UserID)."' AND md5(`user_password`) = '".$tp -> toDB($UserPassword)."'")){ + $this->_LoginResult = LOGINRESULT_INVALIDCOOKIE; + } else { + $row = $sql->db_Fetch(); + $this->ExtractDetails($row); + $this->IsUser = true; + $this->_LoginResult = LOGINRESULT_OK; + } + break; + case USERLOGIN_TYPE_SESSION: + echo "Session Handling Not Fully Implemented Yet!"; + break; + case USERLOGIN_TYPE_POST: + $UserPassword = md5($UserPassword); + if (!$sql->db_Select('user', '*', "user_name = '".$tp -> toDB($UserName)."' AND user_password = '".$tp -> toDB($UserPassword)."'", 'default', true)) { + $this->_LoginResult = LOGINRESULT_BADUSERPASS; + } else { + $row = $sql->db_Fetch(); + $this->IsUser = true; + $this->_LoginResult = LOGINRESULT_OK; + $this->ExtractDetails($row); + if ($AutoLogin == true) { + header('P3P: CP="IDC DSP COR CURa ADMa OUR IND PHY ONL COM STA"'); + setcookie($this->_CookieName, $row['user_id'].'.'.md5($UserPassword), (time() + 3600 * 24 * 30)); + $_COOKIE[$this->_CookieName] = $row['user_id'].'.'.md5($UserPassword); + } else { + header('P3P: CP="IDC DSP COR CURa ADMa OUR IND PHY ONL COM STA"'); + setcookie($this->_CookieName, $row['user_id'].'.'.$UserPassword); + $_COOKIE[$this->_CookieName] = $row['user_id'].'.'.md5($UserPassword); + } + if ($this->_UserTrackingType == 'session') { + session_start(); + } + } + break; + if ($this->_LoginResult == LOGINRESULT_INVALIDCOOKIE) { + header('P3P: CP="IDC DSP COR CURa ADMa OUR IND PHY ONL COM STA"'); + setcookie($pref['cookie_name'], '', (time()-2592000)); + unset($_COOKIE[$this->_CookieName]); + } + } + } + + function ExtractDetails($MySQL_Row) { + global $user_pref, $pref; + if ($MySQL_Row['user_ban'] == 1) { + exit(); + } + $this->UserDetails['Name'] = $MySQL_Row['user_name']; + $this->UserDetails['ID'] = $MySQL_Row['user_id']; + $this->UserDetails['Email'] = $MySQL_Row['user_email']; + $this->UserDetails['Class'] = $MySQL_Row['user_class']; + $this->UserDetails['Viewed'] = $MySQL_Row['user_viewed']; + $this->UserDetails['Image'] = $MySQL_Row['user_image']; + $this->UserTimes['PasswordChange'] = $MySQL_Row['user_pwchange']; + $this->UserTimes['LastVisit'] = $MySQL_Row['user_lastvisit']; + $this->UserTimes['CurrentVisit'] = $MySQL_Row['user_currentvisit']; + $this->UserTimes['Join'] = $MySQL_Row['user_join']; + $this->UserTimes['Lastpost'] = $MySQL_Row['user_lastpost']; + $this->UserPrefs = unserialize($MySQL_Row['user_prefs']); + $this->_UserSession = $MySQL_Row['user_sess']; + if ($MySQL_Row['user_admin'] == 1) { + $this->UserIsAdmin = true; + $this->_RawPermissions = $MySQL_Row['user_perms']; + $Perms = explode('.', $MySQL_Row['user_perms']); + $pTotal = count($Perms) - 1; + if ($Perms[$pTotal] == '') { + unset($Perms[$pTotal]); + } + if ($Perms[0] == '0') { + $this->SuperAdmin = true; + } else { + $this->_Permissions = $Perms; + } + } + if ($this->UserTimes['CurrentVisit'] + 3600 < time()) { + $this->UserTimes['LastVisit'] = $this->UserTimes['CurrentVisit']; + $this->UserTimes['CurrentVisit'] = time(); + $sql->db_Update('user', "user_visits = user_visits + 1, user_lastvisit = '{$this->UserTimes['LastVisit']}', user_currentvisit='{$this->UserTimes['CurrentVisit']}', user_viewed='' WHERE user_id='{$this->UserDetails['ID']}'"); + } + if (isset($_POST['settheme'])) { + $this->UserPrefs['sitetheme'] = ($pref['sitetheme'] == $_POST['sitetheme'] ? '' : $_POST['sitetheme']); + $user_pref = $this->UserPrefs; + save_prefs('user', $this->UserDetails['ID']); + } + $user_pref = $this->UserPrefs; + } + + function AnonUser() { + $this->UserDetails['Name'] = 'Anonymous'; + $this->UserDetails['ID'] = 0; + $this->UserDetails['Email'] = ''; + $this->UserTimes['LastVisit'] = time(); + $this->UserTimes['CurrentVisit'] = time(); + $this->UserTimes['Join'] = time(); + $this->UserTimes['Lastpost'] = time(); + $this->UserPrefs = array(); + $this->UserIsAdmin = false; + $this->SuperAdmin = false; + $this->_Permissions = array(); + } + + function CompatabiltyMode() { + if ($this->IsUser == true) { + define("USERID", $this->UserDetails['ID']); + define("USERNAME", $this->UserDetails['Name']); + define("USER", TRUE); + define("USERCLASS", $this->UserDetails['Class']); + define("USERVIEWED", $this->UserDetails['Viewed']); + define("USERIMAGE", $this->UserDetails['Image']); + define("USERSESS", $this->_UserSession); + + define("USERTHEME", ($this->UserPrefs['sitetheme'] && file_exists(e_THEME.$this->UserPrefs['sitetheme'].'/theme.php') ? $this->UserPrefs['sitetheme'] : false)); + + if ($this->UserIsAdmin == true) { + define("ADMIN", TRUE); + define("ADMINID", $this->UserDetails['ID']); + define("ADMINNAME", $this->UserDetails['Name']); + define("ADMINPERMS", $this->_RawPermissions); + define("ADMINEMAIL", $this->UserDetails['Email']); + define("ADMINPWCHANGE", $this->UserTimes['PasswordChange']); + } else { + define("ADMIN", FALSE); + } + } else { + define("USER", FALSE); + define("USERTHEME", FALSE); + define("ADMIN", FALSE); + define("GUEST", TRUE); + } + } +} + +?> \ No newline at end of file diff --git a/e107_handlers/xml_class.php b/e107_handlers/xml_class.php new file mode 100644 index 000000000..4a9b91c9d --- /dev/null +++ b/e107_handlers/xml_class.php @@ -0,0 +1,238 @@ + xmlFileContents = curl_exec($cu); + if (curl_error($cu)) + { + $this -> error = "Error: ".curl_errno($cu).", ".curl_error($cu); + return FALSE; + } + curl_close ($cu); + return $this -> xmlFileContents; + } + + if(ini_get("allow_url_fopen")) + { + if(!$remote = @fopen ($address, "r")) + { + $this -> error = "Unable to open remote XML file."; + return FALSE; + } + } + else + { + $tmp = parse_url($address); + if(!$remote = fsockopen ($tmp['host'], 80 ,$errno, $errstr, 10)) + { + $this -> error = "Unable to open remote XML file."; + return FALSE; + } + else + { + socket_set_timeout($remote, 10); + fputs($remote, "GET ".$headline_url." HTTP/1.0\r\n\r\n"); + } + } + + $this -> xmlFileContents = ""; + while (!feof($remote)) + { + $this -> xmlFileContents .= fgets ($remote, 4096); + } + fclose ($remote); + return $this -> xmlFileContents; + } + + + function parseXmlContents () + { + foreach($this -> xmlData as $key => $value) + { + unset($this -> xmlData[$key]); + } + foreach($this -> counterArray as $key => $value) + { + unset($this -> counterArray[$key]); + } + + if(!function_exists('xml_parser_create')) + { + $this->error = "XML library not available."; + return FALSE; + } + + if(!$this -> xmlFileContents) + { + $this->error = "No XML source specified"; + return FALSE; + } + + $this->parser = xml_parser_create(''); + xml_set_object($this->parser, $this); + xml_set_element_handler($this->parser, 'startElement', 'endElement'); + xml_set_character_data_handler( $this->parser, 'characterData' ); + + $array = explode("\n", $this -> xmlFileContents); + + foreach($array as $data) + { + + if(strlen($data == 4096)) + { + $this -> error = "The XML cannot be parsed as it is badly formed."; + return FALSE; + } + + if (!xml_parse($this->parser, $data)) + { + $this->error = sprintf('XML error: %s at line %d, column %d', xml_error_string(xml_get_error_code($this->parser)), xml_get_current_line_number($this->parser),xml_get_current_column_number($this->parser)); + return FALSE; + } + } + xml_parser_free( $this->parser ); + return $this -> xmlData; + } + + function startElement ($p, $element, &$attrs) + { + $this -> start_tag = $element; + $this -> current_tag = strtolower($element); + if(!array_key_exists($this -> current_tag, $this -> counterArray)) + { + $this -> counterArray[$this -> current_tag] = 0; + $this -> xmlData[$this -> current_tag][$this -> counterArray[$this -> current_tag]] = ""; + } + } + + function endElement ($p, $element) + { + if($this -> start_tag == $element) + { + $this -> counterArray[$this -> current_tag] ++; + } + } + + function characterData ($p, $data) + { + $data = trim ( chop ( $data )); + $data = preg_replace('/&(?!amp;)/', '&', $data); + if(!array_key_exists($this -> current_tag, $this -> xmlData)) + { + $this -> xmlData [$this -> current_tag] = array(); + } + if(array_key_exists($this -> counterArray[$this -> current_tag], $this -> xmlData [$this -> current_tag])) + { + $this -> xmlData [$this -> current_tag] [$this -> counterArray[$this -> current_tag]] .= $data; + } + else + { + $this -> xmlData [$this -> current_tag] [$this -> counterArray[$this -> current_tag]] = $data; + } + } +} + +//CXml class code found on php.net +class CXml +{ + var $xml_data; + var $obj_data; + var $pointer; + + function CXml() { } + + function Set_xml_data( &$xml_data ) + { + $this->index = 0; + $this->pointer[] = &$this->obj_data; + + //strip white space between tags + $this->xml_data = preg_replace("/>[[:space:]]+<", $xml_data); + $this->xml_parser = xml_parser_create( "UTF-8" ); + + xml_parser_set_option( $this->xml_parser, XML_OPTION_CASE_FOLDING, false ); + xml_set_object( $this->xml_parser, &$this ); + xml_set_element_handler( $this->xml_parser, "_startElement", "_endElement"); + xml_set_character_data_handler( $this->xml_parser, "_cData" ); + + xml_parse( $this->xml_parser, $this->xml_data, true ); + xml_parser_free( $this->xml_parser ); + } + + function _startElement( $parser, $tag, $attributeList ) + { + foreach( $attributeList as $name => $value ) + { + $value = $this->_cleanString( $value ); + $object->$name = $value; + } + //replaces the special characters with the underscore (_) in tag name + $tag = preg_replace("/[:\-\. ]/", "_", $tag); + eval( "\$this->pointer[\$this->index]->" . $tag . "[] = \$object;" ); + eval( "\$size = sizeof( \$this->pointer[\$this->index]->" . $tag . " );" ); + eval( "\$this->pointer[] = &\$this->pointer[\$this->index]->" . $tag . "[\$size-1];" ); + + $this->index++; + } + + function _endElement( $parser, $tag ) + { + array_pop( $this->pointer ); + $this->index--; + } + + function _cData( $parser, $data ) + { + if (empty($this->pointer[$this->index])) { + if (rtrim($data, "\n")) + $this->pointer[$this->index] = $data; + } else { + $this->pointer[$this->index] .= $data; + } + } + + function _cleanString( $string ) + { + return utf8_decode( trim( $string ) ); + } +} + +?> \ No newline at end of file diff --git a/e107_images/admin_images/adminlogs_16.png b/e107_images/admin_images/adminlogs_16.png new file mode 100644 index 0000000000000000000000000000000000000000..4737f57f5f6acc6997f344b8dee8c8c69ba455f9 GIT binary patch literal 992 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLldvRK#cK{+ ze|O@=%c?!iM@}AX?eD5=t9$?d|C$TOLXIbv&$`pRr?s%TqN2UFXGTxssZ!t0@Pp5v z%zn_?KDGV)_48MMUX3h_*>d{j%=NPjO8mZj`7(dcoyLo4r>~ywINvhmPR*0g|64ET zUwrs&<>BX7ZeEF=mT}|8jr{G!W$iUvE_|E3VamsU|F1uLdidkvw&@f4miDF2zH;#1 zlOI2S^zNQmb35bai+?-bZtFeJyYImMlTZJB{r2_zqt9yfVct8#w_Uk??fJLOZ`ZAQ zv8;3N;^wo3e$%&Ief|IHtN$;){6BW;*sXW}>vlCK^<~_+eY2vYcHxs5Z4b*2UVYQP zw=?`y>bmDQJe$KdoV}KOEBow=x7pjWTsH)+JaT{8g>P$5-R!$n)_1n|^y$+_pFgi% zUL7z$;qJTt-+ukCIk^4utN;E7qhoqgv(5&;diCnt_ix)Syy)Jvzw=`8jko_#zkGT5 z<^PYr|IgVl_s{?T2VXpkT^%!N+LW2|=9F!(KK%c%Uai%RTmMbF8f+SaTDrS${d`x| zS|^kk`0>a82cQ3@Zs|M!;{SxJ6`#I-+Ir^Ejh{EerUqSl_5bCU|C3JKsqU$syk=@; zQ|;~7zm`3o_W%F?@TKQmfr(&oNswPKkUPi$0~6PFMxb*gOI#yLg7ec#$`gxH85~pc zlTsBta}(23gHjVyDhp4h+5i=u^K@|x(U_PV(ZVKSz#?NEeaYvxvdZJw+?@xQj-9Eo zdSm!c@0#(H&xakD#DrB=v3}iLDk}D?^vRjkF-I0G$xB}$sURI;9J<=(T4tKa;VqjK zKJ#2%lOkVjC@Oh$XC6=Ym0i16Ej#{E%EDi$En@ZCsV~o+fBbT{!<9Bsod*|<}AstPSR^`DKPa;cIJ{y^VfNl_o|gcLR7`<^mEQDOTTRlX<(I^ zWO3utUhkvAK~H=X<_XU_e??zOHdpQHs>Y++8K!;9)$ZXqwG!wv22WQ%mvv4FO#sVu BdaVEe literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/adminlogs_32.png b/e107_images/admin_images/adminlogs_32.png new file mode 100644 index 0000000000000000000000000000000000000000..05f31c70df43c5d62de3a3b0098b86611446d69f GIT binary patch literal 1796 zcmd^9{X5eM0RMW))$UxmvqwB#M^2onsB<_kM@HF@hRSs&FC&D!Hc3=oM$x3ltdK{> z@>VS`sgXHjwlSD2Yi;3dDs9 z6(F`J3R9HaF}~Kv?<*QhADY?1$uJL#i|z>{^2zr}{o6nL+gH(U*bd zmKF4HdWNM+hdf8CXxC=xJF{H3hutFH0;uI@6)*C|lIo~bDsOG1ZSh?_qf;!NQf-4o z(cMf|bjk8{?E7TJvVt=Q@@1e&4e|m1R+n(+k>JM9_sqCcE5=Vem@{BGbzBeY^oluM zHkr@dcEwg7BoF z%88l>9g}tiB%Wk7vhjNIhv@u~WGkdgav!m<|5Kl$k2AGFo_Th!dz3r9p25f}X&WZC z4@K}1R|TgnaVMu&mao-_D|h0LM)lcr{aMEzK=(Uvl^^q;S8%0bmkRXp^Y*4h!}7`e zlZ2E_6wMzOCNd*>QhbL3wBgRU=) z4Dsi+i7akXn_whcaPuvvuV5@C;7v&XDzkk+@p|?RL6r7(zLmQ0!PwLMHlt0f630l8 z*>7GPxnHy&rj#rYb1|V2y+f z4LVI;sMooe!dhZfP{j>1^^Y0j&n6!ivl-826+!sCo7}=n^-Y9!fh*3PJq=<8-Sgj< zgCHmzcOn6R8jytY_T7#DX8^v+uS|A-LO;pvQj%|6c+!pF1PtI378ims^oR+Lz@RX} zVX5)`7zY4QzwH5c@v~)xZkz)wKe?*$g);rIQwGjm5Y2_fpeMG*u(xqbb^(4*iS2G^ zC)uKrfwS0oslY@Uj9SCHRL28C|sJoW& z^EtxBXH9>;*GrG49rw2?Rlno7bYnDjOEmwah{k4@zLK%BP(`K4bMTBbXXu6i`OAlm zbt}sBgJ=TGMme07h523*Hj%e+O^VZion3xh`X&w0Dd%;_n)E1?CiF4$LCI`}p^}{o zDt)ipk_~=<-YSZlO_O;iM3~yA9XWs-(9;9$kA-ZZoI)#i%g?l4SBL7Nos29j9OBSk z?6C|RrctKbH{?v#?THl9bV@CRs7n$;b+=Nnqa%mwP{ryRUstM!*5a*+#9D7FH7K^d zUEdR8hHg0yu{-WpFph@Bt84qLtt6acM4m{oR8F6AM;X3~*lhJP@vc-GjE%LEt9=WV zzP8|;h5RG`k&W<2p?oaoX7`z;kgwDa2UVNoRCjeJE^{Ifh!^JOk&)ro3R)HxPD=kM zVa(sLmPCXHqRSBn&!Pjh_D+cl0oZ|0ShIsAUlqqi4e}?jojvLvYJ_cZapVDw%$2R2 zoSa`zweaw|2kisP$W>L}Y5fBHl+o4Od$fWCvGbxFrf!-Zv(Ub(<|FE@X=w0FFyiSP z*mKz6cg?Y=XiS*%IO{@B9}>}f`Ukc1l{JY?wHNnmI%WK7ZLO^xvt73@SrhJpz_a9$ zIyy`ybN6Q-{%C4q!bZPW1a^p(5+0<>g6Pyhe` literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/adminpass_16.png b/e107_images/admin_images/adminpass_16.png new file mode 100644 index 0000000000000000000000000000000000000000..c0a40f200881a1f1ca86369515298ffd45906700 GIT binary patch literal 1285 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 literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/admins_32.png b/e107_images/admin_images/admins_32.png new file mode 100644 index 0000000000000000000000000000000000000000..ba5d6608b36fa6401d2dce75aa9f38fd18fd8dd5 GIT binary patch literal 1887 zcmd^9`8V770{vD-wLHw3cbuB(w8!X}Y5Uqf9W7>PD@cinrLh~6S{igHeMG(5o~0FQ zREtO2l6LG{YWa?sh%HF$C8V~XQA?Vj2(s|~Jn!$Ad(OT0+~4oLX-*C{n(AMvLlC5i zwYA0{y59eJ40Wj1CF#9~_E{j>9t}Zsu8C^82!c?M6V3&5fFSG-00>^^4S;K81bpnR z=7Z2MQf_WxbXwic&Q8+|QdLv=uv7*Pq(Y%^_wr@&E{I_w$?&K24&{)IqYPu^-vT}z zKL+;Z!224oHatc3B(;LBF1Az&#NBz%CqYsBC$QA?`{4e;Q~}sotpAVx*cfl**wL27 zeVz!UbOY%qWwAA+uzY54>0om>l~bRY)eoAUV7X>yeT}`N<&}ZKsm=XMIUOLr6V$Lo zZ%O~2dS)x!L?n_m7;gRz2D5MgSZW!_|6#E?18lzQdSxXWf2xp5X4U|)3A`Ku3VyDk zRc1ky<$qh(3<4An%2zK&$mEmx4P5!=j`ADl@pUBt^Cj$w{ef8|9^MbALR!a^W-f(I z(JAGrHe;nYWMjN+bU&58cQWQ71nE{Fo`}nQpj>wU3A@)lTCKe0kDjswKLIZet%Zt@DSTO~*`(k*NuBGgQPzC^q zBD4$0<+8vQz_0T*#>6g&khexZD5t4lwY_x?a7H9IvVm+Lyl?V$q9VWd?@cZt5_gXk z_%59-X(yjL>9$eU!Y`n8-hUzvr>srSZ`aO=g|$HowUPAv=#>LNDeQ3%ej#N=#@{|? zoT%*l2qyWHuy0sIGguPN%OrE$V#i8Tb2%?%_g&dGpPthtBP4uqdL#{Ff!gaBYFY%n znDUlgbI&y!*0w%0tT_is+DAh#d$I{4DxsyF%tJ2RXi zAfSz`f@NEqo9^jY|KfqFhy^z1*Kp=X*sn3KLev)ejkl26yW38-pz$X-`e)`0FUQ7Z zMMdYF3tlUFs^LsTmyp#Fr$D2gx}sfE48$PK3~R!u*JO*n7T#L_E>=&clE85zQe;WeRJJ zb}`NJmt}u8$L!;BC;N13ZNBig@MFf!QuRf{huvP+MH#DR=*YZ&p1^x3b4Q4m?s8mc zv<~;_el?c`eB7n;5!$FflQc8Fov@Qze8;fWd87~^8Fd!E8B8XXN@bFY!{MsitFXX3 zNIhKXQR+M^C`~+SSQ#B)au4hmx5ei@bE!TZ# ze2B4`Og@4^D;FywZsGCxTR01O2z#sVNRT>m+ilJDBBbJagBDvKu@(R06`OU|s8~&< zXzEW3d0DZ65_0b3ck z+vs^*apIoAQx)_a)>uQ=&rdOQAEIw2=)~@@^7^?!_X%d=0ktEeV$W)Ly`lnV4|}zpu39kKHZ~4jNAz#@ zTJuhic28t#Xd{hwg5Fpxs>+8*CCV8J^7~7uG(G#gMiTOP$=~B3&b; zqU>~$|3AJPbuRA`__SW4c-pL<^G#i35D?E>Mf?JmYyH) zy%V8(=!xrvzoQd~6YSLQ5sA6l6CMiHeujh6$oSgu%^SwZd&beH%aFFY>%|0*-m`~G OfUp<`>pDxHr2hdpQJEM3 literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/arrow_16.png b/e107_images/admin_images/arrow_16.png new file mode 100644 index 0000000000000000000000000000000000000000..064e5f4669eb1fa8606e59959f5f36b5ea430e01 GIT binary patch literal 743 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLlVs`JviCdpvxbY^j>+;?+FXN}a zC|mL>eBz6W$tP{P-@g6$Yu@$$QLPug{rorS_=kjGzD|B*)d6WdAOZr=Z3-tq3ytM5^rSCjj0#P;6FU+}c!)c?Gh59FJE z=oDTPsQvF=bFN_GHIb4};w5ht^6pDE|8HLXR;}^F!T0|!-2Kd0^ndw{FKS)CmFhp0 z&AwfK=)XzP#fDYSj2hn0-T5qd`ty|a|9}4eXHs|}s`fz6+?SP;PCb17_5c6>3M;*~ z0|Pq0B*-rq$fYA-_!m}o6==0&iEBhjaDG}zd16s2gJVj5QmTSyZen_BP->%3!? rHnH+|oo3{`YxzE16PR!r89wlP9SYqQ_SAS0(7_Czu6{1-oD!M<64|!o literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/arrow_32.png b/e107_images/admin_images/arrow_32.png new file mode 100644 index 0000000000000000000000000000000000000000..ed64335f033dea5aec91b1d12b2b9b968a9157a1 GIT binary patch literal 1677 zcmd^<`9IWo0LH&z8W|&&*o~Df)}~@s2dnI+h;fXY)JzdWn`0PP&XpsLr1eV9C|6jN zC1uDlatsE!jd6^d7zQIV%*T?#L#A+D&H(F zx}Syx32plj^DwY5fS|Wj9azFL1c^dc=5|K5**gLu__P2N9UC^k@=0a$iq{IuXMo>( zzDDfU30(8(SeENkhGsH2n<5yT<=uR?C}&MkF!`Vqx}%W<5JAB1K_7jV19PGu#B^&X z?I6tCY$9l~H)vSWa6#w1rr)^2m0UFv@Tdg15`k*y;`-K}ocH3)^7hQiu3^g8^FDoY zF7*0d7BUD73Bd9u|GO}7#j6EI1d0|F4zB^yqOoBPsF@XgZ{O^n*iL7%)ve1kJ=zez z<;ArDQL|3S2Z-Ndobnu0^q#or-sGCG$mQ`lT!DN9m|WO~;lGF&*FR_lVHEIt>p-&*ijBam?!2}|i#@SrQXja??T8~D+#MfM!D>@y8)GYjoaDILW` z_s|!3=23LG(?HVek@PxtToLnO$-LRa*%1y1$X^W0Wrn|*mJZr$Ujq5fEU&B~Z5PV< zyPbN39<>3E)Z&hqJmo!fu+AG4{=901R{LDav@ z#LBg+socUzV4BWzE7?T(4JA}E^aF?7BOBpnbu=ze@LfVcDh}z zTuTV`*@!|ObwH{nFUvb57fWFAiHVy`kty$-n@R@upNXB$cx{9^vpO$4E$_&Q%IH7h z5T#@{XN@v?P!W}}{nIIKHZ>>1^JKfYZAHOV5Iv!!3Y&(l)}=u+>boEeWSd1M_0Uaq;s_VI_eS#W1AeqZxznUz| zevgkSAv01eoqaM$s|;kMqWXFb;_2h=F-&kGVM00`B}>zH?GHOiTQ?P|)r_;;Y-D$9QkRieyxY5g6LW+n9k!D$KpvE69~HK zMq3O?^0uVWZg*#HlG_~GSzI>4U+X;l^xK7db&cItEv>8iv@AdRjnF*8u!&b3)pEXH z`@)?5^fM{MFT*w%eSI0sAst^gRFLvKO?%FM+a(UZO@UmmCVOKH8rV3tXxr|vexKGtAwk#NT7cNX?SzDWo7V~qDnauf_8PK=Nu9CANF?xp^Y$x JZ>~5;{|B&4{&N5T literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/arrow_over_16.png b/e107_images/admin_images/arrow_over_16.png new file mode 100644 index 0000000000000000000000000000000000000000..92dc165caf79f47f9a021e6e841b4f48d0e98dc2 GIT binary patch literal 706 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLlY^9!s71rHwzn zegB=LKg&Ypu(QJdsfAB&Kb##Iy<^U@<;^`uTot>b;%BGk%<^*TiHw==<@CSI<9}n= z{~ZhNUb^w~$Ir7SjPJvg&+a|8z}xY;pY;D*XCHfs|G#`>&*C+&p1fGsKl6WU%$c1B z7nsWS`Ug&kPhI9^{l7Wt#MXWPvn~4qf-m`LuI-ySBct%h#@%!Lz3yMVJtwc~rUUQ1 z_@tF4!mISTUIxhi|NmcO`x{PRXr`3}`2_>Hvk7QovbE?Yt{b}mFhc4dXs)}Dj=HH+5 zWYODw%O1xVlnO`ptH#wW|J=^RU48Peo7nGDuimlTZ_TMG3X7ANJwse-U(v}>xw@j6 z&-f3Os@?9qeQ=#3F4S(&gb~O@%O|kS{{umNFs`gZ7Z(4@653pW*(b&GwbRH=xT=g@(rrcvfts zhV;0a)nJD8Z=mkoOD-Z;k9~~YQqhR1iSUWG% zqro(9ajH%QK6FzBUb>*87L4`wYBHB8!4t*;A23h>5(W=~K}!{gbqSCceWeO-t#5uY zf#;GOUBNBWa5?VD&lBFV!W0?N z6kQdnl0>AwUIzxQOv(kTi;-F?@2cwV$iV$N?6)Q1T4i{=|MSGa==jihi6UHIP)=2m z3q=ZNc;1+wUhq;v+;=8Nqs0K-Ay-8pKu4RZfytDIhq?yV7^^`h=HMd(G=@M}?dlL3w^5(FDUKD~bC))G!_OaJ(VN@QXAtxpIo7A~AcQ zwQF+tYXOy>?M*ERy))X=4|*EuNWLiIxhRxCaa7_>MX6b{lXK=`yH2P*XT?~YMt{ru z6k|j1Ftqh|IMu}yyshw);VnWj2O{`^w_d6O+qZKf;I?I+Pf!vT3FgK@oLj7!IS4-= zV`iDIdNK^72tKvsD8L)58!7T^n`@hc?Y)ETJ@;f`P!JJkY@C6|md2!4D8X;k;N8vb z-L0Li^{rG#mjo+2u)Q9Q-~>Krr$#0=FUob+HFwoD9UL400H$v(IYAH%`CD7q9M}J| zAe%jQ#PLs@^f$8ixAAfJ4|KUnf$(G>SBfO@x{C+Jn&LvH`M#&%Ac%>RNWj}_b-C?Z zLaKd6_{NTgQd4QgG1{2|6fc*r{Ra*a)0v?MuTR@G$12(B_4sEt)pJo8oH&pq#35Fh za{uebFQ_JEuPrBc@j{(S(YNLckbR&K&3QQ zUps&(wz$uVR#0Z)7N6GiJfux2cL}jkO?7tEs&j|ZhJ$}flu!HQJa8$o!)G?JQAul0 zT)C|JlIQFAxaTTGNIW(Q8XsRAF(<}fo?Y^FHEvr?%!sHz8YZ_Q)N#QtT7;Bz6_I6f za}%#rnLbohrwi8b?v3t?7Kc?^7+kWno!Gg`nfYX35qVW?+1)o1E}PtP^bq&Rs+b-< zXx=Qxv}&I&Djalh*BAf3mgA5Rc{jIy>P$>MKHwhBqxON+FP9$=WS=f8H76jnlGY26|*%pN1e81_sP zgp@QRp`8AxviZ9RZ}^2nk&wS8W*TQANW7(wMJ032vZM0fsR%FCk~MBdO!?U@Cip~g zzM4_7A;0uVEYEj)bY)z<4q^nWJxA{<#Ma7hIVl@7QFg041sgo{4k74z78}MUTaEvC OIS|pvf>3GjXT-msxvA6u literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/articles_16.png b/e107_images/admin_images/articles_16.png new file mode 100644 index 0000000000000000000000000000000000000000..3a6694cb531cad225bff4d669764b951b49db703 GIT binary patch literal 887 zcmd6l`%jW_6vkg~T_~5cW@YJY&2+7r<`255B_=AZm;+s+wJG^}p_voWY^9l-rp#K1 zGpA`@5V0UNE)ExOV5xX}Q9%t87^opcns=MJZ}?yI+0J=(w&$0#=P8dNL^)&JF%Sef zd-)j2CXQ*?+gJ$dPy{+L%n)S9j=2?!Yw`0#=0F9jw#naLY6J=+ z7&3r?VPH0!X*DW_5PTZ~c_ob!J!t;=^Xs+Xt*x!l{L7zbHYB=@(mHDE z%5NC!WKt;AB$8py6xDiyCAKmWLaW*peA#z}%ECpo`fX5!yQ?s6pQE~2tyb21L*`qQ z*RQwyTAp118=Koj)H`D;9is~rdwL=W(z`l2ilR#8glPx#h(sUcps64Dyu##21K^Ah zlgX4@R8ckVw5;D{6KSr)_?X|=aPFN3@bnt>q?!_P1qCRY1 zW4yE5qB#B5)%57xKa|)tzIyWjhMu+>)j2gE?@l9kwF`?J*JHJqAqSj9lbCxx6l-5w zIk=iZ_WyftqgP@d_Wbkfo}_{^WcftUT9IF4(@mPUxx7z2K4mGymUtzm literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/articles_32.png b/e107_images/admin_images/articles_32.png new file mode 100644 index 0000000000000000000000000000000000000000..1b24c4de3c0860dbb9392a3a6254ea81e7fa3f7c GIT binary patch literal 1788 zcmd^9`#aNn0RE=vq$If|*DjKzP(q2!i0aH9mmzA2AxnKAnu=kGZ0^Stl-yg$G1^JX9srxoOP%0m#O;OqoFgX$7@!KfVR!=vY7lEuVhqWvX)q!A&wX zs{&ir3vwTn4)UbTZ+*X4R`EC-fy&!gF4NP~L!?T{YTG?5EN+E+zMufh%LT?>_Ya{G z(z@e2ey+ZbithL>jSmdG*SQ?b*5dQ|V(~IE_CABbC@n2@@!pca4CypA{VtGJKBWhD zZmfR?5YP7v&r3ZjrepGZiNwEcoi%cDa*96ns72N`cL9OXLGOfy!`YuJ+a^2uz@d^& z!bNdV`@U?(oV_QuZ4`VN80_PTMkc{;p-??oQ7o2DOia{ufLc0;Qc{Y21BQl%005i` zDeeXL18eYFH6VULV9C;ZigIK!nbFq2B9ZuBZ`M7ZH8wUjza$x-6a%7?kN%Y z@*4nu{~9U)c6PH1fYJzfJl^MVV4uMB$m_~CIX*fjxr$G=s!{*J=V@Fn{vr@OgTsSf z@h*@+WJc??QI%9Uys;lpX!NN$fX=bWW=Rt`TAZ0>_P52P`1G_w_AXyN?5Wc}@ubAp zPe)Uen3U4k-Yv)ef_yzo-t4@m7J*{p0wpMn~v0-6RQPBzGJIY%+tG^ETDl4xh6VQYreE!?( zy{=9Df{I&7ZJ$5|iF~ev`|JS~=Zi(v{koLVapMt_$Rb#z>8-9xb4ptaUJvUK*ftNj zP7&4A(GgS;`f5HZ@_uN1S@?KdT8o62SProhSvXz z?9`4M+F4UxIfZbqs;cVe0@i?ZfB3Et(u_^4?dvQgnS1xHhwKrWo&k$+Rz6|XW zFV=g zhV)-sX$|);&Zj=ob~0a@Jgtd?slpvG5%Mdqewq=5qMe>Pp8bsW_DQK(;5-b8mOQFo z>?+3Zwm3FDTyJvKXB$2b1#9ZTpl-c&DUsiy;A21W((9zC@99PZj>}8sL6Oxs9h@;# z)(^IpC7nQotmBrT0vvSL@9Fa4>0f03JwoNg>#1ybc!%%WcCU_ zKbqXt;FK;K>;BbM?vR^8i~gMM!I7Hz>Z+<0Qs9mChUOLpGL9MNiLk<==bXi}d`%aB zWtFgTp(nJwP01U!c`y2eN}y?2J_Rj^%zez&1kQo;El#y!Ti0O1hMbfvMhEW7$wBir z^uoi~EuN03U!d{T5oAVER-zh-EZ5DF1S@;R5!QMh9lh<7Hf4~Km-o+tN1bsOFjaw! zGp!ys^>%SfFhZF5_97YNSD6FiNcfp5uI*M?0E~qEyC#|9+dk`%8OU>cFUpofkk$|@ U5ij%Y*xF1XX9onl8g?o9U-)D`fB*mh literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/banlist_16.png b/e107_images/admin_images/banlist_16.png new file mode 100644 index 0000000000000000000000000000000000000000..697e4970d0661745ec8e4da5edbb1510d8c5ff85 GIT binary patch literal 1063 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLlpwt!;gF_G%%aQw$8-7#MDvnZ0Olf7#wX#mlSD*LT0D=yD^Y zM~R6?*RTJ%V#O^ZqxGv-ALi%3XKnrZ_3QTx47W{9uPj>hf`Q@f%a`{fBiF57eS?+t zjFHhPL&L2yGLJMg{{H>DiJkp31H+8i*iWB6)t8oj3krI>WXXR9h7TV;+_tb-vT)(D z;Nag~U00SYx#{3=eBHWdfq|<+Lua(M&TVU3v2fv!yu1S%8t>=Kc~)P)Uq$vyYZ@D81qCg$wOwUux?fD}3 zVoz@0o};5vSyc3lg=LSD(h+_A#gdYb7#N=0+wWFZe&FVI*2H8^bMp)ahI3k4(={}{ zA2?8%pT8;~;6qN%)Jc=xtyyy`C}>t+-?y7LABTh-Gcx+HX3cg6hEM+f`zB3#?&9)1 zFz`-dVnac}Dq-Qrw{E?8{raSc$V~=@H|6EqgoW?Ay3UJ ze%aM^dU*H}aq*+;);;$2zQw@sXWO=qk&)M~Ufrdpc74&J#X&)r7#VMxn=fEsxO?Z$ z^6KhcLPGBsE~YY0@|A75w;{;v+r+toKs5}F*B&+NGRTF9D&&M6k6W6-uubc7hk5xzt=$Dzg5o_h zt{;En8@u^IXq27k{E(et3q*99hZCV#3q)tY`W8Q!-)i zuQoB9`fRiLy}k6@Kc$R}7IptOo-md9SH;T0;a?L~BYDfCx^D|RP2a%cRj%?cOAykakJB;Yo)35B5@#oJot%Oa&DQ44$rjF6*2UngC4?M2`Rf literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/banlist_32.png b/e107_images/admin_images/banlist_32.png new file mode 100644 index 0000000000000000000000000000000000000000..2b861e6a1e61671e7db976ba625249ed89cfeae5 GIT binary patch literal 1869 zcmd^<`8ON*8pgj#IU&qQn;L^!imD~CWSWa9iXikN8cEGCJ+(!Xa%~l~mW;KQE}A=o zxwjgn#%Rl+sUnGr#!d`HwT-2=+INCzGVb4T-*evgIqxsePoL+>@%F-h1=oNB0KRf} zb0!|C?*CTd*wJ-8X0Yo zND(yJjGbM^xpO1-_M;&ow{2~QvDj5Sz8wO2Vs756tlZhz`4j?4K7anDfkC^O*|4VO zT4m*wKp?WS8&Xo*1R&1dehiDPL?HNF?n46uepAzGb#<+x;&fu-{{DU+7W?tS1r`jp z$>B8U=!^jHDJbYR9^b95KI`EzpOrP--o8R2edz9{YifQD3+qLp-a0!!iHqx%lVhP! zkD<_tii%ZF&v^xf_i*^Qx3@Gjlv`J~`1o-E9zO;E_sp3=q3{<&!{OG}TdJz#E-vL~ z&yI|YY`VMuo}Eqc^kiyj4PdcvIGoR}t~XJrhuYdhNaQ$?m_Vm@8yipXc!Guo9soHQ z%vxC)TTAOfTAJYW={`fl0Su;0TYD6Zo(7;4f%sr!a}|f95s551ouj4}86LivnAm1w zA_bsEO>NrMb<)9M1_Bu{F)2nOJ32Zf63Jfx92^|1udj>6;^o4^ma}I?BGFP|VSj)B z+}s@B$f&KYO@zaVMWP*nU^yvi=E{|E0zts#eo#=@?CV={ci*h76>+&Wc6M{8PPHj3 zb2K$4;^Ws?tN}f}9(((#=H@62hG%5Nu(p0{W+t++nSjH84G0imFbhH#k;KNn zv$R}gvuCoh=5uo9?%(G(Hr}zersDAvFj(cohszHhxJ*m(77(#uOG zlOY>yx&VNHSfZED(fj{Az())_bJP>+u`WNv`b37t#s|hwfMZBx5JlJhUxC*sL`q=D z&FC(QEdbCCcV|bE_1)k-0obPF+83giVUkxREg zk9%bOmWg*M7pBjub!@Cj>k2=qu^Q$fH%g$q^^Z!c{{FI)!jr#3-5{8VC`nrqsqA}&UB521dt>SsaLA}7EG+)z;?Uf+8z6o8HWjXC)2Q-Vq1YnO=@XpK zgqpJk(Vs7SJvuxfmjQ;yu0g)}?lE$>YFtcAlb-&bL3K#6dUozDn<_a@Ec25;AbTW7QECzNxBiGFlHJ)gHBa+Ak2gE>PY z86M!5Slg6{DQzO|H|fn(HuYd+m^esb^j&$eZS%wlZH z)xgs<>2i=~J;q5YV+2dK{Yp|2e%fv)urg3bF(=I$>+Z{d94bILUpl6K#656#@p7(q H3P}4KAb^OXMmGu+#zvt8A0Dxn-=UDCte0_a=V`IZ)fNeG#yK|66qqTHP<_ypcfnBT9a@cGZi^*cKAPB0dsbR91 znQUYcu@`y6(=U9DE-wXgDfh8GdUVuZ^>?e)`uFLy zvA<}ZB=+v+<|ZBgX(1m?VNB~`4S~7CknC%85Ga$k3Wo2u57?|qoFUWBA=l_fKnB0YOlqP=po8C{K{oy2A?5;$)$V zTn56B`r#~^*J_nWBw?ivEu?mqK0}tRI)8MIk`R~ZT>p;(2GfgVPDXD^L<%LbfJ7dFVYp$}S^`O?`fX*B-C(zNAc4dwHGu zJU=Knka+m0CvR$JZ^;9DHed2eHF&P&A1cz^|18(v9lI4*XPbMu+*BT@^}}ljBR*ka zcVaaQmUDh2)oV+jD%fwvN11x67d!SN>BKF5@JQEK4h{U%gU5d$S`Y-s^diyBChX;% z^S-k;`xa_1JM5(%#tH7*rpgvfLtPygpL+DUtD9HH#q6xCg^yCzZdL&3P-Z9U7|BfM PApu-OTzF6Dm8yRM-vT<# literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/banners_32.png b/e107_images/admin_images/banners_32.png new file mode 100644 index 0000000000000000000000000000000000000000..b81c8dd42621a6cf5ee0a4c7629d4a547f4435a4 GIT binary patch literal 1948 zcmd^9_fymP0?Zf5>FFUnB_QQ_+%czO8ARtm1fPTf0i_9{$deK6 z)2{3MpZoUgszn8HXx9`2&~|79qITE_N&JRD>_Ir%Vl11R>L2yVqNAfPxmcpSy_priOR;o{QP`zaj~X3eCR@o34SZ2cxNjc zs;a6YlgS;yP)JA!i^W=E&91Gj0hyT1W-l)TNCI-OoQ1vWM| z!pe4fy4#cJ;_%m;#2WF9ob4K4h+1BZF9#?k2uIoYw=K!@`5KKz>+4}8)1~n=X+c4O zZ@%zm?sg1ScO0j`hHvKTJ)FZ=3Wu!GGL zR(L@gmbuT~00&rbNf&|}#j2OHFS^A50K{VP_V%_!A`wd@@?8M1OPO50z?=p>_+C6D z5{s8%D7!-fo~aJpfgEAM?Ck8<#m_OX0I?H*7I)rv9()Zli{P)Xt|zqd{z`(}a{<`+ zw8mjK%!9BR?xm}qgnF3=Wxl5{V+IAa6hx zTLY?RfOP`@%hJNk%wKb}bH7}>JJ8<)cGlB-c)R6%xcllq2n2+Pa`MSZo9ifxZ>yi_@_Q#RlM1V}Zt8aPT9c++17) zLZP~qg7zJix-5cU?*#IM&ujzk-BW$wL&SZm^GsdVze|hkD3mj!MME{njRmY)liQGa?eK`ln%1iNUP`) zcfFI*wOFH{^Vq=PVdFs~qn4&3la?>B(F)eRi=#jI|IPpT#OC><-T}eJpIU4B>~0u0 z4t#21+o!^&)`Yu+8~?iLRrh|>&RF@xix`H)9{3i(LZZ|=_c&qs6!YR{+T7&h^78l& z@l!KYK4U8tdow_C)Mq{ z$<4`x)6MNV$a5-4XN}M^58g5J&nFYcN?5Eyt=XwclR+fSN6E1_oTO}$wh+k(O-RJy zmqSWB+OuQFG)b_78S?SjJ(TKd*KM=qSXz7|Y}>jI({t=c1D#Nh{{|(7EnlhYP}eO`=!+-gsI+Dl_&&vC-ZnbhxOHI+Zp zdn=xu{|XTf?&~;r2%+bGE0s-ERXt*G_K1zm6EfKlLVx>t(w78RvJDLlpQ;m_`59aK zc&TEeeQ39I<@!o>()Igk(s_QN!q{MyMxp7ieV&v3>$=4=jE#xu6pprL&6`srJ{M<4 zh%cKRz1+RnS+9Zv0|OJ{T9b!r{XXbNc>H$E-AW Vr*e)YcJIyzVPk1;K{xk-{|ELTpu+$F literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/blocked.png b/e107_images/admin_images/blocked.png new file mode 100644 index 0000000000000000000000000000000000000000..be6625a681fe45261b081ff634b4624c224ecf4b GIT binary patch literal 1235 zcmWktc}&v>6#hzqa-;|*ULanpK(e?5-PEWRPzWtYsel^EKuQf8sG*9c9uXZZOb7^w z;)PNzSBFkS<*4P94p}NcL}A5nlul7>ov5SghP?g!<9lDemzS3>-^=+5Zp}83f!aaGjPpu$p&392vsv=gynwxp;|#!UNz!8W9^p zL^hkPx4HRtetuwGd(>o0`-6vxB(Oa$2~nuQ&UF=2Rqd2Y(D=F zU;=mn`~{2xPk{lT7dXb}*O!zu6&GIyJ^(i0AK)$UH}D)71RethKo6V*G+9~Q8cms< z-Hg5c443uJ9jo>1%9Z5fL+VWy6U{CzS(&l5^*+!CbOSkj{Kva(0O7+?gh z0c|SP?Gq==iHRf>Qa}K0+{mn6-2qGjjR2*mlSoA2;S?4|p`pzB^?FCg89O^Ga3L-( zFEEgf9;KKV+P00hZ>Q*Jb3g#2R-5^Ja&#rlDJ6yW?xnOe%g&ulMTLdSz0002H`i)1RkO+D6bmWLmB$|5jM!$J8 z6BT6{9cAq8Cx(X3hKEn7)pY3+RaKEjqf1NE$Hh^0Hf3Zm@$tH?TS+3B_V<71>Ut(H zaImedP9~!V52&MqT3V>FQJ0*|D3w%EL07KO`SVm%#3Uu@A|pwu{Jekvhoq!xCnqDj z+-Rhp9_sF<&Q5A=C9Rg~>#4SuYHFymlCEB*(o#BiZl+|(%vRW+-4LZ3z&);98P-qeoH1YAfKdt$beGkroXh{qL$BoIXa8`(RqyvlEzkqW; zB{qf~5Q~F@V*TbgwEO=U!+}GalCxYTxYc`Ab?{s1zUa;yg=_6SmYSAqS{l2%(%`nv zZ`n1o;N+4s^{Oqk+Lya{A2KhwEB1H?i;CUH)b4Kt;?q4fJmqj}x?Cup%?f#FZrwG* z!zn>gx$uZ;KbVUty&W#ZF;$;)#E-N&;hc7^5U*5t5BLmVOr{%uoY=Kt_BRs8?} literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/cache_16.png b/e107_images/admin_images/cache_16.png new file mode 100644 index 0000000000000000000000000000000000000000..9783afd718272acad962b3cdd641c841823ff8d6 GIT binary patch literal 1140 zcmdUv`A^z+7{|XoG+R5nZdq1cw(Q8#xw!MFq>Lj;qB&10pJ5JA`nQP4gN48G9w~=l#p`%k#XSJOm`- z+o*kS?SmjF3Vu30JM0H{^wOSijXnA*Dr|d8Q?pVbh#^mmxbB3Y-6xTmXxR4lc5UtN zp-^aid}>k)Ha9o_qzbK8tHEF(5L#+#a067K`H6XDWuM z89)k@H4L(q;68;qH>>oE{sLjDo2r(VttSTJQfMD>CqZR%<-M)Ca#KK z=;qvn-_q2Jzyzcfm#g*j2Is1?pTz9!;!Vli{nY;4-XA#%Kpr5s(YmYqMrv)vN~Kbx z(T%A9R|RY~+uaf208Qxg`DPyaL|VX^1s02y!2=$TCkJ~*taP8QKupU#Mx#-q(K;MX zi^W2B_i_N9ISW`^z?}mjZwM_*CU2EJ*t|7Noe(el`{IRP0*2+95QP#lo1Zp2a_Dpp zWmNc04_dScs-GdNt4NdDpk_&@(-~L_u(V{#982(ey;7-^NN8cngJS|95>3^uX5fdr zI8u;AOt9JP!TZAS!W)jX zBEwfTh0R8wb^`d{0(CHT`0yk#SlBr%>QV`|s;~kBrCz*Lgn18MR#=M3#uQ$xDOX^U z!%YErdMY{=Rcs_iMhDiKezleqXFToD=JQprf5H_&ue==CmFDzD zEY}=h@v`t6!T3zFRnOF)MgB5A#6RDneB*FrF^s~6)9Gj8RqDhnpWnDlR5d{!*EW7Nd(QL!c8-d_3 LMEZlYf~)@l@nrCm literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/cache_32.png b/e107_images/admin_images/cache_32.png new file mode 100644 index 0000000000000000000000000000000000000000..044d155f367202e587a5c55f171074a64eb040b4 GIT binary patch literal 1849 zcmd^9`B&2U0{xDA_Gp^Pd|A_EjlDB2xiocb9Q8y`rr|wBQL?n=xq?UvA}E1tXr`gB z(!p_b%*-XqBn4ckG?y|Z(@-<5ToMzM&A~uP;WN(PG54H%@43I;bI&aZLY;(J@3w{@ z2!{O0FL=}K|Du)Yrux-h>Dx53ICuaYg6{WwnqOIjAX6yFAA^vA@wqvP%P&qpMj`nf zKqL~~Gv;ucjiMKGqhs=kiHS=~=!agd9N8XmsHCK%tn>qmRa8@@=RP#}4|+ZV<)?Zbb8?E%l%yif*~NKj!#%(kf>*Cz zorwy2Gy>{x0Wz6k74t8q6jgPH+tD-H18ROPxxIxqf%l02M~U{QUd{6-J>@B&Fu* zbeh4z7aEPGPc-!v%APTMQt$-S^LaLCn`mr|OeW*^fX>d&f`V%3ZGj7W~e(wzeVSV%#1AoAPJ)g+oaQ0Pyv!C>xcl(~~-0a0=IZ2AC;LoYmYJ*|Day7nV z4BY0d4T+_98nhFW%hT^?PBeM83c=%kPz~ZE-=TtX!^!0Gg0hCfLKZEJmO;x4f9H#O zi3}3`7tC0hmUh-`auNFm22&&&tkjc+ zhQ!YYXSS1U@%XsHqF(f9K=sEgL1)+S=*#g5RY`T#$f#50I4UhF84JNmBhj;I=(-U&; zQLkJ0Un~@~o+c0o>;hrmW1=Aj9PDdn}e5Q$;FzHm5v%Km7&tGBnJ z&;U$n@n=; z?00TBv(D_dR`}~T-=^D%x4pHU+LYyX`P-my7#eD>-BsIVE|VCwpSK#!9AzGHmY=!V zUn?o0KqmV-4+gH`UT{}nE@qDT+cG;AmQJCDPBny*A$V}`h*nZsdUkmCE^m>$spGMf zCfWioVt7unBY;4do>^acX7J-)mOQf>zCVeGIBqQ({%CxZES>G zBAxj(ws(M~jL5ceaDg2)y(p8lR5!z3Q)!o2tdn88S}(nuigh!`*azLufwW#f*DH~$FC21Mxm2HKMZ7FbZpz)ID|x?{J19~nSTQF*=t$= literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/cat_content_16.png b/e107_images/admin_images/cat_content_16.png new file mode 100644 index 0000000000000000000000000000000000000000..9eb5a39dcd31b7d02374860c559d3fbf51608c3a GIT binary patch literal 1205 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 literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/cat_files_32.png b/e107_images/admin_images/cat_files_32.png new file mode 100644 index 0000000000000000000000000000000000000000..9b4e4e8a906a13e2571f6aaeb37b01fefc83cc02 GIT binary patch literal 1953 zcmd^=v6JpaJ+JTbO5KN1wbR74PjVDXdb zrS07RQ3^Y@-8470eLHqijjfFlq^wh4E_Mk)b|AJ^Br}Y5a(PV*({V{DDbv%_QvBiI z;9D40gf^3!nl`M{Fwt6n3x6z{@>(DBE4Zu;SUOirGz4K}WhkyaSuLwffR> zE5~q)Z8;My3!F3*MQK5S5`f;`UZ^zxEASV|lwWVOFO(Q>uw7s!QX~?^MJj}Zgupg& zp8~HgFRuU}{gD%852zXlTk!RlSgQHfJA=(2d63jY%|)pou)8P+R;wXP4+PKOHX!`r zAjmi-NFqV2>&B`Ra9?A156Xyug6~C=EvUTO(a{B*w$|3R*r;f1!4+1r#dGc(aps&R z4_Hr*a=Xdr^DzvE@gVe;IyBm_*=)`OC7|tt)j_BlviWM*dJ9|5TpL;2j5zpnvr0yuO$(`I3T$D5zs;ytO) zE|lW1(PX;DZGlC-Epa@ce3b3NzPEF&;#rIJ*Tcgjkf{X8YT-2dO`byq=|Fpk-Qxc} z;lpF-3j(%ZSw$UIqO+WjKnZ~ng#ZJAMFdtMF@0OXClFb0k2Mv|^D!ALOeFXlOmc^45p-2RC#0?h0K?0nq2y{7OotkTCVS=^ zN0q-=2N_m>c<gddN$GJ}rxVNDMzh0-^Mfv(in&T& z1IB+462g_UzS23P9^Slg`L))S(rX?)UaazKjWt$2Pu_RTgFneTC;Qv2LdzQS#Owb4 z?^P&yPNg$V{a>Q9n+LA=b~(M+y}Q19F7_Xy8Le8|yZGD^%l>%3? zqyCMADx%5lnRvZh+{j_#`TNsL4l;CV5}hCP_x}3d%VIs{SxGsOC`zt4QEGYZoK~{z ze3G#s?s0(6jqCS+h@3yq%D)+jk^?JBV=bEmvMOkQZp4TowO!pv+PA+ZOZ(VAADH+I zrCBk{=pEL!c0A$3RmnZkJ&9@=5!U!RI1 zjI})uCE}v`usyjxPIK3FkDoq0bRecylB-a)>G16HsD)Z0Gd4#3t3c`bRQIC7)IXic zWO`z&BO2ecdZFn=ghmwDgfL@53RUfx`V7~!G|z)FGADiKAF0RF*5oz*cZN0%pB*%7 z92#A?ai3ZIbg+l&>Dle*(AA-4;5)c)#csT)Y3Db7#i8EOnRWch)i=ipwQe#*K7T?X z<4{VTTS>aSG7TEk6x`%dvov*m${oMkxAn$lk9cAy3>`On*T1-OL2kM1)}y;vb=c8Y zmBtqh3>fYnCCRTC))py_A%?bLt>Z(H=ZsZ|_p8D@A55Jx5m3cOn$H@uOdE_wb;_t@ zTlJqJD^jkis@#in?ROnXUDsnG8AVSt&OSK0hY?0d)eei8eX}>uGWeo{Q(fNGaH7#` zm&wc#Rg%+5$IF+8$&0_};41pHwrS1E6&mhL9^d(VW8bdBIYH4*3Wr%nkTP&1IU^wS zw>N_6#ZNq9oDS~oXutHQPmRVop_|ns-Q{$}p@gthT&6`|d3Q*$>+trL5DPOK)6yTD G!~X?`QrMCJ literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/cat_plugins_16.png b/e107_images/admin_images/cat_plugins_16.png new file mode 100644 index 0000000000000000000000000000000000000000..fc6772edd0c1bdbaee77aa9f626ce17c395fb2b5 GIT binary patch literal 987 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl zxPJTg?f?J(2?>d7*RHLpX?XVRZFzacix(dwBjet^d$(@gy2_fqmoGm>Mn-mZb#B_U z?c2AXPoKUyeE7)!r_wui99+D3+rNMRpFMlg+1c~t$?FXp_EwkH6c<s<;m2wM;lah*aatfx;n0fW; z)v0smFIur`_3Hiqdl*`Jr{2DCZQGQ%sk7#Cb93(sGW~yy|MTZ>p9*-FS&8oU)0ml_ zzJ2@gJ!_Y3*l=*#wDlbw9e*~kwY2pAKPbC@|M7eG?s##-c@wX3UtCk&!1Sr?O|qj?*oU z9je^__lW*KA@P4X!|vV3&R@IN*4gp#>D5I`mRFTF?(PYG_3G7)OQ#+@c=7u;Fxb-L1;Fyx1l&avFo0y&&l$w}Q zS$Hzl2B_$&r;B5VMsV_sem02-H|$Ic8ge7w#9OVuV2u-pr`gSTga9%S%z^>bP0l+XkKrY2b8 literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/cat_plugins_32.png b/e107_images/admin_images/cat_plugins_32.png new file mode 100644 index 0000000000000000000000000000000000000000..32f71ef5472d36e7a2c08fd22e1bfc5eb5ab4347 GIT binary patch literal 1844 zcmd^A`&ZI=0{yC)tf|xJm}}FnX=7<-vmR?3cXT%jYkW?DrX`F@B7?@1id$srkPQhw z64YEF@~MTcshN*)bV>QF^LNZW=iYnnulI+0X%|AzTU+k8 zgdoT|;2Q*T#}EEanAwgZxb(pt+l7aRz#*tfcFLUo4uZ^}3&COjU;83P6r;QbK~)uZ zX=!!#dym#u(aOrYu=GZCg15n7U@{qeGNHYFkn%&y`ue80|G88;K07=6>#yraj(FU; zcb{i(4sz{gW)>P68s+jAb93(p`uo|ou0Br)YjHsT3UMf^7lI3oDm5nBoI|96=>ZHrrlFgQo6eO0|HP)Vp4uSb8~a+kI$V$Vnah?WAO_M zD{A$0d3jrYeoau&w*UY>f52!2)6>(DkJ*|KJddB`w)*{h}fxipfu?3@! zqhn+JoMNq3PmaNfM1zWKcPA(3-rg5<21_7#wz~3Rq31^)ucx%K zY%a_3b@o7`vCGU|d6+|>3|3Uc;bhTDN=o#Pu=nmUN@zvp?qAI01c9LgU0Lv{DJ?o6 zh(XD`OQnJZ&xwgCkw{!s)zZ`~1S*$~gP-Q+R-Qh6_FZRYSy>B*(^^qc(Ne=gB2mjr zi{QsSfU>s>VfC@Y2JkJ_YAxvaWINSdKJv1@zO$Owt&(+UG}CX`n57PTHk-Y+wjmS> zmEsBpqe87#Z`9e{xO$ZopFm1X6cQqu+GLW!;ie`@*cD87cmK_s)SrHOoRyQiB+1^X z+E53>Ly!qXLWZJt;vX3hYQw^HXD1v<{*ffq^?1_F*kl|8kGqb=9Sk7G;&Dh^Y#cdB zj`M{e)5ZV4E#^!DMIcDEY36v6vesDO_6y;I!8DiP>AMP2)eCCcHzvKj6Y_7I< z`|m}a=M(v}y3hH}sR}`H)5`;tRj2YFmV*cjGQI7-R@LGxV|(k=*`y5vm-{vLh*^v- zPN;l1ARTSeZ7-brjc%n(<$HNOIQr%LExCEb1=XMwP%*lj{jc6nPAYx*b#)J=rMxWf+H;is^- zPjt*RUiu%f(qb?e<4|f6WyY2C-KHWmUh_CZ#iKcYog%+(5rG;q{4!qu~0Vv{Wv;4jzmy~Y#UDl6Z!Zd(}+o)4r6yA)Vh zhS|do&uL;N>+{?BBmT%WYS{yCwZoZeHpYKH_enb3K-M}ui*6yg;jkJ!E(w|oN$-q` z@a3w^iG8ah4`V&Q%M^Eb{aNb#r1qGdUo-)yGbisQfBE4X>PdwgAvrvbyFGchuXE+K zr{}=&v}p0{lY}jb~!+{vX{gRyhCw literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/cat_settings_16.png b/e107_images/admin_images/cat_settings_16.png new file mode 100644 index 0000000000000000000000000000000000000000..e2d3eb81e5b225babfc8c6df5652827c3328f3b5 GIT binary patch literal 1048 zcmdT?`%hX26u!FJbdBBi!)#r*C0mwl&DO2UnzSKv$y{_B&1Q^`PPhJ`MbKG%V3|yY zaU-;XTHg+-kF*FPFTD+jrRX+cFcB>(y}%Fxj9b);Tn3}y1ax<2LRv%{-Bn-N=2i6x4OF8 z-p*ZHbC5{2)6;4WhciA7uBJ`4?&_%=g#hKT&Xk;58w6qf*Q?|O7*i`zM#<<351%yzLD;3 zo>mKSIKymqF9^={_Hwn_H5i5?k%Uw#4TlqMcR;VV@OYB`{(c&bJ}_`sC=^<)*19?x zilPh#tG&Iet*uR`TiV;(Gn>sOlPMGmp=ca}{%mfhMIw7__N@mG)^$1vyLh3J@*4IW zQfg5_F-HF<1mK0?`zquCWoLymWx_0O>%-`(2vT=~UN?kr5}`G(wy{EgwpiQmAPN>^U` z0o@+T929p?U*Zjxi!U!`QqwKu;+J2&faBg&-#jU+5S?q>SgE}q_z7vMAq#h;B}!U4e~&qz2E6%VjpOgUED@F%z~>j_O@Ca${1?c5yovw- literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/cat_settings_32.png b/e107_images/admin_images/cat_settings_32.png new file mode 100644 index 0000000000000000000000000000000000000000..92b079d63bc158c0cd4222b9077cd260b09822e2 GIT binary patch literal 1778 zcmd^9`BTyf6#uqu=XT80cIdXPoo2e*ZZ;h=HLa_*QD&BQO{bgYSZz(lj+$N8dPHeP zDWD)oiE?^uLJ$awAbwHQN(DqfM9`G`3S82`TXsiDF{Hs?}Gb*eB?^VUu8!T_{)tYfdpw?wj!!UHxy52J7|cygf{BUAq9O!| zL>34-8ybXCsjQ-+vcG?{uTM!NzC)v_Znp=AYZ8maB_)+eB#FamEh{T;Y3Wp{KEvT~ zkH2V%zN=hr>Z4HFb9@==83Efr0LBIgQ2@i+jF&`63h!3Irc`ya9v3 z{`cQ69zQNttEU+Z4i?))p|rx`HMOdQ ze{9TvK#;uNz~rRWVsU@^q>;;YR%=k#P*Ctvt^Tano7wDMtJQ5Z+CP7`3WWoOh47)F z;h>0Iu2(9j6^aRo0@I?m&@(<`vn3J1eF9rJ(ktI1?~ z`!=|Myr!lFhht!|__49+l9Cc0?<1ez*VxFjSezVA*Z8=J%N3WFVyddDB@zjPAyKQR z@OUbpFVN{MdcB3mYvc1p{2)X zr2{c(H~&ZvgZ!DAk$yZqH7)m6SNdK6`06?&E+%ES__F&b@N*gMSE(jI2q|)I6V%{* z#dj9fsr9!0d5w|kp;Tmf%b~FFUu-wLS5u=FrsSrD+Ekl#8}BnCS8*=Pij9#A$-87W zE1CRs`SOp;Vxb@URzwXB!zIdBnxA-KXe1Ju`*!t_d`M=7k9|dk0VTqam&;qU1!dIJ zb33jER&W0Y?CCC8+v7Y6LiV;OfSOB&t-1hSwaR1O>_FY}2eyGH&Y%hAb&Ci%U+aU5 zg=lQ_Vam-zCp(g#1_Jv+z=uoD1Ig;JuGL6vYg~@QSg5sEiZYjccka5?Myunk*s^~o zcumn+A>FxY!yeT80~_$+yBUx2cR52+@>2}$^@MXi|4~cn8j7)k6Y2uRvi)}goVgA` z)xNB=--IXDi=Ce2$YxjuIrG@@?X$CQ6ov1oN6=aOuu%57ScV-<+m5*S@b$6h^i$nb zSKZRs6$cYaKyYhR?~)uM>13Xl3b(>kiK8`(*T!Tf&C#5?t4OY9Cz#^mIa#I>?)4|t-t1puRtFNi3Kc0vD1<44PQEoqpJ?gwmCtuAjp8svy%Ekj{ z3!q?c%qiaf^G6~QqhRXh r2L;s*_t153?Sh2ID_>AKFXu37qnEZS--)*yWtW8(uf7V8Vz&ee6R zvOcJ`J}Vy&1zqVjk%Bl|75I1y0t&X33Ruu0FhFA+U<;|=Sh9a&H}{^CliVNfN$$Cs zpLaANE+q~CfP|dvOmu{k{+;d75lsC&u^>V*l}Hp403N8ni6#F90NaxCb1_*OjmG2g zxLhtJB3>+(5C}wz#jKbB=jZ1`p%Bp0%1xrYjA&1>^9d)w(4f4U5Ofw|Z$b zhE+z9N@YEF`wi2hYR#PJr$z@RO9YABZnsbWA!x^ zqJfJ%L|iZ!R8Gx38doi`nf58BL?R`TuJM!O9rm%sf^6f7V|ty|Bx&=RIW;Bux+6#Y ze+uA$VrgmV36EEmx&QX=#ED5^A1ddylV@OG*UEYWFUHkFm-$q}wAMIty;8F~-fFc5 z0s(I3wFPi>b(O*37-na6I^DQnm`lZX5sK&JY}-@L=BbR3 zXR@LaFB6UPM@A*m8K=udyW7m6UV@keNMc-K(MF0e-EFO6F$9aaYNgb*vclm!n6>Cx zg++SxBRHgaxjY6hcZS2^+vIw!e8_AzS7#r!$UD_^nr{(pRP#1AHXul{zW#>MeYLm! z#&~%-lTHU)T3F3zo@-lR*a5@vl^Yq}$gl8-=)8i6{67_7aV8&&-2Of>>kP4=wt{%6 zv;hYov9)Emk8{qKR^rgOQfyY&@>wx}EO8c%J#vPS(E*4Q901jqgKU+2pZvI_uTfNwbPsyBgJF8^p4ox0-m3H7^ z+6Ph2A;#kg@<-fnRcV8=82Ysa^p8y^CNE6e`b7cK)c2ow9owLHO~JQe(!KSgnz30~Or57$A{&nwm?ChsMe4S`_PaTg^zuYv%1G`dzt*ARs>pnzn SR(}!k4di6yWpckOY5oU+w5uTi literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/cat_tools_32.png b/e107_images/admin_images/cat_tools_32.png new file mode 100644 index 0000000000000000000000000000000000000000..f504286283984a0a0c7f239ddcb2b2a453a99142 GIT binary patch literal 1928 zcmd^C?s0N=J22-otublG(u=)^R^EwN-?ayT(pToRy6> z?Vv_3bD6mt=6Jve_5L02^Z7i__w)P#&y(&3ciN|KtPcW#_Br3M z_t@r%|9Q9WcG}bMz1z?Wg}OpPpsK$u!FVYMqziI`c{~9m6p0CYtGAi z{l|?TwF@<6(HAw0x0RI*&(Q9}F;TU(^{f2H`yVq|l3>uM3@ z^XIR?Vt6SrWR{yI5Qta|B9}WfIx;djF;!Vv74K>GF2i?DJR!Ycw6?a!<#J;q@5VlP zl3-|n#bPxd1>;CqdPerU+RjZeJ?yA4k2j%FOpKTrXQO^xT3QBXtQr~`(;kP&MRaaQ z380(+}lh-tJP|f^(8<(qLsG-fFuKp0yI2e zZH!F96HHF9*#pJJbj>GT%VhZ`xxxsfd>npRfk~jHzK|Z%OhdJtha0>bQQe$l~rlh6=k|OOK zL*ZpJ-IIFrCakcq5b5Tu;@^*tPkwRq;4g4Dt?1(tquk?XTV`08TCK@T@dq~gD#}aQ zlpsJY3qjpgO%QWll}n}4ZX3(e;zD4Nwmg`*B4BX%moZh3WgcjZS1ua9RD<71@KmBBv7&|nKHG@`Yu zUncC%%t-4kOq!XIrujLB+_|50#|HSyYxnmnEv--v#?a~X58Tc`7uU%lY7Epa!rxcK zywY}ML@jG8gY1YazkdlZgZNe&MP z2ueUl@jYC4w|-U3)vO9xby)Ts z@O_BQ_Ic(c_SHLKIVp-7`$NGlUDw@Vri8=_ z6GO2Phiv>HuP~X;#+BQa2*CaBzarx=RG)+yI6p1fXglZX%5wXQQqowsv=`@?suMY= z#WeeGg>gG<1Q_SD=OlNnP2vmpheK|8vn}}YzAJ>pN*W&Jq!4jW_4!;jwcL|1e-bc=P?u zx{55#A(wRyygV@a#}G8~R4z)kMz*M%bay0T#%!+83cSu=Hqxgkl5LX`;#a4y&Ze@z zENr>x@7MR-gWC(Bch?_=eNvs4-_d?d{LQO&?Da{gcQhFXcsN)=PZD&y!80vtJWr(j(eSB#7)Ke|rD92tF*aEBK82@imq8 zfS#m|;u7C4+8{+@1SGbZT^3gw+b)2K0#3PU#sA*P+syvW<2MT#W_`>muTuw|*}Ef) zzgi#q{gDj(WsTs^_)V|(aja-`rh@^bWY)&~9sG&%1taatN~JWReqZ_VF=jtyIoB0zm8e< zTwbhVf)^jPM$0v|mJe^=2Vb=~Wq4{C!)obvktMm2$K3%QIeCD<>R)P#`xd$d$fu6mrfeieoAS+m z0`FS0hr_G4uJ>KIL9lulrxzM!nizo6Pp7l)3Wq(Dl_@;k6t4${yLwVsWgq61Nwhbe zfgk9Bc%s93qqso1U4ZJ7oFyz9OM4CW$!%hPhCUP;mDQiwb7jENkxd5uU>9x^d(7nQ Q_GCcL4siR*>w(z+0+lSCtN;K2 literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/cat_users_16.png b/e107_images/admin_images/cat_users_16.png new file mode 100644 index 0000000000000000000000000000000000000000..1938ffefd02d2a1f419b4895d788f359ad6f1ed7 GIT binary patch literal 1233 zcmds#{ZrBh9LK-Y*-EpzZCgt|JP za7GZs6?Hi%!mh{u+k=kw>-o`9tX*DD@W1MhAZ>qs=2Waj5QnsIbY$>T5m;qoo12@# zn7cvfJBh+TF_+7;z07A6Vl*mJdSh zLIH!b)yMe_Oh&7SOQ+L^7P_Z7B?$>+SZz$GuMi4_Q%Sch3i0SKc^jN6SZ?cBD@Wzb z*tXUTg8UUaWy1_$(HV_9pnNtwqR7oHThnMdepl%>mZth^GBa}`V(%rP(b9F8QiCrg zueYUnCYR=WCI5QG4*KC@@i-KXgIueXs;3)fARsI?Zw$Cxu1IT7jB8WP*|bW%ULVC; zXNsZh`QlF%LEGEgGRn8(laoy=1*>Mz4QH&@GS#(@c@hiA1x2b@6Tce_^Q`!o+##5x zk@MBp_61p8Yl%llH4eP7dnn&N4&kOW@Ud9^RwPN>I+a$hh8O4nU)yM zeh)NJOihx~Xa}t=EMX8^2yJa_`HCrT6vVB)@{tZcD^0Wtuvo|How3QPVMBxcHH1Tp zH_tO@?R3HbiJR_e{eeWtczT}LE8MhmF=4I|9#Ae@OuGU#tTa?E4W*S2?{`%X0DvuI zO=Pd5m=b}(+U@^pkhj7PZ`q%7rv%@iU{h~X?%}^9BL0NbTf~#76np|Pf`}(j$)iMH z1bOWZRFHq9CpNx^U<-W?Tm3Jwp#V{c?WGU#y&hD-nSsYH}lSpi$ChijO zWWJ4`6?godBcC_6HKA`SXIpBPYTk|}=ipWCJY6k=(3IllhrOS@R_b#2#Nex9b4j{) z@{y|d8mme9MfgqGor{tKoNb1`x363$ym$K&`C94+MIXUand*bf6DPGdB2QRV58K1bgt<#@&B$1sWY bB^D>-uTvQ<{Z)>c_S_IuFed1E0511myfZR$ literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/cat_users_32.png b/e107_images/admin_images/cat_users_32.png new file mode 100644 index 0000000000000000000000000000000000000000..87328efbdcc8dbb45fbf4c02492c5d6cfb2cbf99 GIT binary patch literal 1927 zcmd^(W%p^^F+U2>73(IQOT3iPmE~vR4!AP+>S;kR5aH@oZQ?%y3@E{9 z=&s5dsQ-u_GcHAh; zv?k%K>}4!=)N-ygk5t)09RmTR2Tk1z+XA+134YI3!2R^a#l@Lgj7Mz4{m6*T5f*2b zmDmQ>xS5hRY>_zba;jZk=N4FB-4t;CX8#^aT<+`bjgEdgKD&Lw^eqx~CqsaFEex5U z1*zJ|>K#~wOADj}MPG9f7hH9F1;F-NVlbGjSRY}L$z-s-j$?rj61+;KT2(LaObjU4 z4PdDsEOX&G(av~}YIT8(wC0wCM&jD~E}8~2?M;(Rm7}i{3WgOjp}4{$w&NL5Q2U;t zD3nrxQUX*{leBPUOCxiwJc~i>mjQmQFFVFp?1LJSjeU|5CltK&Si?zf-zWbcz#KIS z^Q*kOp0V6f&E0AlQa18IT*;W%eSCa8o-YIFWZu-OctZ`Ii*3QS8m~+cS5=Ccv@a_R zP?1^R*ikQOo=twZ^`&{`MHGM_#zJLo=N z!W&~f{%L}Q%D+Og*>_vbw**}Q_?7F~D6#&j*3_aqG@l!(3jlyE%|}EC(txn8w@|zF z|5*@f<6HgRpU}bDdtgzI0b1oDL@?S$IACnYePkj6ym4jS&#M!h@mr*W03J zijNGSX-8i~9D0sG8h*Chb}di9lr#Lc>j=^A`_B+G2QgY)gtM#n!okxYjhG*Iv%DtDHB89YL!TA}9WIrT-`5mm30n#d?-l(Etz(?Udl-~E1UIK7o;X}3 zb|>bIQ-ec7Wc>vJ>aNW)crHF=bKuQ6A-0#L)dIOXi|!g+h#0%H6QQWjOj0q91b2)VR^F7Luo=e_{(RfFt*N-BbJiQ zd(y>4cWsUM{{BiI16w1{vpK2s(vDv33XYCLNu!z_E3#~F=@$lTW$LPac`DU5ytqmmvg9DTjd^*xyNiJw?QhwAwDn8+ EFK-ve9RL6T literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/chatbox_16.png b/e107_images/admin_images/chatbox_16.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3aab597d9838b3ecff77f74b8df9883316eb60 GIT binary patch literal 1062 zcmdT?|5Mrp82+T@I`6!-YqxV--B~-Q*DiB;wQDVJESRG?GsKO{R#W-7Sbjrsf-OPw z`(}!W0s;z%+(LoLh`ZFlg@zsjJq?^pbUL#wUE<-KAiU9^(R24a&pmg~5AS>TG^C{_ zM@AfqKoBGne-29s`m6u(mC&HZy|XtxXkk||7cdB-HlKL8@d<*2M5d(>adHXVy#rjv z?)LV!)dIHr(A75IlIyMN_m_K%u} zQLBU``gUTm?}pIyTEt3Yi9XCEOw;h8Waj(adG2# z+Pu^0WL{hR@FuLTt`f3;kZ_k49xW>sbKM+Jj=U&gE|Y}2YKe!1I(xgpY}^+90o|R` zT(L^8vz--qr>7w4$ADC#XZAo&U!a0@Pay}r&Q+hcf>MP=-z{I4?q(Fubu>9Ux%L*8 zi%~Dq+y=v+kj&rsn)wsA#3wdFIlWUh_ySK=uCH%ai=R$SP0?Hb9_WYtpL-~5V>cfd zqrlGf_Q}9z_SvVQqSV5_1;~5p#tL3$KG#12op7qKc(Mn1_4MyAPAMWMa6Z zndhoK0Pv(Pkr*6`nnp-X561ry5a!*`%HZh-X*d!sy)c(nmQ{=*7;<4Y8ja7-x{4Ce zEHZ;Sj-CpZ9^FXM!RQip7|3zv$ z{&MYTdvs;OrOdNqa;;bJ=|>MkzGQ_Y;%1MUJ(`^_tJypm-pq^99(?Q4UzFZsM81!HflP`$vhUfNV~}wEbmtKR zVaKZ@QPxiD0|VxhbGNZk@kl6AyHRN8yM$rEe-S(`6{|XPrRrbqI-w{4 literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/chatbox_32.png b/e107_images/admin_images/chatbox_32.png new file mode 100644 index 0000000000000000000000000000000000000000..d1dd539886b039d39892f4bc87544ad6e3e3a21f GIT binary patch literal 1857 zcmd^<`9IW&AICqTShBS%rPe;oZhc3^hO}(h#Mk5~H;r?hgK@6by0fGmx5#abG>kiP z=4_O44wEp;w#l_}wq+c1&wG9Uj_>R7c)gyF*YB^#E5*vfSXTOsG=d z^z^V;?8(XLQw}s*tI#}}^J}~4p&u_lTJYx0TdaNBD1C*?<>vmvj|}f0A0KZS0e=dY zHUpnNZHIf#+^0cT_edyyV0{-{9V)-^+$}63-O68k@>JB>1{4YjN>EU zt=3Kgg9>MV%=E*jTub4VByZNyAgB{)eURJ?gw&Pt41PiWSTbQK;|Ua{h>EkpD@UYa zI6x-CrEoSTS5Q|8c&DMx*N~Kw+uGKZUGP!Xm{pc1YH4YWh%55LSE~P1-%tx;I;@-J zLbuz`^6(<$`+rCk`=lh%^dyXSK{k%}z3BkCe5$b?h}}?A3uR@HJ_rJVppY)4R62qDN{_h-|gGdRYs#;NAo9JTDz7Bz_=*lAIg6mVLoB|n>WoruP=Lnkrf-849 zk4hn=2;!>2sR07>;k3gJaRTHlw`sJ&AH7LO)aFKqp)dd#bYQbNeqm{LC4yuERVQZL zE}x-A(8V^`AhR~-KV|095@_7X6|Ou z&!C&WG4XnGn*)!sU}omezW(8~kWab6eCi@-VdhA2)(r4fL?4QNP2m z0y!HSdpUu;Si*b&zALLkRN4pg^9wX8#JVlqC>7nz=Ifc_(nrDCDyo+XE(tsK9*ly! z!tN@_joI>xWNHw0wG)I@&jm(qzgIW+S>XsSIN}XYhRV-um+-k`I(1)sLsry!-tu@S zBqY44Mif`Ll~J`58^3netG}RR`)b^5bYu&K@=7zDqaVsf*>XR}bPSKspUgmEqR`K7 zVuAsU3?NtVBKyF=4A(Ocr?7nF+ynqn+t6Pk$RQ-m#=`cX{yz(`WlR3&;3rOpVI0D2 zLwv#_JnrBS1Md(|9LhAv!xv|R^YD%e9l_}#h*-C&k%8S08D1PqMBU2##nDASl_)eC z9i?&e>d9M&lT=r5>7}36*4Htrmuo#oRgLYRYQ0&xXvwQBxu=Laf8ON5Q_g<4%tJAY zCR^;weyZi8Qc1Dv7xhYfowF2O4pq%+mDW@aFI24CO%rHCcyAs$?B| zzq8L{n-mq+N|OXBA(1k5)rJJB>PgX^Lauu4{E|K&wv0(Y{S&-GGyVd#Cw}d3A3=!RS7GXgYh6*$^1FFa;U8Pxreg^mG5g%!LuGv6{%!(`t@~Ap z4<3(i+qqB@T94)Nk5?>^$m9v`M%AdK6MOFCmB5+VT&ve#Rnym|C!(mZSlXf4uYk%IC804Pm z4YGLa%e-p+@NVb)bK_OQ?7H16a}$(%~+)|MPfEs6-%P_MWo evnrSC`x8PobX%S!jTIkk9WljN7&REW-}@Ju&t+=> literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/comments_16.png b/e107_images/admin_images/comments_16.png new file mode 100644 index 0000000000000000000000000000000000000000..184b2c310abc5d7e90cce72bf49bf179bda56e30 GIT binary patch literal 1044 zcmdT?k5iL%9Dc*WdBiU6y2`q^@-j~gtt*K-?P@ll-35&?y&>80Ym7)7^CmbF;@uqS z1l&&?V=ORU)Cps<(Ga29aI{y)I|$hJhD^qA{1Ah5YvV_Ln}0^n-RJY%bNBh&JO0b22T$@lR*#mdM_<=eev15m=;j5(IVIlA}e75EK<4~N63N@2r+T!alwflD1GfF<(zlE;t#2?T;xJIKs3 z%*@POHoMl>*S%pNtl zPxDoVRJKx8J>EY6G~e^gC_u!#+D1%id9q;7JDpC(J-{NQHT}AT&;MOe&}ke61-boZ zZ%Cu`>$R5V>%UuATfQk)4|`U+2CUpu(oYUst)75DAXPPtwp>L=96(ods-~u4zzqav zmxMw&3}2X?@v+lCYP>c!)|xpRv3yG=73($nkh=Yok)KV+@0ALfq>2#Wg?{;3^(6VFM#|26I zlN_xaO%K{*+F+Mqz(Ekzh)z~aGO~4nAgHUwDo;c} zUmFuCKak39(_b^tQaUEFBMJ4-lVN9!?ux|Kl{_+Uq8{=RZoKg}>j-0X*~o|Rc#eLk z?xj`LwdDPCZcc^Z6efE=ibq%Hk$re}BIPvg&&7P0$ZpS_Y!- zxF*3ezh6szuEytd=ajZ=v>IHdsqqQj$luDO(obkl9|s4@fE*|k3Q}t3-77J)$j8rK z=&EbDtO41l6~KO@`vL%1f6ko-eSJWr1S*w^!{OA`jbg%^fbvmAQ@@|1qpkv0KvRLS z%YXq(PAXSwfg7UG4^aj_$B)c^*|q0C*+^u6b?Ii=T$Tz{>=Viq?5G_Nde=K;;M}<< zLzHj#{(STO5a<%m->X{5%&)YwVV1ml|6z2hw3LZYD5`7|23)AWdieVx5lFiy_x7Ss z0gx0QFB7h2Q0h4`+sKqEkr?#xG%pGy$;m=&RM#C_BcyBGeTo!;h)GYER#fTU49~Xk zr?T_d4ZWh0_A%asnpw_n>jcyX^=)l!T&^ISBu=i>6&I<=)hk)#9O}QfA>7Lt4Eb3! zBQTI)edv}(vnrE;=*Y;0g+u(anY|7RD+0!ht($x!0YQ89Vl*I&PVCh z@PYFQ+Q#RuBFf`axH11ksc1&^dP2vaTzNaa_Mmk{H*)Rb9}$^P2hw~4GM?~FO!Bku z_s0fea=nu!r6$d>PU7eL!{S)Yg{<-Rb`B5V@ePl9bP1lX=#Q&2NnB@_hzZ%^l7P`SX`T2|@rC$KH30v=@h%S`d#~rXO~no}Q_}!oei;kbYlUYzAoGhKAn4 zV~cV48$e)6az0MGyZG4I0(=S@ey3@3*)gNko+ByO*Vn;94U4UP*0>t%%!qO*3C9o# z;o;ZA;;K7EtzwmA{3DMKv>e3JJ9nip$ZU5?OZOo4<%V(t)b&W3-Uv1q=YXxTgP<)C z4(;u`8ULRF`DzUIZeGU}=XxIJ8yk)zgvMhacv$QujJZd2C>DdpgoY90dNEEA1RL}~ z!p}PN{jrLIj=Y7Z$_ISReIPxzBZ-max2hf;c=S}OrXQ=t|8n}jC{&?W%9`x~S+pZ9 z4Z=+5DPmu~e2KICCgsj)&$)TV(?Xo$$DZtyF+nc+m3ip|ce>r5S0avDZ!tFg>MKsd zEi#6UA@*t$$#aEZhZ~H<^lUT>5rn}iLZs4ncD7!gbKm7&)hu%M4r0ZAruEnDtBt=O zwK^!_Z9PgNXJ&SP_hjm$Ogv>{`q_5;l225m^swy4p%J8`* z^|sd?uMd|;`yvN^;#zTqf`G2YV9PhCfg17Cu+XGE4u_=YsxMqI-{~JzFQVpJt?4UcZ3v=M*lG2} z!DJndKp1o!Ueou06R$qIo0CJOdZPv(I*;{D&B*0s2K{#FjoNC*7|xQZjgyOuk>Tvz zc127Ja{tWl`1T}e=eB?Rc)X6qdhlyQOhgbPysp?9-TKToM!B42Z_`IB9OUr~(&YR< zcV!!2ZR#_E{Stthnw-1=AJ_J}`)`0+i!hkJpUYMlB4~(9hw?MxWtuzO&1plBhpRWT I1`(3>KewuR#{d8T literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/content_16.png b/e107_images/admin_images/content_16.png new file mode 100644 index 0000000000000000000000000000000000000000..72157f6392a333cbaf8a3fec0aa0bf39192f3e6d GIT binary patch literal 1277 zcmds1>raz+7=7DP2TTR4Ol~1Cbb%Sza38jrsT50*3`qk-*%k(6Eo3qV8j!fmjWlwp zY$BIhDi-M4GQgHwpcG2Ej8dTYzU|vW87(NSfHE#yQ5*5McmKwo`!W8`Is{=WC@C3W_o6f_D3x3{+wSZniU7%>|Y8rNXhSXo)Qv$Mly z-&ZQkFbr2$SKF+n2ON%3?_e+(<4Pc(2Jv^33>uq3w}_Zb0@+rRu>bJ}_}~`FV9?vF zX6j6++wD&I&A(1CWP%rEe}MPP{49?_R{Q$a->(zc{u+aIe}7*z1z_Xyse(tv#l?up z*w@=ztO+O9lJgA5rIWzvbQb+GF*&2Kn2mW?Df5V_v$OLC9Kx-oWcD28c8#}+rTOrY zBE^YCo6Wuq;_nezyzW_*?n~~mrY3fQjj*x?I%Z}KOW^b7^_ZUsZI7g9?XN}9{?(Xi^Pl|Xv-VaEq*#W4^ z&|Fn8ODO5<>sx*D#I?G5rZGY~Z8X3-VnaMnBpn(D2E83k&1`~sVyRp%A5d=4^~Z;Y zhs~?t;SeA{2vF&P)q<4j!>v{;O%rHEOfuOBO&gdc3YCw`j0Ojp8AoQt@@FQ*Vle=3 zT+e|-B5|&+ep2I)zzYkO6=Ap3ZnvMWz2Nb9=B$AAyNh%eKF1^@4xpUVwuuLMytZ#t zLFbrBEmEM zHeSY7*hG?OgBX7uzrTM#ku-oEEj7Hv?{(6e-^SvpPrtxp)mQAbr3;5OEv5UO4Ikfa z>_^KHv)Q&59|rpt>7b7b{R>l(6}g$R;twS!n@$g;W#CS08T|LQ4n8{)O*^bpu8-pQ zkuxtS7_8c=2o~8J#T#C^?a>7R%AY;XSE6gLl>b1u!lf{^OGS8k=0G6N9Ci0}#h(=Es#;98eG1m%3- z2|~%0{uRZk35*5JXv+IL=q>0ShZfaX6xnc@+x-`C9F0TGr-B>Yi1cO(Dxu`WR8n_B G4&z@SLLy}V literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/content_32.png b/e107_images/admin_images/content_32.png new file mode 100644 index 0000000000000000000000000000000000000000..9eeb16973c8a8ae295f18d52fa9d663823f19a06 GIT binary patch literal 1917 zcmd^9`8(VB8vR-_OfDS{buD3p+v3vOGWC?_a*en#6vbfLptcaS_OY~-B0-7H)J&Uc zX)U!Ctx`)Pq=_|?N+XFiu_nzhwp376g3rzT9rt~n_dVzR^*raCVjnM8b+|qpf*|#a zZfIXQBL7-dCHY0y5gBq&jz(QVK~O8x7Dil!ASKAh)89oPm?>@t%gf7dVR(r|vbwrD z%mNK9lzhGsv2lH{B7xpJB%Yt1m<221`52b|g9i`jE#=gu%;hfO&za zsi{e)f~N!f+1c5Hb4P1SqJRO5t~Y>4B!2$9PovQW$3Q|tLi>yM>gwvqA!JMKle)UP z$ab*y0d%yt4-F0V_xIaBlt%X&T<7T8-O*t%81_G;ycq?l6Nu;$L=OWrHa7mJd<)wg zt?%uKqnewR7>gwU;U5xEfEXMd3>!9d2p~wd!T9+2)us!)C19EJwSR*<`#q3Kr4bPk zbE`nG1YASXe{HGT-rg3A#jcGgN+$B&V3Oee(v5qMcB6joMN_E87oh7b)64RLXC z3kwV41woF$z}_|B@bCzO!Awm}QTo8mj8nGXCvx8ddrW$7PnScw*6i%;lmtwzf`C+@3&&GYmq949&6(0RS?Y?9-=D2L}ho$H)8o`^Nwr$=NaJ z=mmT!SQLSsJ-}jdc)ZCgjPvd9B&Q06xZe$ScXzpyAd!Bys;X*ZZCQ4BXr7~TD3c+5 z9e*Z+v{|Ei>PAd-jHze-#`=axB#Oy4QuhdKs;_pqtwyUa4(m6jaTY^a$heeD(R<)h zXh7xxmtPP*RfyQwShHL;E4&tCn2Ao-aIC)+^;{bCj3kwAQYe%jS`U>%2jKWeuCAe1 z!Pcg9gb&zkc7CGC(}t(?uIF1@TPGYG#Zur|>3oHLE{X!olJrTG^)u=Ep%g>w3W&$! zc2dFXw(cjr5BGNWWU_-iyj0rQeKw@1OH~ z^6lK*LR0he--SnV@8w?E$$R(W#;BP{Z0+j0O z>1b4i%v-56A$v9e3Gl|RWL-K5!zJhs{eS@3nyyo}JtK6oG-s+ZzN--J#;%hbO zhxuM|qLvo^Y@?Oi$DGBoGIbSGfoW1{mh&s+Mq~jel16gW$o(?=DA1fsKA5-Bt_#x( z?c>2UN*_!(E7)=pLKJ+t933mpq&%3Mf3Sk0?oC*Hr;F)INFiFI`^$r=)RI6xU;mF` z4W~-BON~);ZU^ePpRhXqjKv}=p)v=*dj0o>vYC#nuOh(TT|9K^tD-ucO6|7P5 zCZV|#U2A&#`!FX_>q01v8ONcV=_ZwwSnls=wJ8d6BktMQ@C8bAm}AH5gxH+};mS(4 zwHV8&8Y|X-Ij8TvHW+0G-wxZmRZCEby`GuZCoixM&1>l3BK&&Vs~f|4ebpuZ_3s{a z%32JmwI`Q9ehN2b!80i5K4?nhme$nPzNDCU_InYA(7Tib<8bn4dva3AFa^giEG$y4kc?ET>T4yE9r?}qXdGDC zoMaZ~<>q9ZLBj55;qmyNy`g6--glPYMcJuiTkLKej*xcmm-y={6E!h97KN{@vam() zC@c;KKe3?ku5;n-YBK*o*%qe#MWI({=r7+H2A__YSAX$heY!OohlL*xC2fysUR#{- z5A`Snj@L4G6~`=SCiOqHZJaWeo=gh(#pDM7$c;O707zrGhGrg8SYJH z7urI~RDZ>rLyD(QSNDI3xDZz~!t&rFYm~L_SjMQ8JA@D97dWXZXa5G*;%b{uOa~31 qnmXZ@J@`&9(oH*lYt5>XwhC15QPESno1rJq33SoL3;ohL4F5k?ZG1fd literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/credits_16.png b/e107_images/admin_images/credits_16.png new file mode 100644 index 0000000000000000000000000000000000000000..5abe7bbe3a236a2c735fd14ad170cb7f35592001 GIT binary patch literal 912 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 TIQ4O8Lx_-&bnI#T`HKGlGPQ5x literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/custom_32.png b/e107_images/admin_images/custom_32.png new file mode 100644 index 0000000000000000000000000000000000000000..a362474fc069cd391e8323420c904fb4bd73d9c8 GIT binary patch literal 1911 zcmd^9`BT&P7X1n+HXucAd3Q4L6J>lD}gHc0X*@9%hb=AJWm=KOHx%$%ElI@oUm zVjBX2pbaR0@6c6t|KF~+T}AI2^581jC3ppSK~VG1!L?)=1ldBTPlfw{cWHOylZ*{< zi&xjpNaSbFo~1rp)M#KOY`l+8OH52Ok0r>)YX+jjaEi_@g;XY$s%j&H2PwCOLisb6PS=6c%2l)P zcwnhmS76_glb6O=GMSdaRK~Ec9WWUI3(X`4>Gj6+h%;5!uT1&v>A*#^gP=Pk5K=_*Dj>`eiR3_C2?YPGtA7EQ=ftEl zv)3X#!#{OQsL@$lV(XJnjn|ZSrJyKx zn&BnGQq6XY*$e>at*i#x)|C}Y+lYFlFC>Phm61=)VUMp2eXn2Oue|i`tFO~`qx)K0 zyRQYLf3aI(1S*Bv%FYAId%Xh!O|jc(Nii=gYr3GQVg`Vj-spQXz66^} zLw9$1yXbQ^MHjIu2Q;kN)$}AlQODzmbS)77y#&^10Q^uS5(62H{}T!bFKWdLCXuM6 zu5SD%`{}cvNb`;>hbQ1$dtut)u&}Vkoz6r`u1;qXOBAdAn;ASE1g(M6LW9Fr&;RFv z!VLCbuKo$vG@pN`g<&yi_&6LI@`}g)f_6ux#3i6Z(Q)yF%Wu)gAjsw;%G)da5am}R z04L6SI`7H*>ieE7m+jsj7-+9EW?m#h&XxiXOL zV3wA4&P2g7aX)P zMvYmQRI5EuNm8Y*y>`v%Q(Z{FGn`E+=3njQt}gLZw*=wpe(Gx|ly0~ZP*SFie@ zaoBQIlFmRL@CrGQ7dN>J7o93N_;{vA*a?8P&LqBWLRCNq@$HY3j z6^~=oBfHA5_K~TUB;VNQ*ryH3;f_~vNDZFG-h7?FbgsAIoWt1O9ELBjg0{w8*%?dE zWe?j{J>1cQc%&`s607U~p#GWAn%n)UO|OyjXnfh+Q}lT~Qf;~QA>FOX%hP8cM~EEH zPEl8hwrmvKb$ygEqYTz~V|B zBQzjWNwa2pcmQMB43#S(Y{vu!{=PT0dn1b2l8Ds5$^>oY_i2MmpL{O|7mzn|g%UWSghK^^adm(H5bHrwQX76ZdvlhdK0|MMCCmoxmgvB|k;{PWVO zm#0om^AUUf`py4>g1h2U8~%4(S-NyzMTJ0v#r7<=$JN!pHnCnlfBx~ETRj?T|KBhi z3l2V-Y1{oXy!~s*@2dj)7A?7)k* z3;*vhgk3Ro*Wf|Em}-2?}Ojx4k7M_P>BZaFOwy8#mt9F?3Ak`M;0h z_tn$AbEp5`#xQx|?EnA&@7=qx2p9q7B|(0{K<)qlhL!V|qyn8FS>hT|5}cn_Ql40p z%HWuipOmWLnVXoN8kCxtQdxL1)dr|&xu=U`h{nWZ4QFPa8!RkGK0BOI(vIwCSRXa3 z)hAN2epQK≦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 S!<#@aGI+ZBxvXqDz zy?!-Z7#yq{9F)32rz5m;-0&^l*{FkHpvsB z+t$FXn3$nM`-b8}I|>S9w|`^A$KUhtFrSY2BRqWQAmwi&vFUx#<3U8gH#&gOVv7wl zSwa0$z%a~+VP*`Q!>|PmGhx^~hIJ!IK0voKnCIpeOeR&EsI|EGF@U;HqMM$Umz1c4 z{OXe@jQ?2f5rgz97DF6b6ZjK*iNv2FgITCrFm5*aj_H!6jG44u(vitu=Taxy<9 zWzGx4+1Z+bfhnmp+tc$$PtO4+bAZKCH8ws?{ibUz&>bB|_W2H0RG5{6wMUQ6$mM#2 zUZ*!Go0}IKIp!_P#`yfE>(`afpBr@ATtB}&63J*V=x6i_M=)q7reiiwQv>_>{QKVC z&4HU_RaLG2g#Mr)8??Loe6TLbkdY7SVT5(xy3pjVF=lrmXdaQCH4kG;I~lbR|#-k=@ty>_h~ zL7tK}^8AU+;9yx?h(aP!dO!!8-Nj;c<>XibwHwi11F(WrYGkbC{67!G&c5wo`4dj5 zp$AiAlao@G*`;mV<%};+OZQCQd(&{0Ibs}A>_EA_T$DV@QseR!m>jj zA-?3HPj|f;H^exUUcR}bxH!R1nQAJR*3^wIo>*@)#r%NHV#U>Nxe`QG^1T^O6ZE0E zuWSfC^HhKLBvwu>1Jr^t>MqlER^NMg3?hV6J#w!hV`J z17&-XKF=I&|Mu)d^a!=4V%3?b9@|7(PlI#*>5JB7id!+^A>S92PlTMGbZ}GVRDWCU z^Q#r5%Rk^tI^m$%gZ6u3dHIvH-0R=%6{6?MxxZRnwxgYL+ZJuJ*Y>uz81>BDu%U>t zkhD9j!5#k*`S626$Bqw#wutv8?PqNb8`9R(pP61Qc^ZU(~99sge$uISJ21#?GA^mywbCA-YIQW-`bDA{%oXWzuep}39Cv^i$-xfx5l>E-buL=fugx9k?-Wq??NS(TT*n9 RK5Qu}P(mX^DuNT}{{qQVE93wG literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/docs_16.png b/e107_images/admin_images/docs_16.png new file mode 100644 index 0000000000000000000000000000000000000000..63b21b0d51daf4c29643d72d75b5029feb2fc6c6 GIT binary patch literal 966 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLlMdl{@Z z_piMt?zwNlvA+>XTfTk$%xS)1%Iq^{6_1Wzd0DaKtyc0CpZeP@?mM*-PM^Q_>g2g+ z8I$hG$DL7+J;)z;VAaL{3>ND|Q*Mjrepq>HZC~!f8mDfWwradx(|ES-kq}PnSSbJ)2gT8iJMdE4#~w` z`u+Q_b>WT5`U64D_gMYU{`mIk)P?82etx$pxW=FMY{HHoY!17>efeY^x3hKDnT92g zJPP)AuYdLG-50N_>*Y&7WzBjzb>q`>S6?MgdLrPqYwhL#)@8TP+IB}V6M z8S}mc)tt?**_W8Qk=OUgqD?m(ORq3l@0hpyC2RD(?5TH6(=T^+9%Ar2BOQKPz2rs7 z+(#@X8|#)n7joGZk+OxsYPoOm0cFdj4E7re>h|d*AN&9RznR(UYrrU{(JaZG%Q-e|yQz{EjrrH1%o$+*W4ABTq zp3%%EaUg}2J>O=wjgvx+Re5A;XRoBsff>QBi;Z_}*|=O%>B6zc(qSpH7bYZT>az(= z&|V{UYT6eq|ISk-d?^fEPo%FzX8O;&p*vS(vVsJo$b+uXa&sLGF~jMvraw$(MctDd_LuSIwRMT=e`DSFHbB82%7us?Qxb(*L=gy z23|b8)H8gt-B!WU+-VuKfPb?n^aC!uIcNaXH0Pbz6k4LSn@8fPvM5i`y_3zHC z=I1k);U;+iRkysf_^?xT@Eog-3k7Eka>nM%S&*K43p#$tkv5EQe|?xT0*;p@KAyh* zL?)hh9@us$5TeVCJAV_I^vecaPKBtzi?fIsl9ola9bVp#XU)ms> z^96a}Ht^@#rbwW*#UH{rg*DvsSD0yeZ^?Iuh<84vWwbJSpt#I7UGL5_8I!)g<#yzO z^XKcLOTYzz+y#6w6nGD^iWxh0ad23?s)c8LoRsdpAW%C| zgN&YYNLlY(0Vg|wEd$upnMU=8l3&nUR|(`7HnBaoUMe29OdABSP}vHPTQbkAm7IoU zqliAZXEQj&(DrKM@nyDTo(*m6#AUJ1wSn|fu2d!`X0@8VU;lojPzd#Vw zxv4=LfDM4^=Z#yB|7QT4VzbHmPZ&_0Pg8L*Bq}Y8LImiDm~f(zTXa|?(T^Aw5l?0j z?Eu(FadSfBk9D72@&Sji{@2)^*}XHk#{K%!EtN)R_FQOi>ajl9@%$H#&j7)c@jJYcx_HMCE?Y=E0E6%!?VCL&Egj5&BW&b~SlbppMX4Uei>u<{b9>Zj=m z%cjP{cAY1v6wPzcwwcd_Ii}^FEiuU{z)eswU zL(rR$Z_G%(|Gr(ifR;+gIhRSK%fX)>q}G3ij}-W6`Iqb_$M^Nd`5is-;dtQjuC9>% zh1aAbf6q$oOW-yJh*EcAbkQUK6RGw2#GRU&X2soWzAp*6JMqo6dCk7Q<`V9V*rKDD zk`SaHc{lE}x~L;?yCcHW-k|4AY+tBytSRpmk&^IhS9j>eEpTb}j~cjl%xMG+=IEr^ zB;0cpeViF1nq5svrmlrYwpKHOtKO6_7^k-~s1Lki=^>^_*N+1}ag=TN=8cUWDm^_D z844bN+=#e3X*gmY>zQoIGhuSdH|;aj^`HByY^>{}6~W;E!;r>Qee*S=tn7BnUgN_^ z`EJ*bK5<-i(!FG>T@N`hR6L?rAEm~20Kythh1xNr(neE3_w`E%1j0>#urv z&)-qD5X&%YrL^eunho3?9vYGyV=B-Iu*|31C>a#-yZebJ$44z;hg=7WI*ecG9qF@V z6Y2^ZD~uKeZ8r_sg}v}|^=EF6C7VL)&-_qNrEtbq7! a``355xza^F5LUH5QQ+q6?eqjgNd6bmN)93b literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/down.png b/e107_images/admin_images/down.png new file mode 100644 index 0000000000000000000000000000000000000000..8108212c0d1a18865bd045c9db138fbedd276365 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh3?wzC-F*zCSkfJR9T^zbpD<_bdI{uf1^9%x z0%-;Yr~m)|pE`Bw%a<=dfBrmr^ytl-H?Lf|a{m1J_wV1oeEIVJ{rgXzJSi(*Pz6*g zS>hT|5}cn_Ql40p%HWuipOmWLnVXoN8kCxtQdxL1)dr}@-P6S}L_#w5q^DRz00;9y z`R9!9>SL{UI93b4GCa0^?a}PKgO@!`KNJM<-kBT1tn4Jpe&)<{nGb5Wx%Jhr9$3nH eU2IO&hs(_A9n9WmPjz&I9O>!m=d#Wzp$Pz>o?n3g literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/downloads_16.png b/e107_images/admin_images/downloads_16.png new file mode 100644 index 0000000000000000000000000000000000000000..60a03f6136e8215c69192a3320d024a0f14b5506 GIT binary patch literal 616 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLlDU8X1u{y7oH~Q^|f@1-u<*cp?92_=mFlt{Fw1bPkyJe@y37+7>Oy{!>_14~= z+YCAu*1c*{bewmFXU`mi=$x9pXMf!6?a@tOVzX1LIwu!*jibE7qSJ8a3ngoxm6w6RaFPe_=ObP-fUaTiboFyt=akR{0CD75$p8QV literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/downloads_32.png b/e107_images/admin_images/downloads_32.png new file mode 100644 index 0000000000000000000000000000000000000000..10cfccd52f6f1e540bb64a0b5d3a18af7d306834 GIT binary patch literal 1558 zcmd^<`!^JL7{1Z79l0%ju_mMnc1L~ICJZ=S?rIxb zGo>({uQHKqm--K-8=M>VrhuaVm`)O?`Hz~=VUu;CO7yy3GAw+RD0udvfVpw5SUGS8 z5jdK0a5M`LerngRuq_$15@Aa`AeWBsQbF|+2v*j09f}RoKu**vSd*@Q{0fDQbEg$GqvIFU0kqs=)3L;D&&jFtYP{Rg{Wxj6UFeXB>`&8Y_K7m@$ zw36Ro(I`9|T;G=lsu7EoZS%%-FrvY}Ym#{YQt{GT0hlEVC}sQ$&sIZgApDsmvIZ{I zN_9dfQ>yvXyk#xFj<%V_t+*a!^=ucRcYo}x;njs}f5V($HJZ_3mj_mf{;7bU>0}Ca;aZVLH?4-J?AE33Sc}e1 zUVk(dd}rJ+ilupO@KE$vp9paAO(zmZ{7WVMY$>5cP%s4e3Yg+a9yd;yCCvOj0NY)v ztdghc9Z=aib0lrSCXJs}$*N_+${N)6Ek)4VwW1b!*+O)hWt_;X7!#Xb+{C0hvEg z43lP-Gq)zd;WLjd&sOcE!i&B|pB%QLW6P3As!8UyPD48vlzrd36u_z!{ul=3Q27FX ze>$j#3-X)A8kc2N?L0l(LU|4^Z0t!vNCCxod-{CK<^LGuBU0Hf{}bC|oX^DgM25t~ z5u-`SJ~%Rvq>qgtl1bhqVsHYbi)14|7z68M?`zc)BtD4_t7~J-%y0RgzO{{P;3SHQ zw>?}q_?6JwVXw@wD`@ogs1p2Qku=Jy*_;uUV|7RAg@++DLt+QcNi zNutmv>l=b5-?ojrmCK;0Wy^$rar;}GmhiK&`!!VqCb2r})uE4N{W7r2Im(zVzdgP) zuWQ4NsC(4nq0?c0-kV<)#*W_ab-(;m3$?PlH(ROuV5@l#cVPMZ+>Ivrb#9BQZl;VQ z&KlUPj2&hlu@^O)Oe?64voBiW@?2GXF$+J}jIdIJU%Y literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/edit_16.png b/e107_images/admin_images/edit_16.png new file mode 100644 index 0000000000000000000000000000000000000000..1055cae3f3b8f3e26a8f4edf744fa5fb0f110039 GIT binary patch literal 1089 zcmdT?`%l_;0Q?SHx43n4@t4lj*}5##DW)--y47Z*1s$DQ2h?esR^_3!&Jhr!tZGGp zuHai+tkqh>#24j@4^RNT$#G<$kGkVyKZSn9Ct7^gB zmWi&a@)CjhV=Ua>4wv$c%wn-nWp<1rn4P;?t$uLW_}T@Q{sH;CnFpkE^jv-@s-80f zhOQ%d4|QwyLtJ_<*dWc?4`H}h(xYh`nChMb3e!H=2}k1O4!eErHE18-OD@@9RZldH zSPP3ZrR>psp_9%xL=%TuWrn$p-LJ^ADwXPv5`LojEu^q=^3u=F{C@CByo`GJ>jItu6&-`go~o;?jJ%=%#+cg*5R8{ArhnJ3gWE$# zrDK390RxkZf?FxKy1=pnSeMpI9$B~*&$K3oHuKFtb`JF#jcj&(Y-XWK1rFD;m?GQC zUk8JCqn|%t_QT9n5HP&*@xNU_sT|$z&NZ9Otu^<~#&mU>!OF@?X0D(E*41i`N-K=f zi5(47fIsY{GCTQYk8PS%i9|MGKiUVtH@vN>ThF59bf{(r6m!1_9#;z2xHw;_+;Af< zv!F~T)>s0fdU6_mmo|?|cOQTaD6q!n-oW^FSWl(UGG%}MmPKk1tY*;jk5Qrzumw28OpZ6n-HC`o$ z1z$RYD6GJIyI?`u>dBU;R-!8X?Tgph&P_I2EkDTT2k`}2FTxlDi%xRjuLGGs(Xb&z zNodB+Pf4|lV!z0XrtsFRhy4r3xVy>6nJ%BT#JJF)&+a$-+SSt5XQ~X*`zc$V=kJUp zeE$S_jr=qco%9YzSm+^&C>C48rYW4FoiDq8_^x&Er5X_|EW5JKfp63=o$K%lkz)G4 zm>!I5t4T?2^9eZZUDwc8S4|_G&HKnBDYaII`0z|e)%+hZnVKMP&$%WLCe*xM}td0Nx literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/edit_32.png b/e107_images/admin_images/edit_32.png new file mode 100644 index 0000000000000000000000000000000000000000..f575ef9c888e22aeb05c6da07dcd476197c9832c GIT binary patch literal 1859 zcmd^9`&-g?82zeil}lSrr!p;PWvf=JMW$^PrY%u32bE>6d1K%O71X5`DI_&1#OqAS zJBF7eQ_57lprV4ZG%{4Yl!~I67o_mYXYTLVd7g95bACL}^S&qE&GoFFE=(7KAU&j` z18UtZ{^KT{b#-9TTG#C}tlc>~2zt_fYy)i)f^;A^mkVdA#G?@r$#rpYV2KH&a1ZuE z$2d@}0Lg2qSS%h{0ONCu5dnB0(CTX=I0e6<)PqMglBYaj<_oEwRdEulZiTlQd5(59 zeTh^HN+iJAt;q)YIFkCLK&-iyHc3HWK{>nW9%`GOo{l5`RVtFhetplCtc{F};n<6b z{=pgmQiAd=F{@zZslHvGN~LOTZ550FLi|vC?ME=5%c>Gv!HX~2+Gt)){=iDv?cq8RFO~NXX_+sxAw0!dk@RSpuz4-*SP5)T*^JXXqVzfQ7Hec z{MWT1Kg&7#qXotpj~o8ZeLp)lKRo;vNKJ>Dnz|;IS7!u4yj9uL@1FI7xh24pDX9t1 z=;`Hog^CPXp1XS|<)PZfudlx;)6v8X$f2fF8$A&=!Hk!Yx4X0J`qk>C6mm)qGiy3w zW732AQKlJ4-nz1~!tGj4Z2VO6@EI8U%_mbC*9C5++y*VA!B@@3b`2HBw|Iq={}EOV zz#N$6guxxpo#N&q_Vp=LucpE4NzgOBxZHX=?Yz!>?{8dp?O(jhJpy=F!W$c9A4P-8 zSOK`pUy5%96@p<+KdFX4FjnsW;d!X0CZ-snea$z3{VQ}3@n}M!*mZym01#5W9zc*5 z6pnI5ugCv0Ahdep?)6_W4L@@^93ApU_;qh02D0-D@xfRi@!nVr3ghh;MG#_sh9K=a zq=VfBn-1T_^UxtT&fBn#oWdBt#zvSf1)gZcn^{9EpUTEirJm=+f_qa!p^$pR3U0X< zx2-y2kMmo5(g+)6Tm0c$ef?k31lv~jA?^ezJ+@x3*hvf|YM9Bk!gtzhk5+5D&=1(*0&l;wh#-UW$O}aVl z3@R)cmu|IZx6#d|Zd){ac7o}81jikmQX8Jk+h-Q&dF}U{2aA&u_N&0FYqw5HnN8^` z{Nb(5)a}~_FTMOKyJSmJ8=X!sEtSjFJ7N-N^0Ds~?d+pzci%MxIYln~^HqLup!92D zHpcIJpMgRN_fB7`;4pvwqVaj7=9s)x9RuqUN z=<_41zYklQW5;q~Cnk>A|B3T%b7vefuG^omd9xPUr~uwb==R;d2XjQyDaNb&yTmtq zpKH-4A`Gv-7D%vA{Nu{K&P4qEp~HUIiJ^2) zu*Wdp`hl2We}B_Ag(e@3w-3h1SV!r-LnLe8$VZBZX6ca9<<6z=3x2dbfoo$r7r9rQ zm<+{t)u=~#q-cKeaXuy{$)Gbhsg!6QWNUjmLt16#nMNqe3(l*w*^^B1NRs=T2T^B@ zNIx>Re?({OHf%35-$7-)^^=j6B2fa8)&Lv-qGtoKvU0ZTnh+P8YPFx$VSYUOYuD?< zXtVaZ+vb~SJ6n!f>~%EgPOTgnAzmNWNNwf64`Kq zq?PBjmZOvPg-9eiPL4Iw<_(vaSjg}B*Eu;ktuJOkz`J)fYluSxA7`Bkie85@*TP6w uQ>LhmeOQ@ltCxf@`ZAQm_88j5f}o4TK_}0C5QVK@JA^#r>cBbeMfn#Y;AcMo literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/emoticons_16.png b/e107_images/admin_images/emoticons_16.png new file mode 100644 index 0000000000000000000000000000000000000000..d1f945951ddd1ffd3acc30ae3055d8cf1f2dab98 GIT binary patch literal 1149 zcmdT^`%jw%6#b?!2Llm_31v#=4^CttTb2mP7B?2igb5NLmLMo4?WP&XfbyueU4>R2 zBCirR${dQeER@G&u4Sx1p>)vlDv#N(g;L6+>slDHRzBLV?X~_H-sIks^W!=9TLM z5k6|DQCR9+kAp!^SVX6&oXi3?QEr6FIe>kCkiOy^JB;gAH2ojCS5f!#ovOC4%9}nP z>`4KurDL=VoX4coJC#3Erd1PQj+okPE2_-^cE?fI+vAH)4W~7tqr4Wsju2xr+>seciJnh8S}R5U$Le)s1)kUh1}5ag)jF0N4y& zP|qCv>32tlc4)vQd%Z*Qd`MR_sHvE=G}>x<|o=a==bIrgM&GIDNSjq=Z{da`FZXH;49ja`p>{Y;LFM}%n1-IeAEo4 zNB}Qz90-;4NAs=Qq%i!i0GWZS)~ZabVwCqjs$HlTkiq(@L%+JZj+WIDCs5C8kFL{M z22!*{(UsY-?i3@MJpk)2sE1rCrM;fmJPo#o4`DXg)|d$Z=dM5fz!NwrH8nZSL;uf% zgkG@~d$eE)ak1&;+FUf?@N(LCSz_FG8Ggre4_&5^3;rNB>{IVb-RA6GVKIB)Y`mJ~ zO`gU$Gfi!Tn30mb(CS)dCy(}~IezOHkKS3~RceYf1Zu)1H;0lRLHSy!jjs zzqMH=xcI#*B$BTT9JQS3rjILqe_B3$Dk}Bb7hOTo3YwVd8b^N=`JH&6%Vef1-tt-8 z_6{H03L=Dr=m;^3x$E~6yXr(fnFFWU<$@DQM&2pTlXn(XyqU8sQg78*H>dy1r(1Y* zfe+80>d^LPz2VLil$?Bf*lVzbxUdw%`=s!ERu1&1WG7t;zH$Bn>k#rx?P-f{7wWM9 NNr+F5>%Ev$@h>t-@IU|n literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/emoticons_32.png b/e107_images/admin_images/emoticons_32.png new file mode 100644 index 0000000000000000000000000000000000000000..0beb7a18f232d2487026d7990923682aac29901a GIT binary patch literal 1870 zcmd^=X;;$+9)cW z#sn%&WesHu6j9lXC`wpNf(uXuSsEpTC<0;0o?n^IG54H%pL5^dH}^_-*s)EfHl_%I zYzq210J~1~|7@(ko&nWV-Z~7v_Y3tykmmkFhSa(Bz9Td6WM)MA>CEhe3?kx}n2sl+ zgHjW|Ct`^SiMc-x5Dz1WJ`#RBG7#R2+MhC#a)N`RI#$&{W0C4RDV-BK7~sHt{o(g8 z+2t;gL;hocVOz;}sQCa)ZSC{wVMxi1lyMrCG7z~?uo52#%NwvwtgUIf5i%C! zB+s%?m!jYfs$T@9FF{ji^=Xnx*Xb?GOwJPDQ zAuJw%PBR!bNxTC?CdQh^%`jjkk;*}~7x;SG$=AA(L0wgrR<;B)&eKZ(A8jfGI?$Ma z#08XAD&Zik$zXM->in)Zi=ex2{c0Xox;jB=3xG8I35qadc!h=u3lQvBRKmO*cw+F5 z>w|eWT`i(rTZO6J)0l$~MF5XB0~o-2SNP}-Z+8B70J!e}mfU8RK{yAX+X`a)$P58* zmd2Z9IAacQCn>^N*4uw5zlfn^_g|lonmqcR|SR4wOMxd|=93J_ukW8Xru>}9g z1z__?WLhkV63gO}D2z1TB#S#rVQ>g1Vlf~`ik`uAixaGVe4F3~4@y?j;#H@Q#HRSi za6maa!eEot4F*g2eT7vb-RoW$@8^y(;;zrWZ{}Pd1Z`^-$hS~fvGIxbarN-?txlkL z!03IYkICBQTygw{S-izkDhhO3(FqhxeAZESLP&R54&O49L`?r}sJT2<_j*{ag)Po zA;WV$c&%4fGX^VeByy~#!ARSLOgVoZOYpD1BZ^H4{!0OxGhY@oFRBZpM4=%7P<2?7 zh9G)KCN?Z$z5YK7iI5xZMi5kgP=H@#&KO=%WZsy1;fbAhiC*A~4gJ4mYvFv`jJM@k zO%{M;&B`ZVx4z%RGs|}Un;W0*(J&*T*EU*C5nRy)HNM9L(aZI$?BYvhWygx!W?kcK zGhI$^NOLFgk1rY(P>vsK^~r)FJ3pr!)RUJqv7>{xk55ScFu$mKn>y9Q{}I+}JcVx2 zWLKP=oLp?z3r4a;ON*V z=?Jj-$szL`Q``0pO;6mngBzVae?#fd7YM#m&{r)s{iC`uji-|OS~iMLR`#YhT3cES z)s>gyEbV)YBL9*n5IuXSxB6TrjT$mOzS-Y;%0pUr9aDDdo#Wf>q)eP?*zx4#1WvnS z>s-eT-KJcn)2?N7iRXw{P0LQ4Vc*pQ_pB`Wc=BVLpN_0BU*P8i5t#hqvxC&jafov* zZl9|wlK(~;Qqi0z%3+!ZXE*Q~C)6mBfExWrp4*mpmIpIh?8O4(kO_e;zk?TPP>s}f zm!mg3{aT`LAYeN0*|E?3)c!Wkwx6>CA6nN=+lJfiGwD%YbaYI1xlQ?!;-ba4DWH4e ze4**VYjfd-%8OpsF4irriYF$RGujzXwd*r#@l$ly=ccmpAA+ejJ@TZsd3h)EC|K57 z=+URo4Ct3GXf!=^Y2{U9&AoUf=7|5EvAVc%*H20_a57&*uMuLe?WLiS-$}h(&*#wt zLfukX#cg+^feW`Q>lgG$U$non~MG=#u$ZG%B~dfrF{NYsagDESs?Mp(4Zi@Pmr0E>X0Xc$=trZ zt)#48T~s%HG$M-h&DO6wsU~09(d{TVf3Rl6czH~K(!Q$z;OL*pNtwm~MG<;w$QB$D Y)tdgGZ`;tW^+QC00>c8D{BZ?;0~nfabN~PV literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/extended_16.png b/e107_images/admin_images/extended_16.png new file mode 100644 index 0000000000000000000000000000000000000000..ffe37a3e73d52a91dba601b522e45a7523127994 GIT binary patch literal 1066 zcmdT?`%jt&6#b$!HAdrNmu7a!GEEqHY(1!6!u zjDMAlR^}VHBod9>W+HQSB8P7oH;T3YZIQ|3zu8NaN+pNGW$QWcI~VxoVbE)1PBFEM zx}BXJ`ZERyfH@tpv$O5i+neB~&%H{+ zU#2Y)f}s#`9>tv)d@w=<4_-sNpewpYaND%&-q@XE%nV~{Y**NJl73vT_XzpZBI!m) zKfm>tHMBdpX0=*Jr}R(kWR*qj5BSTC$Sza2!6UL-#(9Fl@VoHbC@Zxyb#;88uIWB& zk-eZ5&^yus{(lB&`E8n(9mlNSx91AHVJ%Ue%X4j$-GPJs&h;{b!8karR2YRMFm5S z8d7Dg?FycC*ZDnWbJZLvV*SIf36Vz;5fHh^$oW4SpjIATAF-Z9$VL;8Wj6?S3h+1p zhAsO6_c6S*pa_S+6=16>Ot^0%qAhq940Qroh(3JyRQACzvyM?#lp;T^0m%7>*>EP#i#e$249hbOf>)U6muBYe?0>j0tRVqXM9wsyJC}Ipd3D N2H@GbS;7oV!@okzrxXAH literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/extended_32.png b/e107_images/admin_images/extended_32.png new file mode 100644 index 0000000000000000000000000000000000000000..aae3470ab0d84918efaadb1ba07e3399082eff9e GIT binary patch literal 1812 zcmd^9|2Nx*0{x)YPUk#UU$*wW^U$&NM0>PargmPXm@n0ou+V9@WR*~~MKuUbg`zS< zsIsa076~b#GR+X*S|MqQQlUjE5=|wK9*d+I|W4(-{#Xy`>K0JL)5O^Gr9Fad&t!hD~9stU=2D|Ax%n!Hko zI~;jD=cXT!0qFG_nxLWfLk>7o)m~Y^sfN~~9Qui#>D4)`fu7f^U2Xw>DxFf$S<$oD zJyh;5SP-~Np;DL-OB?-j$MmVP$!f_wiMexNv0Y^=y9~P7s7hMRVkw z!Nvy#?=kCJy9G~+GbTekus(qyVcj`S5nUm>!aB8D{r4OzXX+2%*6nQqzKJ={O(}Gf=;&QpiaVOc8$>Z*ymCYrB>P1jFwfnIn;WyZf zY7|t0;Lb;>R2mZ-zwiD&OjQghrs>~Tc>L_cTVaikj#dcofYL7d0AqY(fGuW3vfV*h z&z**pTeQR}C67q?=pYG)%0q7sHeSGWWZ;wf@>$?b$V5}Rz;HMEzjEh@JM$>`P9a@^2~# zPkrZecQ#N97!T9%FQ3Iv(l866`Fv4CF{@Og*(q(Sic3j_UqL3sr;L|kA)hT)oQ^$vV-#wSak)SHlfhtE zo}lRsphCoFm8agwbm%UNuB@!=`@2o8T*Fe*-?riw1bo@DY<6z8@dK@Aek^Yqxz}Oi z_=`ROFana{u+Y8u{|q2hv)^&=C%#VhjYtl?g-K39C7}Um)UDspb^$j~(P%gt6_u9A zL;nB(#zg@>(6I0M*R+=a7o=_P96ZF{j^qbjh=M%jh0{dv8ftv>nd=iyP$(wKbUrKl zh<$TsnYBG;W#x#Z?4~daqSb9&(+=PH!PZ{-d#A!5F?}fVKRUOd0V3(&Ut*l|-$!p+ zb7iiTF8O!mgWhuaoqq+J`ZbrIxN*F61aZ-I0tzqwBGf|fQCnt0>F03r6d?GDck?mM z3$mLUbb|0*8{YP+jkR^l5s5>Y6JFBy2myQWIhQ;ZxX;e)#lhs|B0F^mxJPyOr2}!EGm`mcBYdOkd`*`i_JlJjbk5`k&GG(SY ztgy)|D{)PA@Y7=RIhE&K-1W@sSw7=792K6;#>3JPp0`l?LWbAzhOi{C{!oUcW&9=V z?Z7`Hoa&Bg@yHRZB{Ms3jG^!LPjA26um3aF%JfU$&a|Kj2M2RM(wPSd{;mNwp7-m% zE1utSIC=tUTbeAxUZ-9)GD|yrjQgXDzM9w2T1AfhC(Xj5#v=SNgi_mwaJ0N^bo7F! zcS|ld*Wy4-+(Xy4=1ZC%5hCQviJRM5wa=MsHuKR!4&Ied-wd`gH4wk)^rv>VSE7ggdyieTO-bINWsB4D601#Ds-kDIPiEnx9C@Vt?!gom27&= zY~ILtp}Q!+-CTe2HtQ)Z1ryUqfW}ZYzV{}VJ_D+~>27NNW8B_+fdF5a592&C>%Wzs BTg?Cf literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/failedlogin_16.png b/e107_images/admin_images/failedlogin_16.png new file mode 100644 index 0000000000000000000000000000000000000000..98c3e235d4d68947f6fdfcad274157d5759e5b5f GIT binary patch literal 771 zcmV+e1N{7nP)I@VsA@JRwE-RczAgA_4S;bnodqvdU}m` zc!y$QX<=b!TwGyPR99wZZ((6>Gc!DVe0=`?{@K~sNl8zCf0MAVyXEESetwEvTw_;P zUT$u9;Nax1ue4xbZ6zfu#l^*dfPisvf`NgQ*Vo_WzM^z`=2%h2@n@zK%Ly}ik}xWvoL(f9ZBrKP)sgp^@nVc*~1Yin)m z>+aXr+{eev%*@l`;^@}a-?z8K#>UILyT`V+$V5a*(9qDZu&{c1e(db;@9*;d{{Qdq z^W@~}-{0rT%GScd(O+L@l9G|HudixqZs_Ri_xJkl?)0apuTxW4m6etI`}^PD;Earn zWo2h)XKG|*XV}=-C5c0+00001bW%=J06^y0W&i*H32;bRa{vGy!2kdr!2!c*R8s%| z0E9_IK~yM_V_`r8EFfYbBM_`R+ZF{CnDOJL1|y@9*N^#(2_S)4MR)Ak*HTJ>M_x%<4{_j&*Jx%a#LRKkfJ z*gaSTL3Tt(;SxQ%>z{r7RSyG$cP4qnD=R!c96>n4M_;RW;ko?_B2x;I@-hpE8TkYx z{Cpms5D=Y{kwr)(WSlR&G(z|iK`_~;;*ull70`Sum8yoRHE^LQwf3&t?SAwEIt`$Z z%Ykti?uT-8pin6II^gM{keCP#`oMs!t))t#P%?gsw=qx84-bPT2UN#~h91gfGU&jG zlqOeK()_~nttr{)a{!0MJ<%r+2*GKiUdwwaIrDoZ6&gM*t*SAU;Z+?hSnjFKKaM(` zi;Ii$w(ksUU|n3)*dv&&|+2_j58dxG~ zi5N~LzN(3V0;s6LtX84O0Iom$#9|5j83?uSYOV)p=B!-}l*V$Bj&;NG+ipjBkXohM zP^R^99~h=*V3k*2U$0WB>gwvR7R9dfOMo2;JtwSIn|4&MwStJxmmADb6=XCTRW{)B z1*64r^s++Un4`acz;3tq664XSZnb6tmUYl~T-?lJ77^Xkk zZAhh3vI1D17if5nu-hUIZ706ddAE3;n@LrHLCBjY9}$o~1XdVV?VJ!2+8^9!lB=Xo zfm>1Vmr!Jv_Zkd_-rKR;raHH>1?Y!l&*0@k2#IvPMd_ZGcQjY#c1(k|?8sxYbAgvU zJw1b>=-|1d@aS_G3>R|PEONDc^jni@PAKVQ=Y9d`?aj?iHx&yDd0WqnYsF#1^$|?k z&8c-@>A*FRi=x{Wiv|9jeS6aaJk@+$keHD4pYuN`m`j zCSJ@XrTXq76+a1G*GlghF`sC%N}5t|k;BLbclKZN#vEJqtFHcKyfK)vtYkeAMC>(< z?eSjMijsCm78Z40h{KX?>V|;;@l(SO2Wj{qbaHl@QsmC}$0ncsb>ZNO{iN?j5iyV# zk{QJtx0>q?kVr;c<5$G9<`C~q3;TP@H#ueJQub45Z~F;K`Yv_MO1mD$TW-|}eY-MG z#%HByKIY}?O|tHM@kQ%C`V}9)w`k_^hPn4d)RhZ!^i=jpmjBwI=_3i2P?1J#)<@;W zVO)cj^s8~%rGsH#3x9649u80v#%+@$se10ZC3Pj|kP_qNhlH>SIg$f8Oi$8CbYudK I9g$x8H&jtF&;S4c literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/fileinspector_32.png b/e107_images/admin_images/fileinspector_32.png new file mode 100644 index 0000000000000000000000000000000000000000..0b49acbe103b03597d5d6643a14c2423aa8a1d53 GIT binary patch literal 1997 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 literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/filemanager_32.png b/e107_images/admin_images/filemanager_32.png new file mode 100644 index 0000000000000000000000000000000000000000..9b4e4e8a906a13e2571f6aaeb37b01fefc83cc02 GIT binary patch literal 1953 zcmd^=v6JpaJ+JTbO5KN1wbR74PjVDXdb zrS07RQ3^Y@-8470eLHqijjfFlq^wh4E_Mk)b|AJ^Br}Y5a(PV*({V{DDbv%_QvBiI z;9D40gf^3!nl`M{Fwt6n3x6z{@>(DBE4Zu;SUOirGz4K}WhkyaSuLwffR> zE5~q)Z8;My3!F3*MQK5S5`f;`UZ^zxEASV|lwWVOFO(Q>uw7s!QX~?^MJj}Zgupg& zp8~HgFRuU}{gD%852zXlTk!RlSgQHfJA=(2d63jY%|)pou)8P+R;wXP4+PKOHX!`r zAjmi-NFqV2>&B`Ra9?A156Xyug6~C=EvUTO(a{B*w$|3R*r;f1!4+1r#dGc(aps&R z4_Hr*a=Xdr^DzvE@gVe;IyBm_*=)`OC7|tt)j_BlviWM*dJ9|5TpL;2j5zpnvr0yuO$(`I3T$D5zs;ytO) zE|lW1(PX;DZGlC-Epa@ce3b3NzPEF&;#rIJ*Tcgjkf{X8YT-2dO`byq=|Fpk-Qxc} z;lpF-3j(%ZSw$UIqO+WjKnZ~ng#ZJAMFdtMF@0OXClFb0k2Mv|^D!ALOeFXlOmc^45p-2RC#0?h0K?0nq2y{7OotkTCVS=^ zN0q-=2N_m>c<gddN$GJ}rxVNDMzh0-^Mfv(in&T& z1IB+462g_UzS23P9^Slg`L))S(rX?)UaazKjWt$2Pu_RTgFneTC;Qv2LdzQS#Owb4 z?^P&yPNg$V{a>Q9n+LA=b~(M+y}Q19F7_Xy8Le8|yZGD^%l>%3? zqyCMADx%5lnRvZh+{j_#`TNsL4l;CV5}hCP_x}3d%VIs{SxGsOC`zt4QEGYZoK~{z ze3G#s?s0(6jqCS+h@3yq%D)+jk^?JBV=bEmvMOkQZp4TowO!pv+PA+ZOZ(VAADH+I zrCBk{=pEL!c0A$3RmnZkJ&9@=5!U!RI1 zjI})uCE}v`usyjxPIK3FkDoq0bRecylB-a)>G16HsD)Z0Gd4#3t3c`bRQIC7)IXic zWO`z&BO2ecdZFn=ghmwDgfL@53RUfx`V7~!G|z)FGADiKAF0RF*5oz*cZN0%pB*%7 z92#A?ai3ZIbg+l&>Dle*(AA-4;5)c)#csT)Y3Db7#i8EOnRWch)i=ipwQe#*K7T?X z<4{VTTS>aSG7TEk6x`%dvov*m${oMkxAn$lk9cAy3>`On*T1-OL2kM1)}y;vb=c8Y zmBtqh3>fYnCCRTC))py_A%?bLt>Z(H=ZsZ|_p8D@A55Jx5m3cOn$H@uOdE_wb;_t@ zTlJqJD^jkis@#in?ROnXUDsnG8AVSt&OSK0hY?0d)eei8eX}>uGWeo{Q(fNGaH7#` zm&wc#Rg%+5$IF+8$&0_};41pHwrS1E6&mhL9^d(VW8bdBIYH4*3Wr%nkTP&1IU^wS zw>N_6#ZNq9oDS~oXutHQPmRVop_|ns-Q{$}p@gthT&6`|d3Q*$>+trL5DPOK)6yTD G!~X?`QrMCJ literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/forums_16.png b/e107_images/admin_images/forums_16.png new file mode 100644 index 0000000000000000000000000000000000000000..8777fd92cc77e048fa1bc8609722ab99c211bb87 GIT binary patch literal 1242 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 V>CVVhpR?Z%LHl8R|MbD<{|98uElvOc literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/frontpage_32.png b/e107_images/admin_images/frontpage_32.png new file mode 100644 index 0000000000000000000000000000000000000000..c01b078b6d497fc878849ab09f07d174d3c27b62 GIT binary patch literal 1942 zcmd^9`#aQ$9{#eXET`vaPfn}$VLGSPPBTogxs(!-`)v>rZI~2k5`~A=AkkoLRU*7kwr@O-rtvy-@g6wc| zv?FXe`hV2?ZcFVdDa#FFCKReyt7sKL)DyR)u}Yq)XbWfk3a3Ls<^nQZ5D=QFwBP}YE%0sFpmAI zQmKSO;RZlSeQz9vPR_o6gAQu|pO&GME&2t6b@UC-r!{lMP+NI_WCg0&5JZfc;>pV^ z9*LC@SF-l@?c2n9a6Ch8Y^d*?gux|vHTgN5l-SLKB^emGW?~`)J+pAH6J#owkO6BN z-poQ$z4T`C?U7HDNl8iRrES<~<%iE8*nl}De3mN)m*Lqv@th27PuXS^(z9A5*{y)L z%*LCh%&x$D0o-napuBG%mm%+7PR?U__Pv6h2~{X{Gn);yJwrrNJfU>e&DF&%Q^i|_ zvKmQhnZogoYHAJi_0dcL3=B`u>6OmzzT#E*D1?ZDFLV4&Hk&Qq1Xm}ADG`hbfVlv- z(^BzfnZ_2~>6K$yIk|ZQK&k{Tmph?=MG3fg2ltFGOa1~%W(J8Ay)Oc=h6a6oeJmF1 zP>#=I!$Mp0f z#MDU7KY`t$s*$Zev*1jkMABvDHSNvM>S>QB>YlSgg9t6%3`!NJ=@oZM0-^DRj1gH1 zIr(S2RRLX!J#6mi`#LCsX_F}A2$dTf8v(%~<9wJ9!PVdA;`^X~1!OYW`Z^^2SrJjL zI^p2gvk2pp)9LSkc=^HQ8+Ts3XdW0C2zV&>%T*n=?lvN=q&<_GUhGMXzcDKU{_;Ap zL`5o67IrIWucS7vDbq9a$E_@~xS+dhm)&U>2YcHLn%vI5uCQ&fe}0|%T*ChXrClpy z%fJ;tC{0$wl;e!bM1R4;!U6!Wo_Y`wL=A~0xO;EK|7RfH>)U_c`U$;Qd;eH((#6=g z3)hK=O&BSJh<1v)5KbfzFN7sTvxrt(=b__dXX9g$6Z*viIi%x*R^3Hyi}#O5&z#Uy z{B&!_8Ag-$xpR|m_8b3Eu*P5aJ)cL_-?p7Jt`uF3ex~4Lp;5QWA|ge5^jh5?80fa* zj&?NQ(2V#0G6_2PO`Mj07md2!)_6HDg`ursS3#?&n5AZVtY67g|7yV09Mu22hWI2i zFS&fhQU?{RJv>k*_AF9MX*TI>BTZKu@Bep974ih_rlOU#m)-TJkr^JmM|wjBMdQ+| zJ2i3fh%frZc{m<8wy*6?R~P#Dka?8o_>X$8R~Hwj$e2qX_=kepuYb!p`~25=SIZw2 zMY!Sqp|J4s#CaPnyOa=;L{e0~F7&uhk0!sq!m_=YoE({)tX#+mz{H`?xc=t6jUvU0 z#{3?f4aBCATjjU!Q*#O8SccZ$%r8&H$O9{`G)AwXrYX8fNm%NEUm9Y}uCw!j#qt;^GB~f{+6+sdo%Qg9(vM>&)KBAJl|}H=33G@jM|z=($o6H zDdS^-bYq{uIG&aGWn7gcKf=BR&0Fv(T_Wx}Iv-o?{BTO4*M7L8qg7(TTbmFm9U4*& zURs-O9#)(RwC&BHw$V*PT25J52(!DobhL(hEiLNws>a7l-TebNJDVo+=jA9)x^{YN z@jk7RYJD?pd~B|dw@Z1zB`I^5{CGL_05w&=2j6gHHx9SJ=idrIxt8o9{H_SAd|F*) zcrN8pK{cs5zqq(K5T_I1cF?(W|A;_DXa(`(0)_B@mdV~hfOY5jWG95ZJ(VQeo~(}Rm&@{=|}Z->ceC~ z_hLz1-ND^Oj*wuOnHswEo}K#>i?!kJH9IpS?W)CCTd$T~!5mVKzEoezvj0$fa`54& z9qJeiCXz6UsF~_?35V3egC7=7jN7oSqe8BmBYU-FX{k=MvaJCjPWJA0Pi%in{VxRT Btylm6 literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/images_16.png b/e107_images/admin_images/images_16.png new file mode 100644 index 0000000000000000000000000000000000000000..d6cfc4061adf7d3fcf27a94611a5a63bf8387bb3 GIT binary patch literal 968 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLlJr4cI_s=X1n$h63L+tT>|a`M4>O$Qxx zj`>Qjoipw5t~AMc3@>)aPAHH6|G4HQ4H9b4UMs28RD1JEu>d{^0tJ zjmx^5<}JLsf9?Nw6JH;U`+R3kS6b}9C;IpH`|g_1`2A|x)3q@n({9hH@cVxz=*NMm zj~_mCCnY^Twdnt=zS1D$&2@(VKla7++*m%P|KFK}RWmw@=I`I6qFI!cvvtjyvkJUB z7ES*0<;$Z-j}CMiec0~u>uA`%Wy?Okf3H7D^4CuHkB1X3ADDA~+uTo|K7H98a&66& zo%8J0&n^3X+Ww%I_uad9k8j;tlN|N`eB{mJ$A6tmfAQi)ewgm&O`ES@zkZ;@VtKgl zj~_qIY$^GDD)!y!?3M*O|8FG!zYuz5b^MksTj$N4n-mn35*qqsOIVAe3cc6B$evvi)Tq8a>QWZRN6Vp?JQWH}u3s0un02N*Hba4#P2u_}{ zbdfE$q`{e_S*QB7CP?2n&5&~Av^A%36Kk4k=ci@oF9^?%(@@l96PqC_{y6Q)L;1X? z$t$(k#WdFHpEJ-a=qO8>p2EZ#^2Gdg_LhhrsaifW*D#9+e3_zUG~di|dgKW;yGo$| zhs(EO_nwd5X&aQVj4_%wKtWf-v|D*i;K`+$`mWuK8Va+GFP=8P9kzDY@?KZAlw60F z?2gze#Y;KMGjf=3$j(WfyIH8|cl7IBs}=O-PCa39`ofx+C97E;i5mo%JbnC-Y4ZZ6 f%~{qFiaZR{erHZEtt>ta^dW<%tDnm{r-UW|s^dP~ literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/images_32.png b/e107_images/admin_images/images_32.png new file mode 100644 index 0000000000000000000000000000000000000000..dea04363b42c885b893470ffbc0cc803573d1064 GIT binary patch literal 1822 zcmd^9`#aNn9RDIu9X*{+7mm~AX>E51Emf!nM?%RE)t2R>Kzpdg^c5Ba%=mjz?09pL%hn*-o5=^ zQIS_QXki(zG?>ruF?IB~SI6O_(z0XKI$*9)J(4&(JA37q7%)g*LZQ@+1kgz=wKOUU zLxz|mX8D$@tE)a{s778{){#>$cp*bWLu5~HAfpHbf=r70?X-+q4reIc>@Gb7ybO9- z5eohe12dICLSAklig3q3r|%K`w*#CXgHD{7s`2grEALSP3cR5y*Vn&5(3F%Gkm&^1)oaKVaS8_0)FBXeI7qv~&R;Q^oKR0pNZi3xhDAKYM-1i)a47>9=h!rDvPoXCJs4E*Bs4-`XlZyxV@tN}g-)n?nW+z%~G zbX&mT%Eg|qYrS_<;=#tltkA$qH}x6Gv8r0n@$qpMr=Yc|xw|T1s4@Hz?;)6}DdpGQ zXBm~GTJwrd@*<2L(0(kBMJzOv$9j9m-b&V`lvfRpmF)*R#A3Nzu6TmI9pfp+bfkAb{H?cFW`1!rBzr6aoK-o+J%J(Z$tFOa`m)wmbea^gn z<|$;NyIfsGMZV3x{v`|=z~P!WzkHHVl+7L+tymx?f_B_kj`i$a!>kL|&T*38GHmxPe)7-4>zVB001oRYM6x} z4Tw&_dThr3Ga!$(tp=Mr@dMr7hwc#>OutHrrb6hT$N(zLDV!2QB~U3r@lhRAD+to$ zIAPF4^UlC8?$Bu{>bJuh+J7VLmJqn;JKfj4#bEm4$)q^lZBL~Q=faofjQb>7OnyRTs}?g~hkU#;R}1X*9iF!rkZT zcDmC)2j3G4Od72i)}PPOs){E6{NN>YuA8#3$L+Cl5gO5LV7tkE%@DNxR??1$!qXeUr-ZU?RVk^mLYR)ZIW6b7LG(9pWPjLnane4$ zjoGVO!fVSvjJV?>3l3E!g8~-nKLFueg-_10xp<${B%dQMmGseuBXJ4+PSh^J~bH$InxeiiLP1D|^zYzZXUJ zsoU)5?)%fpmKN)yD*?uCBRRRB2FXX+^M}hl{4_m zf_zA0SN*LpPZWyMb}FVO%hn@zch-$y3X9pC5@VrVSYb7Zy5b}_zvtk)y}ZB=d!S{} zjY5W}pAY8&cVG(YJF|YV{kwOi1%{VDD`(WljZDF-LnLUsNU5UT7Uxl~M literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/installed.png b/e107_images/admin_images/installed.png new file mode 100644 index 0000000000000000000000000000000000000000..a4e49e248a59c4187b4f63f20d43e08652df2b7e GIT binary patch literal 392 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V6Od#Ih#E^zNd?0h=!@^eT_^-@~d^RPhqwvos zrq%KBa;twwKR@+0EL%4DkL>YfukG&LW0hTFC&$10?%d*?=aw6My(gW#&phmd3wyOi z$kjT1C6C^X!5n+8JJ?)2IPdi?jjm<6Q-k)(Cpd|J`tU^L*(vFIyY)(IL#J`tzI3`5 zwLCZRuR+gr?z7V?#mpGi#p=v^kq~>o`1|xp1xMMcF16a&{AB)}IZI&ChPkz`+p_&X e0qyxbe|ddCPq(%VSA9Lus|=p5elF{r5}E+k@06eb literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/language_16.png b/e107_images/admin_images/language_16.png new file mode 100644 index 0000000000000000000000000000000000000000..982d10b99afa39294620d2ae192e56cb0c5e96e4 GIT binary patch literal 1107 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLlt+4`x^*Y+5U5J-sa+VZwpi{eDaTt?MO$@lBQPw#c^q!JFZ7$ruOVP8ItJT^ZcQX z*}Vt%=9ri_&+RKb(;=1mr>l498A%!@&hvAeRo8!vb?+%BA0zA~=* zTSn2}vO4?LS043ump%Az)bQrV&!5-tz3*FcV7Hv|wQH}h=orkq`Tx_WZ(qND4X@n& z)y*yPP}0e|rfp*KbJb0z2M2G`GWF?r{m0MuuZd~t-MSx+4pXoHUr}DsIloVPv*oS3 zx3Ay7sZ+GduW;A81M6G&|J#1>dSu1=;!PiVZq6%N{k|%x>gVsDX8UbczgrX7`m$r% zg7jxO4_|%%@aR$Q?8c-yFCRVs=G5x7OHuR0>;LC2T$Ag_JkKukgp;eJyZW)Hxao5D z8{zr?Rg{aTUti_mn!4!O^5&-Bg=H__e%Ib_mb>Kje;rNdR=@VsKioQk^Orq&_y7M# zDVcq?t_6qxyH|Mcu#DHty7RxI^USReIcIAvFFG!~{eQWh$=ZAWFJHbHx+Hn7h0AOQ zhp!($IxNe3*g5;u@)a{TEV}sme^~jZxi+?Uxwuc5IRE41oNr}iy3o1t%>Q`}jd^`# zy|br8*KWU6+#b++F|_Y)+pMk^Z(qxnAAh8*5iB^SC6 zcJ};VvQRYlg<039S2u4~u6w!o`u~Gjg}XLxdg~W{T3+Rzra{et|8(~|NsAg`75msU>e#{666;Q zC#5QQ<|d}62BjvZR2H60wE-%6>*?YcqA@Y~1|N%JtM=Y4+ngDgJ63qT*LmbBcH`Z{ z%~Pda6|~i(^hy`2IVmXB{A1f2YMk_d=~40P<7IkVRk8*e*5 zOW@3{i6I9T%$+o2o8PJ(>uRfK)cbBrW@@grF|OwKmY;l~jQ8P*J(@f`Y~8s|wToWax8&t;ucLK6T28I1V= literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/language_32.png b/e107_images/admin_images/language_32.png new file mode 100644 index 0000000000000000000000000000000000000000..bf0badeb064304995630a5cfebad84d359429923 GIT binary patch literal 1911 zcmd^-htoC*H}y?f^m=0YT6KtUc!H9#Q|Z zl-OQkmnvs(ai+M>IjJ;I|h`r?aPoQFj zS89Z@_iZtwO}U19+$RvGrKOr@fb5;)+KJ%#k&|_k;C6Tz?|X+|1^AJln_z8Md_?z2 zGicnWC=!XnA~P&%h}W_=78e(f(ltcqEGqeP&*hYrots#_;2u2=u-QmL_mA*kO|Fp` zwqJq@v~m0!f)JSZ&I(HPS;i}&**Srr=WrxSJHTZ3=1l}n9u%>5D&PFlD~VTj%AuDI0@j!by=ODP(nF!EOmQ(cW4=O3&ELGu;O?F#n4q|s)`_egDK@Lk{Em-}o*TYg#zBJUxvH-iZ6Sra}YDK~(0ixGId#*NYb%Tkl#X zeZxKfCn6zA2VXSF=TCKYfx0>%Xx9rIl!;JLj5sUU=nIT3mv>(b8GG;{{QjHnH~OV^ zXX0`~7RScSLrI)J+zHW@3>~B9qd3 za)QHa!y^0o1}?R@+xPsIUpQ1z@K?#Zq4gc$Q~>zL%-5ZrR@_`f1U$HjTh~wr0Kh3m zB@na^qF!~t?bZKhLAVV`&Ap#cqT1e|;sU&>p`^QH$jU3ggN(x7CQ-;&$t17vKtA~# z1i`*yF;;lfB+t!*Vg{AIen*v*-g$y#7;?NY&dA%?SY)jxtdd_CSZhWZ-l5Uq`tX*Y zT5Gi5|F=q>MFWl;3!gtjrR$2uYcm~^qhqCx!)?v251L`TqlT1n9@*59fpq%`1k2H4 z_K(FT&IfPCBYQh)+0zXnBIFN*e47hnH)7|k%QCBzAmYyTTVw^5BC5VTXZ(SyjkHu%6Wul| z5WWin3^AdX|Nyeh}S~NmOOslD} z@wwD{gA_5H*^_MIchH*jg~+NYV87Fi)? zRgdYmr!o{;oI-1uXdA95DcfiM5k_m7%f;G_AeY?I{M#05IvHWM$rDjU0Rc8PHt~4B z8te%}bS)!e@ z$vu+yUKFk7ZL)$d_I*zm0wp}A0WPkg9#gA)Nm?qM_fUR;&wWXW%v}MxMQDz2e@g1a z#3F+R-X?vnZ_pgEioTv39Qq`<-h68Toh@e!Qz)+la%<#ghpzYqdpfM}b!h93YqDu4O52ZQW$ya+|9@xaNta14K7aU}+i}!`dW+3tgJsLT_wPS0-hHpQbiYCUz3U(TH!ipombvZA|NlXS+m`NoG-KhpJGY)r zpMJh_>Zy;Pe*FLcUo}_I6By{lB|(0{KrWpD!~5>_bwKMSOI#yLg7ec#$`gxH85~pc zlTsBta}(23gHjVyDhp4h+5i>J^K@|x(U_R5;l#`%pcQdkJoJFCrx%NBL+|+`r&-km zmOs3BNrGf>z@1E z72(wuRcUuU`uyk$rQK8159!DpeaSX)+lqP43=B)AMWp$>Sh*hPQU*^~KbLh*2~7Zn Cp~-Rp literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/leave_32.png b/e107_images/admin_images/leave_32.png new file mode 100644 index 0000000000000000000000000000000000000000..9b72cd122831fc73f79db26d617d0bfcae068838 GIT binary patch literal 1615 zcmd^9`!~}I0RNUsxmR=y$KyIu3Uyd0ZZD7Kpu#dF@;1`FNQo=ub&j}tc=S+tOdcn1 zWp$TVmNblcPHfoBZ0xIpkHhAH`889a@g0aJl~1+ggm1n3OYVpE1*?>)v?sVNnL;I# zR<_MtOY1!5S}T=E1fWDow0$wf2?2teLI!CAIN~LOJO>i}T>_YL1|D)-`5(4TYd3cgl zhL@WEf!DEo)zeQdtDMThDy{E~nZ*r#Bq_GGHYFf`9bAVus-AukQ7O#x?)6b9M*k4) zEq1kkgb9kIY_7z;l$Y`Z$5>_?d)BNjuORAW(oIpv06m~Zg=+jkq6*hUV$fB4pVl&awjhX4xKWysKf0)dFg(d1Of84L zS^6!!mrN5n(=8)GkT6V!zKP; z=;%G)l**-B@^w%o0fiePk=y-Y=gg^_H#@aGngfeS_aEa*Ur&4*V&?WKm~635_<(Wb zH_N0^*BVuG8`&bZ&pMSjxFj=AAbg%vY|3Q#k$Ej2v;-8G#eCo1K?vQ44FEfUWM6N@ zf5Z6y3V_&9H{bpVgJieBWJF?2a%#kFB;XRA7>P9XjE{&#`XVEu(~^deXSV|z@`Sng zISxl{`T$V)RTuT9L91>JvVohP$NBym=gKQ_ymh8@6LNW_rr@^=*cCqD;?^QjgdLQ0Bf86k#vFHanFE4K9~og4VI37H<0U=joUv{h!tX0My!a066 zyb2j!uDhgj&uaoPVBY)a;Gx;%lFN(waff$5)K^)k`TJ%22SQ(o?__9Q&#rd1Nhw>S zWY(d+xQr}Xe$a$KV7|~`0pn?0L)gr9)DGJVCmSYCj87J7dS+t=a>QXm$ zIfIp?9gICtn-$qWx7#Z#YpSaHiUHjt{pJwj8w7oi9n)R3_H)|rt@RKzN026+JIZ$0 zdDi5h<*V6v&0XrDW%Fc064WOh*`h2FIaZ$u&Z_hLYQe}hY~6LJt0U31srQ)8C`5M% z1E&T%>`5&_blC9k>W5Y9KJ%ay9wqfUaiFA!|D@>{0YE{oay(kuW3t^m;OXWKYjq9J F`4`o#09F71 literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/links_16.png b/e107_images/admin_images/links_16.png new file mode 100644 index 0000000000000000000000000000000000000000..90454faa4eb96882d2ec4c3366f36b91fa68f818 GIT binary patch literal 1034 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLlkDKOrHZva<5`@82Ije3&|Q>fgVAQ&UrA)YbX;`2M$)Y}l}&wzgJMQqrgIUt(h7 zrAwD8Dk?HFGyf|oR99CoUAiExWq9Zne}VCnx_G6;1c_nj0I(%D^xo zI$F5!-y~O$|B+tj&YipR>i>NP2BXwHKfZt0)mAyqz+@fW*5BVB5gS`D@6`Sq|5vTv zdfm`yKfmBCG2#DL&Sty1{QvePo>$<(g9nC&hX48bm-qLrIsZSUWYx~ObC?}hIXgSg zIQl-p8|W!$c=823{U9Nk>*H%!{L0AKNWJ`DTlZ-vC#UMo|NmQ= z7tA?p-v0l;s`9U2zfPVw_rDRUq7!*rsLF+2?yooQ(BwH(=yw)vEcde`miH#OY!k|PdH zIeuV)h=qOaIg!$JTz2BG0r4wX^!FlJAZ_Ok9_s6rDGh zwWNwEc=6hpNgKP~nIyhns%x-cNBiZxm>nAqTgvGjSQBqkJT2ItF(yIMdtYMTuIEM! YjV&411oC%@0R7D1>FVdQ&MBb@0P$-&e*gdg literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/links_32.png b/e107_images/admin_images/links_32.png new file mode 100644 index 0000000000000000000000000000000000000000..daa7788ac37d6ee9c67bcd3e8942df0b6847b195 GIT binary patch literal 1919 zcmd^9i8tH%7XJz9VjHy-nNsA{n$*6VDiup@No=i>O54O_LKPv_Qd6d4s!FBp(2k`I zYS%C+f;&$;J(&bjw|KKa-HFC}?|JOn{X zKHeU9DeC>N4#-No$0Npo6y&1a{M{g^`B!^5V+n#}A*^382AG*3uK-4T0$>&t{3xK@ zV7a@yi$tPxKLOz5NvQ$0{;Yu1S&6Sbn3-5uSWxzT6`_y(Jrq|k1afn8BmMlyDD(M! ziuJ>Q&*xiNS#@`JZ*Ol)omY_Kq8UA&M-AKZEtT6 zP)J!;))Wc_Y;9FlRh@KkS^h`z{Zmj@R;G^PDB1DYZ1%OREQz&MVPVDQ=BAFWZftC< z$4wAk{n=PWg+wB)uC8WeWc*}n&ExT=rlx2#8j(oEGC_&Izv_Rye0_c6}ZRUiIA9G19C8!W70AJKwU$fF9QSW>h>;FrYx*e2sSo0SS(gd3y6%21c#MCFm8N& zeB{LoKnMpTzuwi-nt?$QW#t>N{dKYjBdly5{1-5#L>p_jQOEab`&pt*H1|W_CzUNu&K1{kz~eIT*MhgF=YzC4YdvXA|#s=A`F|ia3Dzpom}Q8|u^&iEE3CooQ)f z!^8Oqoyp0W-}rnr*GEs|;?SrRMXJ=M-0T~N6!(TfpcMWdWt`x9vjIqLtPBV;fmZ& zc9xU?Ev-)y05YiM%?oiXAaXyIT)UOh2r4Vb8ya4JzJLYq=RjPf^p&-`w;dr!2BP5u zf~4dBb3j2K_aBq`gfFfE5*9Wup0d@Qha^E*!r_PoSHf57=eVbAVk14rwnlA>mOiWl9 zJ+GL1`)#(zGAbD*Z*VK|)t|K7>vG;&$L(9ko@2+z#q6Ewacx!A_B=ZuBj(>1jd#&1 z_t?enr`eQIF-6zh2R#@z}eyp5j)%p`)bDCNBp*Dtv6yaiy`FgY6qIOx4JP z4P`cRO&)f9>Qb}+p`BAh<~0^+ZtNu6l-@^^UUy!eLFCr|q9$%oo*+yv!f<^}@5zXH zB!wlSzcCe0N;2R?A*(C&hm_f+vpE_LDecZs|8aC!{tJP?G$u)6+mbUAMDWU%J#8K8 zWp!@`KfuG_7n(||n&BVi;T1VTi#Mv?Sl^EWdrtd5?{d6NC(kXJoy{BRQ7bL2Wv+#& z%Ht}kS?jgY%O8$BG-}&yx?_z+*`M(^jgGvngD8vHBeXUdBqgmP;Di|ZO&hnW)5*y% zoHHxrcT5L5pG~faIQ&ixaOR$?i6<6W72idAWOw*ILtMW?xmgRh=uoOAu&|y`kUGBOiY$S zucp&aToOq7Gw!XMpPxKjTHBwU#x^+*KS3C}fI8Grp{XCEoBe6#^k-5Hr1_KY#4 zs#QErC`1&J$p+0_;p452Cn2QZZVtd;7LUfA_e}al!T9){fS3q3qtp-@42Qu*Zb%b+U=>zjB>ZN)mOZqCkRx$<>2V3HoRz6iYc&66m|qSCXQ5% zhm{{pD9ah1u+(t)qx^o~Swv09ohU+2kdt~44?LYpWU$|{37M`nM;{a%+mwLw87l*! umESAntZz@WE?zD|pC+g4y4V$u!rNr1)6qM+C|R6TDUc5)z@y1MD(7F`0zXCo literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/logout_16.png b/e107_images/admin_images/logout_16.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed913fd328b7bf0472660263158263a649cdeb8 GIT binary patch literal 823 zcmc&x`%6=C9Q~F?YDonJ7DQ?g8Yo3Sh^Up1`N#*$Es-!#bJ-J36dxfzN?pyzoO9+L zI=6YZwY%%QcWc+~=G@e|v9i)M6{PZ!sUwY9KjhMGe?=eooWlnWhjaKmrKTnL`ke3q z0Qe>)#-)>d_}_YYkQfwlh(?lUespRy0DZQwea}__*i%VOp;MG9tsRoO-G3|=n?NAp za)mnGD>j=q4#N_ON~0F6tvSmoSdS{0uJ?g$ZNjaspUbneFf!2HE&nxj+HA3Rbt$xL z=EmeHthvs}=b|XC*BeD5$kr>~*!W?CB=cN=qDF!+n@m=NVdU%b3XTsoG&DgFHaR(2 zUCkWivw6H8*L2`p6m4%8F&{TCF4W*p3bic8Cx=6=*1|C6b^yC7U`7_Qy}hm14-19T zag7?Q$lux7VX=7T&TOmIuGJDw=XX9|ieUtf8zmB@T&_V7gHC5yUw3laAgyk&qoaFq zaiLQrrH&LQ#}ZYj6a?<&~vYt8G-!;c&cjxwa-Irl+PpayUYT0^6Djn4kaLSs4FPTH%C& z+wEqt+Rf%MnM{e}rX}>`?(Xhz-_R2In5yFRG#YvS#{s)vBE88d$BQYM#k7K3#icn# z3=o}HkjwB-dXSUPNN42al|QsIB1w@hDK45GM7ybo^*C5kQoG=tc7~I<*UHFhjn7Cg z@@Z`Rom~Tq>6hyLyp6dRTj!`^pbuz)h$=%brJR`yM^VL8X4rVx1tonfbd2jE8>IzD zMQGw)6N$ceZzFIMmQjPW1jW`zW{P8GlCRyEJ1^#k&%QZ!p9St|8n0+|;mMh)M>EAp zsBpfnX`necHT=j~YDeEyhG2hbu$P~v?0JvZxjXXB2>$~gDD)zU;xYiD7g_Xgo`ET3 O0gyyVi$h|vYySema`XBC literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/logout_32.png b/e107_images/admin_images/logout_32.png new file mode 100644 index 0000000000000000000000000000000000000000..a437d2af7cfaad428db4f58c74c30d0d644c9a91 GIT binary patch literal 1741 zcmd^<{WsHl0LMS~rdvn3>fCg1QpdTsC#PJus8shmyY_v3w zZDx&_nLV+MJ!rFyHA0DL#7);N?IGs*;d|Y`g0P5Qguf}`^U={H7_IF>F0=2q>?!Oj=%9&6(H8(31 z5um+YMWIyo_G(5){~jD1*6DOKnt)akH9S0m$3M%;dNMLHib6dik?I%>4x8Pe)oKZZ z=cPn0={fVs69NwRv?$PXNdyRla*al_paxY{tmx<@G#XP-P&)nX8!Q&JytE_`G?|8N zUc9K~@uYORKsP$tL?Dnz6?0QlCesuSS6oxmI59D48roV_#qDltrcl^ou}s_1!DdUO zvNi-F?f(4?8jV$1$tbycZRQmi8~X?2yobRMFZ6*NOd*{i%gZZ(!H^9NLL!mKW;ZdJ zO=)QvOeX*B+upe$VAAUiO@}m^55>hL2JykzSae+-L!nU0<;saJraH5!c* zBaIPQELJM*_}JTvd>BWgi6AH!k(krgreL5E5ny658Qz-RH z*)9%;FO#%tQp~6~?P_iv5h8bVB=32ids>|5!{@g?dXy)Z%d)aam2gA_wc&Z(84L!0 zA91(*s2LAu9Uq@zH0t|gGNU@i*a4e;hbSqbq@>_WOJDH$Vu?gl7JL=?AiXadn92d~ zX<_5DXGmmvLP93JE~c?EL?n`ms;b8IXkEi0?Dd{;av2{K2#2HY zc>5w{<7h`V25g~D5z$G;1W|*y4bVzuZUsy;eGPXVJPXNC6@N#qUcYbwi z_B{AwL+we!K*u|W*AADr-V9)lF0RpdIOcCpZVH?6u()gfW3;nW**8rckuM@Ei>xV2BU zi?5Pu%}y0nbIDPRlA@rFo^GJL%+6k zz79~U?l#m$**|oKsb&R4?>sO6;js~?<$#F2BluL>a6NfdOw5(_w;uCzUzvOgoE3&S z-feP5s31*H<}=|+-srOWNSJWBdmRD8##_N^Va5HS;o0_dI5#k-XW#Hr=W(lhmd@le zGya0;I-j84ZiVdL!$b{`|P=EbY1 z_s>!=$she&?2YYFwN;U}q-Q&exjo9j4f$xA{D(X5X~sRwfSF5Ho{A#m915$;^i&N3 Y@22;0cY8Cptn3bWx%;>=T!Yd70@^h|s{jB1 literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/mail_16.png b/e107_images/admin_images/mail_16.png new file mode 100644 index 0000000000000000000000000000000000000000..a5ad9f598faf2842a7816fb6ae72a07464c64e90 GIT binary patch literal 917 zcmd6k`%hAF7{*T%%QRLoQ>!)IY|VMgA6hP>3k@qaHB;B@W@?~YMc(MTY=uV2&@8Q? z3oJzff+iZN3l$ z5oyP%DL6O%laCj^!=g5(;vnQw5-AX*)Wv#pVF+5INlr+M2LMz*Ghi6#=mH30M-U7_ z(0L1Jlv>5od6OA9o#5;A?D*_d4S%qqwaff{h0IKsNhT$-83abnKfsC0OqFsf>SRWF zt+u&k@<#og&!ga%4M-%0RX2E8_D$J@%uKta(ovTSNZ*+;f&Io z{N}D* z@x#6A>bTq_F^`z`@@T)JWZ*q-UqxuZ&dz`y{?+Z{=Vo;m!fOen7_2{_nfY@&0w&!UMlto$MBMRT?d%(C3i9 z!?rs{S)HqrRSxG#3JIs*L=Ja_M2ODLoT1Z$2_*i{xw=z|8ph@;=QdoEmI#ML!@~7! jvhMC2ae-G?8VPwp=1V!5iPgbcJPt&QPolm(lF9xHLhntf literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/mail_32.png b/e107_images/admin_images/mail_32.png new file mode 100644 index 0000000000000000000000000000000000000000..d45bb2a200533fdaf686f4ebee3651ea64882ae3 GIT binary patch literal 1773 zcmd^9`B&3-0{kLcFssy3?zS#s;|iiy>p`B_8VX`6mq6s$S|B6=jnoQJC=I@1Szqx0 zL6U%gfE;QGAYr+cT1m(S$Pq#a1d>pQ2_ZlTko!~i@7Q^7X5Rcf^CmYeBycCp4F*Bb zPSiR7@J)CBA8oBS)xYL$-==L%LIxutsEK`Y+g$|&Swmq#kpWe;^K@|eagCsIAI%XuM)vRb&xm;O!&9XwFMPDhbZfl8-?ParvtE&gC{PtOuK^_qZ zjRuTN0380m``g{bVs#%=V^{;PUr!bkO=-1Yc2@hAxi~EaU7cE(&vA4vW_=wjFN3UG zy~kQz2St`s*eIvVo(2PWMAqna;NRbMkBly;)qvS=RGXzd&N>#??NIxV#RcG256jBx z5>5fDb2c`CjwI5HIR&6Ktn~HGN#}sr!f-izD(eoDF9i~rEQP>SDnU&*9U?;uDzLT; zP^623X}}%Uk%}m-ts?tiFOvxv45o(#4EcNTSs=214LpA06?VzMibEKjCwt=SS-1DJc}8$DJnPC&7CaP zlP8mZNx+4Ome#I$rhv_4@)=w~(1ivLpPwuYz+|U(^}Wv$UbewlmptPYIE-7jIDLFl_B;}r6!P$DU& zh$<>ZlJT<|jcIvFhv+z})0vX7omCYrtE+&{dR@t=ZW?;wUGvGI_75qnd|%Gqq@gm*x1l1REu}YiwO6MX*9{WVD*DXw%Z@tVFtd%VQYxuSp4HF zH_}))(%Ds&s~a2OdF8T74g`Wpk!ZT=i8TKEhK6Qyc~f&^v+ARGHwTi7coHmVmCw|9 zLZPPJSd6-ZI$z-*UW}ILd5b`p`Q$%T%KOiL*;7naKdxK~?MGa=P7I$o>P7Y73c%c~ zUZn=O#5YDGxRx?dT)rB~K)@3Y9li18!=~EChQ9cpe|f_+Zq_F&MLR=~6+{dViP(() z&wwH}Y~Y(e;YtjMCPrMt6Vnq?aS#%F4TEz>r6eTb!f^@MpRRLoz7Vt}3FVKB^x-Ay zLZL5)&SqoeyAyn2yPaGbhYxSOsgl$`s*`#Q(o0{hM>}5Kfj_?Vg_PaRu1oRxXT+a| zc+Tk^;!g*u{TYc?RAG`(BN|uSHoSi9*wQhz2oXqg*9F+w)^}Xb5^2Dd7woKq2yTuT}?Lw2a=E2 z1o|CzjznhEMKI)B;~pGTW+JLC#Y{fEX*R?xI!kfZC$>C~kHdGoEGv*1hP-#}_jN*J z4Z@H!0w4V;XaDRneDB>YCxhq7EOH2qC*sXSZm_jwix;dg} zHt$Sd?hCrJpN%`77KRUEp9pb^Iv4c^_943S^TD@Ihv5P=YAy?7> zw@XI(sGTp@(xTDNZ--rUy*_jK%2@`_pAddK042%} z$W_6n-z}=A7h|)2H!ll!B$7GjL%`$OubRz$W!o^JCx1IM8tW2s+d=Frchu4|BYVpA zz2;Lnm$Wd7y)uW^%v!gc zg5-MpJ;%bb$v>D5PU-#5e2$Z9Vto;W!n}pwa(J%h? E-*Q$~Bme*a literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/main_16.png b/e107_images/admin_images/main_16.png new file mode 100644 index 0000000000000000000000000000000000000000..32f7e086dbaf1ff36589c2253ebd76d35fad37a5 GIT binary patch literal 1039 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLlt+4`{Kom|NsAQwKY4pfBxZh6Svu!-!#;`bM(j!1MRzJn%DKzw%C~c-{A9qgWt-i znExlsubFGDUcUU`!Gkv~l%82=g-tuUZ`-yx0-}HZ{JE*CJYQDquBpmO4W)-bV69!< zqp{i6?A7DPXVPR}dYhjrFe-I$c(Ss*E-!B7v}tc1Jm^kM`0?Y%&izy&AVl$an()n>7vws$D8gMs$I`iQ`^LF%~Baw=K$u9?dJk7s_pyVjPSeW^Wo>Egw;N%3o{68;~^ z`M*2t|JJzQt(G^8)$SZRIKQjA;i}JzGY9Vl%1`O;{{P~@|Nq}EY~I{kQ}cgkbkrob z8~Q4Dt#nitGhEkEUNm{)bu-N;)|#Db_MKRqxMInY4_9~n{qcPB=FPWm-rQ|(^LGEV zyGtVezg+WZL(5$&-M8_UIct)4IG7*q3vHjhaP_if4-XbLP7C{gt7A6@*J*FDUoS2{ zG*RDfXLd(l>AtD*|3@4Cu8V!?Y`A0JhBJoRz^E@;6i@?9A8Sg2{DOhpp#m6Kr;2U_ zx?8fuHKHUqKdq!Zu_%?nF(p4KRlzeiF+DXXH8G{K@MNkDP|;0K7sn8d;N*y2Hi-=! zEg$_O&X_5OO`Pd2tR$eZ)@W_)W2_X zI_0s?%r8s5og^eCJ+n3!(T`WWDsuDGS-HKd<~Z6M-+aO4fV0Y#y;=$xjZwCTv%)`H zmWge1i=Et+_AC7fBX4iG`Ip(d&$#O3-qSIEdeeciPt)&Ouj$RX_a;Y1hO{;?r3z~= z`m(ty{FlYAWzWi(S*Pp~iCQLYV0cxpM`Hs&+s+Vof8{;PgTk%%N6iQndbRVPS-YJj dhw$O;3{30tC-R>0OaOY4!PC{xWt~$(695qORGa_+ literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/main_32.png b/e107_images/admin_images/main_32.png new file mode 100644 index 0000000000000000000000000000000000000000..b195d54bf0abb5ee1b49b84701a40ab37514cfd4 GIT binary patch literal 1860 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 literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/news_32.png b/e107_images/admin_images/news_32.png new file mode 100644 index 0000000000000000000000000000000000000000..21cccc7ac3193e96a773afc804d54dda4cf45f0f GIT binary patch literal 1795 zcmd^<{ZrEg0LH)0xCryg++}4~sC5`%dMT+%CL9JBhzh0Ni8x{qA_xc!k2eK7gcNAJ zgG#&%-B1uVUIq*j7_|Xo+jpa4szBG$>FsG&GV(12ozz zrAj})Xn5H(CW4epx;3FlF|SffWSYm12?(Mvnrth2{WME#G~0i>e%M+}+wCfqmdRwoFf3PULB9CKi_RIApsR~4m1}uC zenrJ&29uwhoM|!{bt^`#R;$shE-WsxL78=J&0umM2$Gjq#1krb0$FKE&D?@!nguzX zt~I->{pr)m$$#i{romuX(prm({#4AV$Hu3G5In<%28Uiz2L~r7`SbJhQu%^RCMzhY ztgf!-a5#(VWw~4_Q>X+&cxDEinwlOTpRB5S(%(N!p-{@o8jKc~$?PmGtt1k=RH_B# z+>!`V!7w5c!6LDEmW#01V&=3kHa3+x!(uR|#>Qt76LTn((U_Q&*RNkYolb|t!REpo z5HXw0R;!f*NgnL1S{Dfl9-6&^Tk}AjKzV?76+5bdHAqa2&rClch9^LB8H?IttB-zmpaJc zaN*?SyaDRuty}l9aOHi&Lwe&nPcX03tgOFB)LM3$JcW~Xk=tEB`vM#ujU~d&1QFrB`}#x9v&V}OUqKu%_GuA0plJ>$lt?Qo{xn-``FHPTXXo++VgjK{AQW>z zSSXTGdTCrxqEfFmHIX)H6N#l&Rb65Tfnb@*`WlaKfA)-0Tie#t)63;axqMlC{Owr| zR9IA(o}P`v55+|5|5XJ|4e0eb<9iMyS~!1@CKDlarBAnMrEuWJ#&p?B|~?7ZL|tf{6y)~Y{@ z^-iTMcJpGnXZ^43^UaMRqr>mEUy+P|x)p=L*uP|0#>TEb_{PoM&1l`IG@(82{cayX z!DH0ya((F9Hyu>>&Qr0iNyVwP(g~l#fq~Rt`YePiXEwaGyUuxBe81l7#)2yL-*G~s43W94I!&5r^qh8rO5zop? zpZi%SCblERxo>%W7J~HUlN7r%gP)-^hsF zHv1xQTLgU4&4Jc#W9$sad{7{2`nl>z-NjwC(2`dF1Pt?lhydR`RspiO<-P?hb-f|e0Qkz=nzNidBdd>G;H!hk9Wwq z!#^cNlqS^U4HN%D(ejd0Tuh2C%Szvt(Q>5r6#CeYhl|g2bjLqWO{nwS$SU+Znp95x z?PM$MgHivWfLHYF;^7XLH{x|Ds^+72hOs4=8*-$kVodZF-@%=}`((6q<=4cO8wK#M zCnM)>w@24~Rj_04_h@Ma?5u~0ZO-l-dZr-Ho}g_cF+D1FK4>O8w)W;|=?lJoH|pbu zP{Wx?=fSw-Sd(I4nvWEGkNAC@Kj5Zy;80@DV$j{pnPx{)u;UJZS z>nF9~!!BD@k;lrZ$bms1fA;ft{{&L@I4qeUP#rC|30&tamNqt|$6E|rE NLQkI!>I}SA_#Y)kvtj@M literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/newsfeeds_16.png b/e107_images/admin_images/newsfeeds_16.png new file mode 100644 index 0000000000000000000000000000000000000000..231d7ef7032a57cbf574b652d4b0f207fb373aa9 GIT binary patch literal 1024 zcmd5)`%jYx6#Za>Y(!uzOSYMGahVV@&}9-aZq!i(X_-_kB_d8kh0;i22JPGnqmT)R zi~_czYi(x4)>fcWT3XsF2qRV~rSJFG(ibhIFWR+iqYJD5#ZGeW$w}@H_nh3DRmk%6 zwB2a{0Hh<}rKp6y^O|qHk(jyrGOH8vCJt5!0|2(W zikm@))@arltV>HW#@rLF*34kAFhk!$drFt2TA558iEL3QBUI|6`rqpiS5CNG8%niR zDqWVV4Jb+B;-W128nLMGt(bMhnglAv8Qi3`%neuffYI}QIZ?M37kz-Fe zqGw_jYqI;#+EePokA+;ZY;MCB>YE_(`6B6x(Y5B|^Mxj}-4}@Jt+o*c-C!^+%S}Wf zab#rF?eQ|^8AsdU^~2{Al?+W#2D#*>d#yH`Q?0dijSmjR8&2On$K?sMddGe0gK|>2 zKNxz%q1W`Eq|-S^#QT+Mv%zTF+zd0Bd}07ElbbYp2MF2|Wg-W%6p3%36Hv(Ng#G^m zIEEj~O^e0gdi`=_Me>O21Cq#mFm0{Pf9TR>magnaMnT8P)nACzyHNUIy fnXlMVbUlJ z;|f{ETY1gfJTb-?<{9HL9z%xf{vG#xKIfdz`SpB0=j3>KxN2*j&;$TL8*V(N1+%xq^`|I`q&^UZaBUcIlYJiu!uk*kFv8t-NwY6(tV6X`Pr|CnB?d|RH z$(cWuVJ)q#%gZZ~e8&a3JU0i$=L;ANW(U5LIyPDUxs=11u<*d#i_ zxQ-YVe0*X`J@uesO+_S+D>rwALh(H~oXruGlwg9(0uhMk)G@Aglj*VWGidZj3gHQTXl7fWa}^t*tHBhrTIaJkBTBPEF0MC^qyXPE>YQDOR`U z#4ED-b@R6Gj^U2b##jvvA4f(AH8oB5?nGrNoR}`DXh)S&Bn&& zqN4Kp{|}(4c%aI!dF_xf>hG zn+&kskQtRqo#KgR=7c3p6|Y*Wucw8kKYkn)mGb0CVGE(lm2%-+hDF<_el)uFN)QCS z`};YBNhQAag))vl&AE_n!{+eVT%K}k(+GYVu@sQE5tNYd6rNnj7s%7o3%a`p5l^35 z`Clq1EL>gNc;C|~6wXfz_+er35fLeh^;H6yQ(Ro?n;V3|<1k${+1an&)z%t3KK>o* zB!5Qoeb$cx!7Nr$P`j3cUCloW2Z0`1Q3Y&{Xkux3&G3;vgEi;y1mc|Ix>xd56eS1% zz5x=wJ$&}!|1$uejRR-)e!?Kp*+0=IHX<=O^Z^X8504Fl89`z~BVpdK(D0P_5!e*~ z*hhsp+53VCca)xhrB{f3r)8vyHdz;YE{0>NA6MGGVzTbnwmmA9c!}EVeR?UwSYi>2 zM*9clbQkvRTkhD$!*7gu^>sPY8@F7u+Z1j$A~YIvJvGxGRdV^7>bEVOlIJk8;NqhV zYIWc0A8p_;Z?v=b<1%w<9dDlnpPKmMZJuh5SGY-`Gb#fi=#LJx=F1f4q;M5N%%~O# zh0dvB3~MPm21K^$Kc;gt4n=te`qd9q&{Zu|yNs`>JaVh4cT&R|tNS-vv)}ffZ8?l? zwb69g<@hHT$;g-Z2fT8&;UlL$?J7H8EMl5y`rxdWt%F(EdwW*(*VnN+uYRWfBtn?R zVIxJl&}1v$3A4MW4ywD%SM5u<=+SPzt2gIU1abg7UnU??S{Cp?cRyXOv=SS6&!GE1 z)_10y(5`lxoxzS-x`DAJfye6t{IMl+B8kKbx(6*DZ>pf}ug`4Y<@VGQA*2q5aR|91 z2*Ls2{h#v2?kI_HcaoYR?llx-`&X??fOUfb$dfsK+f0nSKu+xjP4q#^e zym2YxNXzF>R4?-9X|n5VOLc&T=N01*9W6+MmoJg-ZrT>^V|1a`Y1s3dPk++jd65zBwb)w&UOwk@3x>nfyHGS>VAy(|PN$s`r z@n0OP_E$jle047pM#}zr9pbxWqoD=HfnJo!ceLJRT42nOGeb93AaSD&;<2l{J92hx zM{UV?gI}{U|4)^I8)V#m%Ff%n`0{V&hj8e;MVHWpV(pXgMfkS|zBv#wWqssCe#pO_ z2oa)Y3%BsXVLYV5&IleqV3^c2cz$?h4QywTy0H#*rKz2d8gZ^{qULJ4l;Aq zHLf$M`x6X5r0bn`Ab`yku<&rvUv^+|nNEluB>`sfWp-&nE~R+g6>UHv z&H|6fVg?4egCNX!I5Q*|D9DoT=qYK1#IHM{x^s7fl9$NRNdlhbL3cx+u6=)aC$sQb&%B))p1q-+GlF~!FBmNO zc=bTauQhLjX05y;Eab^>T<^{HgL@@x40i9(63e~pcV^4`KZW%P+K=K>PqeU?RT|gt zSbaY0Z|T3kht2Lyj(q2=X0u`W@tc*|tGCbVD4X4OR3%@~5h(UL)iQg_x|Yz6o1e}l zI>;M6to{Gv{MVDY$2&fV@XBuxj=s?DQ<3m`y1L@Lw-4q@$0yg>*}NaGB-2Uz0mZ0v=8WM22WQ%mvv4FO#se8oUZ@? literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/nopreview.png b/e107_images/admin_images/nopreview.png new file mode 100644 index 0000000000000000000000000000000000000000..4fd23705cf436d808584dafdfc8933e537c218de GIT binary patch literal 1419 zcmV;61$6p}P)Ades) ziXR?>9v*uf9CRBSgF8Fh#l^TPB-v3!)=NLrMLN(xHp)9P%sVg1G%Uj`CB7mZz$YNP z9T~Y97Pl7^wG$Du5e~Kw4Uz~4q9Y^hJRIUI4BjdX+$IU#9RSrD0?-x$%M$>^5&^>v z0J{nSwFCgG1OclG1fv1~zF}d#H8AZ~Kiwbz*C7VcJS@jOHo`VBxG^!ZFfOSO4VnP} zo(~O+OG}{{8QWY@=r~47`1i)j$}luECn_tnx48KH{LI6`s}m5E5D$`6 zRPx{7WZ z`T6<0yu7osv+3~f%p)9;5)h|vZ~XN1swyhePDAiZE8L>-{90KXDr1bp!fq{W&XlUcZ!O|`zjSvvBdwc!)`LjJe%Su7=QZnX2 zC-m&5(@jW}Q544U z=PzhZI+JJ^W+s&@35|gYQxPhRAn1eKT3Idxa~77Fi>Os*4W&UVGsYG}3&BN!eOV2W z5tN245){80F^9>TcP6ZK-WH=~Iu;(zy^C{xhXWTb`cJSz;63u(oAnQ1Osr$?)78s^ zFHFaRZCUWHu9YA0j;565z_`2QZIY22=WK`$yeC`21IBc2$Dy>Sz*zzVlNR|43#zN4 zfqsHRW{$dc;Y-bo0%}gsXZjx6v$JAha>r884PU3ya?}e(Yi0Hl@CHIt@i!eV@-md% zxyQa3yy~#a@?pD6r}AD8>&3C1i@-BaQ818R1cj)#rgV~syT2G06sTLm#LK;6Wd&cTj0zrr~$^(rwj{? zDz>)CVaiJTVXmFM6af|RNg4EIS`f_mey#twweNk>KDa6&l@2me1f!rwWr*hTVQXO1 z*ib$ro}iEp00Mzw1Hf+$m{tqD=_%Y5q5!!R4002ovPDHLkV1kK>rKB_=Du3N#vHm9JN+cbV=PM*qn|8njo!cDP3P}RiDSRLk zLR1BF@|cBp^TOGiw@5G_HvS%l#aeZfV0|5$6;tCQcS0c&EXSjfST|?yupX`!ry9p+ zuNlanM?DyZueyckYny-J9S1{pw}4HOOXL!a3=V>3cW*N~G2u1TF$Z--zz;naLFw0)q03B&VWA6FzD!)dB?$3xup{~}9;h@pzFH6t6{{&CttAcM;SI5HcLK-SH zhA>UgH!Bt!!Kt`rih$!wpU(#-c1xYWWU@58m)qUr6$*7QOz)G+9!a2Yz8b>%Y(cmyy9s4UJS-EGL^$BzRa>aw(d0f zRO+bk-@kG{@FSPK&z>bJrLk6~2ws`!onlrV@55F6RAW}EE16J;VXaE2J literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/notify_32.png b/e107_images/admin_images/notify_32.png new file mode 100644 index 0000000000000000000000000000000000000000..9dd5dd18c78bcab49218a37b4cc11a8600db76ac GIT binary patch literal 1823 zcmd^=2V2vJ8pZ!0X%TB3y?6!31zW2isIAwFf+!$ZqJRuXYMBv)Rssb9MNqcUuq%R? zAW%kIMhFlz8b=wj1QG}Yf|x~^VPp_UAmP2-_G8@hJm>tLbH2cN;Og?-Mm$zn$)n3t3P=XGiDgsOUXQo%3)Q6ych&+*dFAJHo>k zs6p_@(ejd#mX>$X(GAeyUfUqA{zj*lt&WMwRjGi@o?#aBf2ms)0%sjR7;*2^I;U z=&P(%FnUx9h2nMW_q0npCh*5aqYL&9`D0VS6~JiZ`oVk0WHOmh1o`AfkFR(aJn3tEH-c`Iqn=674T)k4MOh{;JW3NKtE@0(BPb&O* z9p0kn=V59Ze*E!uWMq~!YM-U$gT+O_o{SH23J1E?y$AjL;%aH(k;gfct=J78hE)Xx zwC1KsU=wPeao>6EI`2}llxHX&9xbb0YD!54y6?>N%E-tF`Hu>E>C479vPbSGRyF0c zb9?S4Ns2B9j*m|iWoCkU92drjyTcYG?~|sVghFE`V~)|<%HRXb6nRl4jP&#j4i2Y~ zRd_r;Ihk0Hnzq33rP}Hb4X(_m+A9>xc>J4(4=Hb(6iuD-_AbqPhLSf4>QPMm{kHh@ z?&6b{%#80-5{J?=hJX=PStID?KvBt9zsCUzWlkyunN$swGw|G{;i~yd8$?)oWkn4@ zw#j=W%+8VI=JN|l!rs%m(z)e+9>^BpW6W-EUs_FsZ%YfmID!K8`+9oD+uLVAP^?xe zVYZ0>;%#;&=hY3|S{u5kb>HU)Z_kQy=d+HENp^N&uCD%7f#>>|N~kgsa+PIeEOK@K zZ)Niu%`*I@!<)90Acz(c;qKz`_ws+6h{w{Wdl5uCA8l`Y;npx#c^*0ZSyrOjXQTQF zP5*Iass1~Bh)Hv?P4LYtL*97jd)vA&`X@fWdkY)NY;b19<~`Vcb^nlpwjik1^hPZm z3Ar@#MY3UnYnF^o6?EM_K;MbK9!GL1T7iEhL%2;hmVsv?M(VBHhH^f#9@(5=E zJ;K`Tuj6X#qiXpQpY%QzyF7N}pjv!K*jk{O)^9`CKbLXSpBbUd%9^epFkL)eKyZs~ zj1dkx(Qx_M`;*U3t!AL7c?<_b@5+Ph3zsimoamP w_A$H0&Nnx9!(jFsH&!;cVV#bJYU^xA-2Pc`(4w(waqZy{w1bO1+0Hldzs=`*G5`Po literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/phpinfo_16.png b/e107_images/admin_images/phpinfo_16.png new file mode 100644 index 0000000000000000000000000000000000000000..bbf793fefb0fd141cfc8db4fea4bc0e9963e758d GIT binary patch literal 1160 zcmdUt>rYz+7{(6+=0K~4WD3kBY!O`)T|hJ4Km`J0-BvCwnYc+<8OI`sbgr^-F~Z?m zkV`A}w6t9*Wu>Lux&o&3l;E}kZ$Lih8<|7KsH-;ccY0>h6WRuU}<0ETDZ3vPZ00DIoeJe!@`-Tg~{ z{~wKwjW*oc+&t&9;}RLpWXkOX+H=FXy}d0KFF9=(3=8V(O?7p5qN70=hJ`|>PWL2( z-r3O5AnC?24C8XSt*wh)U8F!@7YT({)atO|JRT~S-&d)AkBRxBvy)(7(M?WHLeMSo zbxf<>R484Wo0}UO8%_edd2>sz*K4&}nd}~dAYQMRz)`ymOHPKw*9j|TmP(gJQq+nQ z5Hv;L7K_D9+Ht$hh7q=vl@*`QXEK=-3I!}S@9yp*h`}^7%jMoxtJQ;pgF8Dr4953V zDiGs0R;vX?%@R4G*FPN{{cCvmvB5AQ6faCn?2L_h7Z!Z1B8|~#tgfye8~br)#-~)d z`ucvepjdmmMLRN5RMhYBxTR9*^t2Br)~l)z9*@^066NJ9CXI;Myy$Q^-0lZC7bF7% zj}{i@PoHfoEgkOZ`SmhqRIPr9V`h;M9v>gCtTaFnR9kzSMr&OnUDqlNLqqHF@s(Lw zJRuB|q^rDKZ?-IQIHMSjrKL5p*&|z9TdN-Tp+igoEa>ecEhsLR%azJit93CWquoJZ z1uT`n9xfZ^u-h2tgmQT|pU;o~sKz*DzzM9a%`6hR3X3&tHd~|l(;xL?!w$uNfN<#P z4FCFn6|m>+kYfKI5uDT<4x{ul&Q<1DAdpm0nh!=%OPDN>4l)bMFW&_d03aZYnv#@# zWdEhivG(yxAn5sIMxi@#GX3Xz<~Oay{lf4A2gDN<-Qc-bj@C*U0)aN#w<) znW+JFtcX`yfYn3bts$&lwI%y{VKZ-neDs)e7~oqXkY%(C&vMdH(##u&86FrUu{O ibGg*){KGGI1Omac^gCsLKOgIl5TK@}rwk=ug#HDB)oB&d%x0%`!Tj-q5f$KM&a1VW_Q?#W~*86c83xr`Wl^hBz<)7#JYvwC1w1GFR6u zCKEs)5Og{a85!y4SDKxjot2dp98CJsP#X|X?(biQ!C>I~M!{tuzZ0!sUjqt5@2m*jn+$RZwF>(X0)}PGcz-Nd`c82RvHdf0)fDw zaA(+kMf(42p!+*N{7b={UbwY;`27&?@V~r5Q6MNX1cB1G3-a~l2D+*qH3lBYrBeMg74S9vGzE}3g6h#@$arX^x0$Bs+e=(n9rE;_1_8d2 z<7ygj#n_2;qu-BArgS%vqlX#ogdzrh*c+@%h~ttXh!3~i7CnOW9+7hN7$)b@4pq1- zYSLRL1<{qxOei4tE>6riOy}VIzQD5cpgDtj`lkfN8B_kv0S3~AGfd!y5On{5@0DvV74Q8J!T1M|kaRDE%aj<2KNYQ2M)Sv% zwO}NyKMjrMpp_nSDAuvNxX)BgJ6WCqavcaUy=U8lBx5kRG>rPF;R)T}G|&6q^&)uQ zQnrHfB>7`8lG}CHt-bXcgKozeE{7$%ZJe@!>MSjP@n13P;yO9U)EiX2%e4v2!H^g9 zRt!rFZ_7gG%@Tp@iu7a&FgEmr*$D$9o>6!PhSI+9LdB)W#_oVU%WcL{Io z=eeH5Zl~=W?ruJ)n|~f*aT1>&c(`M8$Uh%!c_e>*dz(s?SN*808y;jFy3zg+L%WB**tEzla`@pLC>jbj|3*E>4YX?6g&!zj?Om0b>k8&1}2( z?B|u7&mG7T)j(Mv{aN;hXrnt)_}qv7=Z~*3o7SQ%Pk+lu6N$_<@W&in$g@eK#>U3$ z#wO>qcK4R%e%AVjnOQFCDBu<`BH-owRJo+S2ApsWCd6RnlEwKn1u?F=k9SO zwKH#Ap6{4^p2qdm-<3DPbWcnstv8fwTRLm1Skl_BxOgU8Mn_A@y1$y8B`>O-Nct5m z@`b@*kChWFHQg4o-jMWZL$x3!|A2rZtM4RhH=16p=^2engxRWuWM$Bc$#$~%+{q#Z PpCCJHm=)=kXZ-&F1>@$P literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/plugins_16.png b/e107_images/admin_images/plugins_16.png new file mode 100644 index 0000000000000000000000000000000000000000..fc6772edd0c1bdbaee77aa9f626ce17c395fb2b5 GIT binary patch literal 987 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl zxPJTg?f?J(2?>d7*RHLpX?XVRZFzacix(dwBjet^d$(@gy2_fqmoGm>Mn-mZb#B_U z?c2AXPoKUyeE7)!r_wui99+D3+rNMRpFMlg+1c~t$?FXp_EwkH6c<s<;m2wM;lah*aatfx;n0fW; z)v0smFIur`_3Hiqdl*`Jr{2DCZQGQ%sk7#Cb93(sGW~yy|MTZ>p9*-FS&8oU)0ml_ zzJ2@gJ!_Y3*l=*#wDlbw9e*~kwY2pAKPbC@|M7eG?s##-c@wX3UtCk&!1Sr?O|qj?*oU z9je^__lW*KA@P4X!|vV3&R@IN*4gp#>D5I`mRFTF?(PYG_3G7)OQ#+@c=7u;Fxb-L1;Fyx1l&avFo0y&&l$w}Q zS$Hzl2B_$&r;B5VMsV_sem02-H|$Ic8ge7w#9OVuV2u-pr`gSTga9%S%z^>bP0l+XkKrY2b8 literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/plugins_32.png b/e107_images/admin_images/plugins_32.png new file mode 100644 index 0000000000000000000000000000000000000000..32f71ef5472d36e7a2c08fd22e1bfc5eb5ab4347 GIT binary patch literal 1844 zcmd^A`&ZI=0{yC)tf|xJm}}FnX=7<-vmR?3cXT%jYkW?DrX`F@B7?@1id$srkPQhw z64YEF@~MTcshN*)bV>QF^LNZW=iYnnulI+0X%|AzTU+k8 zgdoT|;2Q*T#}EEanAwgZxb(pt+l7aRz#*tfcFLUo4uZ^}3&COjU;83P6r;QbK~)uZ zX=!!#dym#u(aOrYu=GZCg15n7U@{qeGNHYFkn%&y`ue80|G88;K07=6>#yraj(FU; zcb{i(4sz{gW)>P68s+jAb93(p`uo|ou0Br)YjHsT3UMf^7lI3oDm5nBoI|96=>ZHrrlFgQo6eO0|HP)Vp4uSb8~a+kI$V$Vnah?WAO_M zD{A$0d3jrYeoau&w*UY>f52!2)6>(DkJ*|KJddB`w)*{h}fxipfu?3@! zqhn+JoMNq3PmaNfM1zWKcPA(3-rg5<21_7#wz~3Rq31^)ucx%K zY%a_3b@o7`vCGU|d6+|>3|3Uc;bhTDN=o#Pu=nmUN@zvp?qAI01c9LgU0Lv{DJ?o6 zh(XD`OQnJZ&xwgCkw{!s)zZ`~1S*$~gP-Q+R-Qh6_FZRYSy>B*(^^qc(Ne=gB2mjr zi{QsSfU>s>VfC@Y2JkJ_YAxvaWINSdKJv1@zO$Owt&(+UG}CX`n57PTHk-Y+wjmS> zmEsBpqe87#Z`9e{xO$ZopFm1X6cQqu+GLW!;ie`@*cD87cmK_s)SrHOoRyQiB+1^X z+E53>Ly!qXLWZJt;vX3hYQw^HXD1v<{*ffq^?1_F*kl|8kGqb=9Sk7G;&Dh^Y#cdB zj`M{e)5ZV4E#^!DMIcDEY36v6vesDO_6y;I!8DiP>AMP2)eCCcHzvKj6Y_7I< z`|m}a=M(v}y3hH}sR}`H)5`;tRj2YFmV*cjGQI7-R@LGxV|(k=*`y5vm-{vLh*^v- zPN;l1ARTSeZ7-brjc%n(<$HNOIQr%LExCEb1=XMwP%*lj{jc6nPAYx*b#)J=rMxWf+H;is^- zPjt*RUiu%f(qb?e<4|f6WyY2C-KHWmUh_CZ#iKcYog%+(5rG;q{4!qu~0Vv{Wv;4jzmy~Y#UDl6Z!Zd(}+o)4r6yA)Vh zhS|do&uL;N>+{?BBmT%WYS{yCwZoZeHpYKH_enb3K-M}ui*6yg;jkJ!E(w|oN$-q` z@a3w^iG8ah4`V&Q%M^Eb{aNb#r1qGdUo-)yGbisQfBE4X>PdwgAvrvbyFGchuXE+K zr{}=&v}p0{lY}jb~!+{vX{gRyhCw literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/plugmanager_16.png b/e107_images/admin_images/plugmanager_16.png new file mode 100644 index 0000000000000000000000000000000000000000..cf94f1fe9a9da52ffc6059a7c6714c2e37dac7f8 GIT binary patch literal 1019 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl zfPjG0r*6D||Gu`iGc`56s;WCXJFmBQilL#=h7HG}qocEmYhJu~X=80$mlX8i!L#k# zcmDqU>uCx1-1#ea?b`M3-M0r19;{lmQCV5})~$Q5H>z*hvc0RT>+!4a?d|Q&%`GM- zCQIi`o0OY(=FHjqJ7bnFUmh11XKHGi;qKz*=GxHEv3c|6q@*N$eS?;^iFS6j`}d#f z>gxae>BseE-dVHe?$~qu>C>lHR+emRY}wiQ*REYVcI?>t4xf~i{9Cskoj!f`?%lh^ z#l^2*zuvNC%bh!qj~oH2e<3R?8x<9MdA7xZ1q+TIJ^E}8UuR3h+4DDd?AUQ>ok3Gm z)3$ua$B!Ssd-qXaUw`4Eo$~VXIXT&P@4qN3tC%un%H_2!bLPxZR8-u#bJzd7PS>wr z_X~HgB>uKDQnyVx>vHqHKHUqKdq!Zu_%?nF(p4KRlzei zF+DXXH8G{K@MNkDP|;IQ7sn8diOCT?Y!YJ6-Os1b56e%`)z6OO7RyMRbA*8<$M}g3 z^H~R`MR#pfhS8y$Otr-!EC|z2s0^wzBR~0;8WE z>ovP>RvDj#cZ3ue)6W&nwmc*pSvtE&I*F%|>0_|PC0U!p(OT7Oo4&@V8R+<3E&Q66 zE|#=ytznVYiNcf!ooUzB&lkFG8o6q@@#e#eXC!WXvd5{~?0(Or1$$auySE5SDA+x? zJ|l0HM$(;S(|AQA=Ez7I1aI~Ub>&psP*K(~y(lO2MiN`g@tMzOsp!V>FubZyp1f_> Si%CEaGkCiCxvXqh1P literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/plugmanager_32.png b/e107_images/admin_images/plugmanager_32.png new file mode 100644 index 0000000000000000000000000000000000000000..fd72cc1af05d9120b446555d6be009ba239893bd GIT binary patch literal 1866 zcmd^9{Xf%*1OK31&UGen9o5}JULMQ2OBeNZ^PRNpDchNcidEy5Fq%We$c&ja4|#|# zl7|vwo$M8vvtz`F*sg`BsCkx$W?TDwcYnwC{d&FM@7Me1_xttE#$kNEHnKDV0N`un zNra!yVgJ(5K&Oa%tR9_h3x}iO0Kn@#0%0itzyQFZ2;LeESXNfn(js`+^XF0$>HNs> zgoA^_r%&MEp#199q?wtS*x28R)~ziK3E3Wc(@rBbQXmo8DYMdnKdu2t2wJlKd7{v7y;|at;cGf=!kWN^bsnH(Mqw-PqXL+}z4xWOQ`&hlRzzd^zpw>*tHYZ4{VH zPEPRo?VuRi*4+no?FP%YbqWXAkwJ|qWI7|m)APTX>>D3HD&N0flr-eLe9XRaBR@AG zJuffs_0*gC`uf7cih}Zr!3>Yu+PYtHrwItZ#>PgqT8lzqIz3HfvME)aS(U3P?>|=H zi$fniya#Kb63Gks)Vj7~M{!yCC%(y2-G1=VH(J3rwIz%MGN$ zl_yUUu~=fN!@h-u)ug19;^L;!(SNM1ZRqqg91c$+{WdqZN~3X@OeU2Y2g<(Jm6ec{ zb{+uq0Gb~LuZ#cB0Pvr-AJF}T1l@ztci!xBr<&8s1+gN-sSy`FnckJxU9(!-+D3U04B zY{L~|WR5#~?N9ho(Q8gn)6gBOVZZoI?eeFh(YG0lZuyCcp=Hh!mGyVx0Fhxvx{Sn7 z1WsO^Y`*%(txK5w_5hkK10AvONh>LkOsfG^zO{xYO)X0 z)r4*yINwf7a}r2JUx@}ozRok7F%@wWBX({B%$KyIjv#?pTxDm~O52dV4W z)6$e$npW~QSQB^U=wO<;CeOL=k(uepCNvwmgRPx)y6Ljmm2c32_tYvVuOYuqS>AKH zCt3J*-?!gez0*d_^f|r?I~MM%m^?aPvICcfUbg*%CVB92blJ^;XK>-Gfx`#Kd^$`$ zV*V@@uFamR(2odYq>qeP!R+kqB@dnIxVI9qapF?z?bo1@sW4+gMXU17UGMSn_Am92 zLR;kAZbHQ2xMtsDPoG8~d8M+0ROpkIc_D{4OU~x!vvTkw$pIs+2^eb7fV}sm^PWi- zeOF{tL}+rd?u)ayzn{{IT$Wf3=h#225n7!>3JyX2aW+dZBYk7-K3?iAs;!}AOyc75 z?g+GRxz(BU`~^qnDrc`FUs~Rty)`w~MAcTs6<9>z)*u&r#LVv5pfeW4N43mG({qnu zJJE0oVXAf9reP0p54u75aQyPxJC|7L!D0ECvuADb^@nOxgy88K`hocv8)3k0$;COh zVYg`W?b3F8>qwYAC7MThTS0eRi|uXm5Twr7?RSVb0BQ(9{_>w2jCG?2klq+XqgQD9 F{{SqFM1%kU literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/polls_16.png b/e107_images/admin_images/polls_16.png new file mode 100644 index 0000000000000000000000000000000000000000..297342b4f6ad8a523a023428ec649ead5f4cb650 GIT binary patch literal 788 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl~&YTH;k;X>uYWBZ={Uw`&- z?wbG0AO7z?{@*gPdD^~5#a-vqTV{J?batQopS$}1tUcEP=l^#KNzGsLpN)f?g^h!W znZ>|6zjWfo<1hXfcAm*!`~T46|Jxq^Pwd&g<DN&d!PQ%we>mp@O%B@1GNjDG%mcn?Ee4u)zA93K37)PiY#bhC#5QQ<|d}62BjvZR2H60wE-$x=IP=XqA@Xfg$px}!yGx$ zm+xh#ty(vWU-ZGpkTb!7kA#B@8o3NaS~HHaRHZ~3JFzZl{uALe`E4(20+Z^@i)Ctp zGW$L*GtjO26?XH`nvIrk3>ekkadEPX9cR(o(Gb1PV`ZhAkbaDV$7P>mho;UH)O#S4 zuB?^UDG;C?p2lfrk91u%** ZFtC0J_Nq)idI0ER22WQ%mvv4FO#p;M#Qp#P literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/polls_32.png b/e107_images/admin_images/polls_32.png new file mode 100644 index 0000000000000000000000000000000000000000..882d46e823ac339a91bb0426953753992dc6c638 GIT binary patch literal 1615 zcmd^;`!^H_9K~m=NqO|JZHlzco}5ja*-9R#oHQ+q2qCXpJJc9M(J)Np{fHsT%1C)c z-VCP3U_7T8V>B_g)}t*JqgvEyqatnH)!(t7bH3kuzQ5h`z2~x>9IQ1|wN(iOf`+Y) zrSr1teVH{Ym$zkUnsixK(a6Wh1VX*cl$bV6Agm-f*}Gb0_QLz*&2%y7fn_l*a4CQh z*}*OAg=iX@n{^nMdh18QeT*BAkk3PY3BzQNQXqVW zcp>;>$X9?`1!{Or>vN=tkxw3 zXflA)oyJwfHQ@&f_dVv;p;6*g{>W;TwS_{3PgvESWH6F?n5?e7Kb?rk6BG_0e-PiB z+K`V^JR@baI?yXYrA& z5{mlX)Q@~(OVBxm^d2yC8ok`FpS+FDEa+YYqXD4}NU46%F#+Dt{MiOjt3mTAy55h0 z*YIOjUy;mb$PkgO(Ar^Qe$=CN3|>is^!Ar&ZLb-LQcn9sNL+XELtGT%!OZ8_Mr4Y? z3hNL}eikVq7{#RyB;UjS8>@wqcdJHz?d+DGIz2OEt{@qkid_dxPud3#Wf&P5H}YdD>6Bd~3o%>{XJ}I_ zd!K_L*TmGGXs#2l>1FLWGB@K-A1pse*?G0CsJ2Z1;kReyt(JCnS4KBJ(kLlXW;#xC zvUY6{6?aY9simkb^m5hWOp^HrDQYTqI=SpwN!*;51gwo7SX<27r$xP6;yJ||(S zBCIA)>3sgEX-DXt+%zJIxc$-N5G|tyj|tZS*L~z8WBu9{3HhbTS_|??H>W1Dhn?M` z)kX*6`zMEEWVvFlo<`~Th9Dw>cyv1b(3uqmW*LK7JyCAo2m?EmgI2S{|VG6YWs~AapLWqMXk!+I{WtY5{hTiY>95vyR@4Y`%XmJF$M44 zG@6r2C?B`67F5=+ii|vPfS>1HcdF`E*A^SE=iM5F71^n_tIf_UmXjygS~*zO9ib%r E2O>!K>i_@% literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/prefs_16.png b/e107_images/admin_images/prefs_16.png new file mode 100644 index 0000000000000000000000000000000000000000..b218534e042f2da01583fe0a93de872781efcea4 GIT binary patch literal 1131 zcmdT?{WIHl0RFb4t?s(*>_uzW)?J;mE8TA0PH$y9TddV$5?rw>r3ur?D3L7n(kez+ z*}SV1sh1>`Vx?X}C?XO`8!t&{-V=m`w4~C!kbIW?8GG)Y=eg(Z`Q^EL2;pHDjvRJB z3_;M5;EOPX!$0_shu(3hx9|HA4s%Kl3=M>!ZnmFusTP9v`-O)@1{n+nwOT!^1M^z2 zsnc1EAZsk$YPE(=exuXr_)_p~qYrNlOiF=5BC(jw?o}tt)1u;6;>t)w&E{+6h8YaC zj>*CBi#H7{P>uc?^q!^D=~LZZ&nO+BJD_vMP%KW9aZ5-u7VZ5qY-#u~?!Iw3#RTDw`ik1$|6Xvz>)y_BYsgiQ3gw@kGiJ|0+vm z7Yri1@-fnR3%W6nf%%-v<)VvH3Q07Z&BnriEPCAe=H>2_=ge8zE_^J8sD4ndM$HN= z71z$M-VYSYO*MnkiAB4~uqBnP65*%C%9Zu?bzzm;ywV_7Z&CG`Ls>C7wD`xh0k1YT zdTBHc&uHEOO!*$6eZV+&ujVdpdYVn{EO8}#Y9FD#-nOk2-R$q{14OTu&K8RTv=WIk z3w*Om_TY9(_9MYFA%FBAim=5CKY`ascOH(bC8=<7k|$|imEAO*JA(u*h;7Y^VQWvh zqhyHKa|K^zl~OM$!UxN-y0_pqldx<7HA9^A;#A&CKpUam8p~*>mNyZK2v3(CsF9?V zQyTNS%h#)O**C()yxa;k!Y+z?o&K>6;26IYyzQBNSA}E{Om&7 zde7YG(Dar{W2K78X2y>b0{!24Ie5k8{`|y}j^4|E#;azH%qdefWmr;*{DZ=;WRXGh z4*-B$ba#T|QVa|tEW#20w}2X9gXz(=!9ex0+oQo z-{heD9i{DHSYV`g#Py|u14r+i`@If_!`DWC2y2N(C6VjG4-PbJzc(6?9ou&-1FUiAPOeF!^8V zg_M~yzt*37e&OtKWEtm`i|fxpi@b_Bnl8o3wI{mmqhH*5FypSf!jX2X2aZ`!_6dnx zkd4Isl(UQc>ke_xvk1)*@k0D77mj!Aca9eO;NBkez0&mXjKAc&eJeYmnUX7_^T|uJ zsu%BOIk~XiW2d5EgCeUom5qX2w(2grba_|DeA4A?)StkH9dN5R?VHwQdBVp}U>xJ2 N;Gi&A*Z0@%{tM23;^zPW literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/prefs_32.png b/e107_images/admin_images/prefs_32.png new file mode 100644 index 0000000000000000000000000000000000000000..52d327f138282468b4942cb27d0ec2517e10fc1f GIT binary patch literal 1983 zcmd^Z{CT3Xe5m3z0HmR==xrq~=gnvrAQEQ3X^apWka5~EkhQP@#l z#<|YMH5n5l29t@=7*`C&HS=N)bD8Qx>5d`QL*VWb%n7d%{>GFms-s~)AQ@q9p;@6rCCkn z&%KEZv&#GNn+=NSD_scWW0S4h(@Q&Zv$O5oXJFt7V_`8jz%%?wejz8n&iV|F%x$TR zQY2VK`TBY{hXme_8yOi%ijS=pRS_nntDcbm2t;%`y`3)G;EJ}lWtUO;OePafupgS) z`LquDmld(a)5V2uU>pgU_S-xKsi*48d(5FYjkf#um!zPY69IMzhRB*l76*};vhndQ zV21ZNS(Ge?RIuYG+49h@p%V+Du;o8=!_EnXfUuDbP<`GGjjzm?4p3&CK+=1QlK z`d9}PT@vzvOt$-Q+9M>YkQjZpk}Bc}1-9^?#6lsTFPmwsTU}cpZVS!)_ghIe9CX?d zCwsIWnI5gw{l_aala@1FQZe{cFh?f$QNMzo*wSlPXFD$~tqQpF;wQahb02tbYuZ~{ z@$3ZuQOO&Q2#{|(F{WljKt42^z)~C7ssVJM=iX_b+~@Y2U&_?O zt?iwit*sWC_+nabJxw_9X|R55lt`WGW$aMKB*XLaQakH~Gc?z8x5#1dP*HL<&!ufR^d?^IwVnP(2L0mqqW ztoN_0%H<4bN_e(WBR1u90M9+w)y>UKcvuH#Ywo7$dA^+$C{87=Z^3|2IJ~h==wfdg zQ?Tlu&H3k}8yj&$33Y1f>A>e5(uJdFyL6k_)zEMyqKw>lEAGY%W$2;M+Iv3Gqzud5 zo-&K#ocWgzQWAyT$tA6ZUwjq#Awf$m&Y=Bg*RwPWH30u|OP{zfDzJ7|Og0DbsT{6F zN%Uw`DXCk-R9&??b;=~N!)&3*wILf*otz}8mrppo+0Dnl^+En(AEQY-x-g9%ORcK9 z4jV~8?$M-_`ucwc zcYSuMR7I2+sEW1wRZK8YpO*dJZL6#A-mBEr|8(9m`VZ{_X4lEQa_J<_S#yP(N^I({ zXluJTLLTd#u}3C;8}Q)uLD-|_v_k1YLw?f>^F7C$dzkncqZM@?+fsbZ<p-w#;!JfS8j3#PHKb|&6iYzzQx6RJFGWC3``S3GJy5RQdm6+M L?gDGDzmxV~T3Ep~ literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/reviews_16.png b/e107_images/admin_images/reviews_16.png new file mode 100644 index 0000000000000000000000000000000000000000..2c7e1124c69856a5ec077827422ff2025740c2a3 GIT binary patch literal 907 zcmd5(|1;A882%8K(@9;IjP7z>U8tq6>|9;VO~3qZAs> zYyPd(3LKq@wsf2C1Z1<;c6Ud{d9*Cx=r$wo82Gx6$$pqsEhq}AEg^@5!UefD3 z(@2vN38*5W%k~A!r{=UfOhzwvg~GsoP+Su5cpA03F^s6kFnK{idzuqqoY5R~*w_Hw)wpc?=yCL4T(59&_{NWoU7JzVv?GOwEJBGXe0~6R`4cwRJ-mTmU4$ zKV|CmdaN-JdZKi#s~LKKH?1 zzJi4k=-Vk5u!aW*we9D%{ruk&)TAy1UDHQihNiWx=ERoK+B#690JE^1@%eg;ysjRU z9x9b;RvZriD)X(5_%DlCG+#P?{!fFfV1DP}*$6D}U=}?wnw82(W+LRM#0aJn^&BIH zNn2TpT&WLmb_lQ8OkBm4zs!)t&_VG~Gr8VK!>}F$%#* z{Gb$`Dz_(;@4J$~3>N2F+qpXI+55!Bmriiqj~Knz~L2e_GMsl-3sGpveHX#;+JR9B}hJ}t~bMp)nEm$0AboX59 z+wbS$L3MDb#vO%;R6$A#e2!0viD4QT{p@rBMdkDSe69rwx`SfF!v_WiV30OHKMz8G zvavC=>;M7&hgd8v@tG9}?v=xM7XY){wx! zdpAVL>bw_pu`-@6+2|aP16yU$pBxvR6NCeFu3Zh{EA#5Ab)U zBqo-XmVRku&Nlc>cXqN(_VdY zONk^pjW+!*aiX=g-$Sqef}N}{d1>mBw5kevabqM52yst$8BR1|1?lEl2d&F2EqP=j zDDq(D9?WLKRsM7uM5gnR|$r&4)p`jrd@`P`JFnx@};qYSi&h|4Wb0~`=9V|P$XSf5+Mw*S5 zD!o=4T8=A&LN0Vw0Wn?nw-bo3%G>Oq&2pB{f{$9zswT=xkQTBQ8tfm%$G>{@3Kl+c zx!f8q7kW-YuLq3ZgvlgH9TNcVRtC5uh!R3~#k(!X|1%J`A1e)(e?o_jJ56^B37|*% zhWR7db0KH_F()qgQvF^1ea}UQw)$Hmh_cBEd#w9`+kW#dh#4o0*fWW*FR1f0Py}mk zMy(O$I5mBrF`@+BicTNBO~zJ-JFn$4nEDUV`eD!gq7L8K!ppCFy~i$z`l8+9A$r)9 z`i3BN4L9ZeMX~K*?M9)Bn8S(#n%vEwC{*g$>urVFp7ncmbad9M7nc{shAe#UV?4dz z*EkV<)aGtxH8s_2g?!BNEQUZLRZ{Xh@ZR3ulX6&8!EgdYezDv1q*?6(4u{2JarL!X zn87U7(H-c49xkKlPW@Tf=OWsrtxZ%vuB>F{*ge7z5XES)8Ee6kO*;~uU@`b$8+zR7 zP3a;@8Yf4lO*rArk9(6!v zGr1{hYAe;(S4mw{D=bd^rE15otL@c{%3enVG%XOMGZ7nmKmU1NFK|oTVHGvoE%LxD zRD_DWDbnL&ahOcY*Br$vEPr(svkRZQ*IOEX_IO)R$$frk>7qmL12Pq|Dk-lf+Iv zn-T;`ai6T=Wgz+rgO0f$Z+0nFqcE+FJ;0$w7)i!>dTJ`AQimd$c z^Q2=udY-O2%E@@c>5%k)u0Ji+xpNuswdan#QSm3kBd~I%tAkT$TI3=td$2Y)F>dh6 gIrX>Ol~>b{48M|f?fWj~Ew2kXfy3Lsu%*QR3+OT!`2YX_ literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/search_16.png b/e107_images/admin_images/search_16.png new file mode 100644 index 0000000000000000000000000000000000000000..dd353930b2ed89d5bbdf285dc366f847211ad6d5 GIT binary patch literal 912 zcmd6k?MqVu6vnS+Xxf{GU9u7Po&cnmaNI$kNd`mcj zAnWMIQ!)d(@!y243hdZ~4OsyRDWIj%5TsXkU^VYEf&}3ir_Q9JQy`cIg+gwkppyWJ z8E_kz++bJ)?ILh$MNg+e)`#J;KJ|OB*=%wgZ#IC`3<|tYZd&Q?mh_ueWLD680RQA^ zoeS)C8%eE@9?)MeBs?(J$eVBE&A7ot&VBXyjQk3(*DDYR9`ftH6^D+^dVD3}nh8@~ z_kvI;{GmHJ&#Tc-PFgIM=bfGR9*drdI=pT1tzv^18?P5@4L2`Me*tpw=P$n>d%dig zGWRcl)9EC*HM2f=`yF2PBKi5XAX+6A>*?*`BxQmF>p-#`nd{j5}S zZd@O70Q)LiPl00zBvueeq+mE?`~>`4Ri4?|Q6~%&4y)CA`wo9<5!$9fgprzIbz_VC z{SsjF5MX2=lnB&W&(2KG`gi|NAp3qXp9G%U%udZ=XO&)LS1`+22ra)fkF}kCnOVTf zWHIxvU727d1x(}g6xx~C`U}m8%;Y@uNIBmW62@pwq~(%AyXvecboU!yQImLVuh2dc z5?Qu3a?^*xxHVtv#Pr~Z0eAGr`vsWxcV{_Tz52F77E(E&jESKV2u-lcw7$nxTO0qU zH9DISw5=_754TutPA_T9!H{7=EuOR=zjOpshL7cr9^BeAsMhq~ai8cKjUsn?BM4FT zqb%8u;7#R~500WF@33kqdPi^uqum-SX58PEI6_yF2~p=5$vO3C9IvXWH9G>~M&^Ts RCZPg}5PE8QiZq!~{TGi1So{D0 literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/search_32.png b/e107_images/admin_images/search_32.png new file mode 100644 index 0000000000000000000000000000000000000000..328e2d455bbd7cc28de3d02d911097b20f8244bd GIT binary patch literal 1759 zcmd^9`#aMM82_FmJv-G?r=*Uaa=M`AbUocY=b?}i?J#tI#!|YGP^3k38DELUA{uRO zHRUo{axG*o%i6_^jm^ePtQd+e-m~*}ocDR(&*%C4^8WIE-cJI~?a)HZ?-&F@79MtX za5u2Ue>306fDUE)T`BUiOK_ZcAI)_?O^kF-Y z5;E(mE22?aXlN);J=HM`0u;^QL2PU+M-FxUaQgJAiV}yTXq!o3(0ue7vKhqe%r-eei%vZ6|Je`}S>o9dzq}-3d)i?`joL*$X@^luALb z*Y{6=cmztGu_P!856#I@cOr81U6M|L4(NPf6|>4r}2LeAlS@C=?0~cPyO;Xma}fqaoX-!;KAfWxUy$ zPS4t=-hwxi8R;2!Bk#0np;$2c{^K{^D7d*EO-YLXF+Dw?RyQlBZiR<6NxvmiX(EXv zDWh7^BUkjwSm4wD$A!SEKQ|>*=S53jd7oep+$Q40T zTwHt{x!G`tZWritM&siOIv~4oR`3xT6yH7Y_++Mx+5+`EjNbL=9%W``P^nqj*(G+? zwXQam$96!?Uk_eNuco&5O~Un{YaeWoj&4=ZJw;Ml;n2_sN-vI}7Iu!p**IR;C#b6A zJZG_ri%S>`h6+U~PX-ml-3%cxN~^h=Z}JJK>IYQ|L)%eUx_6aUqhyF7k2_FRRaGQ` z{&A4>s`6Q-06@A=RwKwSNQk?ehe7_I3-S1BvcZrOD?=QQhj;{@54q`c-4C%p7wGF} zarmmw1wVH`pL5|st$wx$GUvo$2YdXUcH;CgWUJl9h@vh_mQG+VNV{E9pYZf z#t-iEJbTo5-eX$1S$2*-Dw-%PFtc5{Kw!GUx;eBqG)nDaatXm z@4{P**;8R|+(w)mbr$E2*|t2swfucuXARYiVS$hSV?CE+yK&z9ITLMH2UmI91}!|K zw}j1K%Lni8y}tOG6MtO9C-pO0?9YtrOYF$8>*m_JUYoWKf4O?^Q!v-MRj<*SeZJu1 z)1OWYC(Nj;61;J_)lQSK%AU~$CX~s^=$lPnUR}mGp<5a2GmZ<|e4Aa^uV1r$*X$a7 zoy7^7=(-t*qpkwghPo}aHM99a*)`bUox+45tKhK^vBN13Mp04qIr=^332EemEfv4I z`5W`?{uzTvspR;#aPyy^~&3PSuFh&wq<2H8J^n^Obhgt%YLL^ z*l5fm%wxS_C?idz3p68pOn;cwYjxKrrWeXFQJaoTStY6sD_dS&=6b0;44+uDwwhC% SXp?1dB68T#&7t@Jf&4GyAaJ<= literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/stats_16.png b/e107_images/admin_images/stats_16.png new file mode 100644 index 0000000000000000000000000000000000000000..b3f7d654c9acb745a2d263c2a985224d25fb0c42 GIT binary patch literal 1122 zcmdUt|5Fln7{@=U^E&RlT#}mYwsmc1PFc0fO>^h@1!t%jf~TgA0f8F9`3cC%lNf!6X??7lDYr{|yN8Da70`t0b| z7}wak6JYK{3p}5a(i*gSjRaoR`4p{q=dYiNX#i85Z`o??)hB=tj_m|6ri7LJ<;Z{O zeRgt)Nc~0ter)CZE1$7f_a&`3lStr>o4d79ek zK2}aKczQC6Zst^rI319?6eEp@gZw;v^2n}SfFS?kM*vISdc|)O2yOm3HC7m7QuZV^ zZDkIYDpNm&SjyI*!^_@}jMGC|y--z~6I}mV*La{qhQEKDN)%cO%H-qZqX2M`;235t zQy-5UNwL2F(?Rq#ONtd^FE1pHM@dcMWz#cQD3F=TV0}p7(vw+a7M=NRx{URu)np>z z1EUX8PN~n?yYda}MA?G}G}mi-EyWA7J8pnQ{-nGvok`8;OC`FIXvHqgb_be63k8L; zHU&o*pvpO!5HfRKe$L~2)kJuq&9>82M*HKZKG81riumLmSeld3S;J-zUunHcTgGCr zRV#-)uJ~tf@&_s^x92DYHd#rYNn3WMgbZcEzG%5E_B=a`^Yv#5)YhOgQ8q44qyn*q zyDX|}3$tV>>c;|XUX{CJwoh;;X0)Q+AH>>YrMI$~ku!XkUcL_3$g#uLi4^_ml?CtR w2F$n(sne>K-4fYZ&U#bLX!q0;+c(a85b_kJ-#=~Zf7r^72qBU9jv!jmzqFpI*Z=?k literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/stats_32.png b/e107_images/admin_images/stats_32.png new file mode 100644 index 0000000000000000000000000000000000000000..2b55aa6ed3d789cbcd40bf5cfb0f0fd72de1c844 GIT binary patch literal 1758 zcmd^=`#aMM9LK*|YniBXG*8iqIyq?(Ij59Mxok}Co69V62`yo-%{@OO>LK?u*AE*w+5=XLU@Fg0&X5ZrXNY0$SXtLU2Ad z3T;b+F2lY$$ZN7YRW7%S?TR=Lv;Fododkqa3x!$XQKU0bzVc!QiYhlO|zEJxRgdqT!Q-ahB zKDENkKfvM4ypSfcZxG6Uu0N>IrFHw(!Rl;?;RB^cy{l4f!5n_W58!A_c5#_Kw{SNf z#v2ah4Tf`%4JVN@AZ|4~KfSrl89sV&BF`#V{@e45InQ?T0xVm0tbMN<5w}Vgc|Cs0 zJXkrEa-c{~F8Vfz!}*tgmPnMLybqJ{v8RQf!b=A$s_XV=@#b7NexU81qY-j{(>uFy z$r($_r;GK+l+TqG8`MI_NhKXd!|?GL@GTZP?H{lUjoiDsZ#C`Zf46roKC?aSkL2^z zQ}0!`d9{CsNN(0vHX6vD^f;ExF{{UbM3R4khvFJYjfOsLkgxJ6^SkT6Y_HH&23_4J z2`mjiAL{JVL!<2Xi*NN#$y{b^9aT4j^W2G7otAjtH5CdK1OAfQ#9}Yc@WAMjHxCk zma~Xd7KIVRN{&d1Mx3G;k{6&_SDj0cZw06ml1f~ioyW;m=$9sytn$n%qk2c#&?c&M zyQ^4hPzR%zb~Ei>b_AB1S;B}G6+Su|d7A5nH;*l5^ji(iaGIL6>nmTmbS8(Ic}gF+ zD=d0?noLbYi#Lx7*bQj>G@Wq*dt}|CvDEb5$Uf{Kq4|{RKGxz|gb8}(%7thTYK&!* z73W#UW5&CQ%azkI!_ds3^Wl4k2OMmZQFiQBT+5K;F;0AU8P?FeftmVx980!(f7$xF zmP?|Obc~)=1?`Kl3K)4Ty+4(VHM}4(I+0EeQYc literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/sub_forums_16.png b/e107_images/admin_images/sub_forums_16.png new file mode 100644 index 0000000000000000000000000000000000000000..0c8dc9c5eddc00858ef034d0b985be430bfe917a GIT binary patch literal 1068 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLlgw3{d`U44E1-n|z-efsp}%aNfBg7$(b83W_wLQf@5#9VZNh{J2M!!Kdi3c3|Nryz^WVS!5E~nN>C&YK4<4ju z7f+wDSyooIf70Tnj@geMJ<7_;3JwnL=;*MraZ^)M)6>&y>70|1l@}cy9UdMY7#OIe zq@=E{?jIa|_UySCGiHQ@gj~J)u(-VE^5x4R;c-=UUF$Y%S-EoMnKNhR&71e_+qbIf z*43+5PntYs%G8ZTr4wajWSW|qK7RaMTwL7JF=gY%&DXC#GBq`Q@!~~s`K0XZY;A3A zZ*T978@FU+7bhj*dwcO3N#c9XqyY(IN{Ai@N%T&dyF? zP;lRV6bno!D@ua=f`Qzj02pS*zxe`8w``s+jv*Ddk|Ow6ripS3DLres-f)A*VNPsh zg2K@yIi}I^n=MoZ?ZG*j{gF2fV z4~F|3uCsJr;jGIXEzEq{#!^o5{I%AvJZFtp`R@E7F?Z4;*Ilc2Ew+-lvsvbLmwJV< zS=-WMoCd327(L-QvV7@=f~f5rTx$B$1ijM(F2^fvIy1F3ICT?y|C;(pxx-6VUjF*S z<*5rdb8AgX^>iy^mK|S2JPkH%)=w&U%#k*4*@+D`|8yz~!}3(q!p!14Z%a(LeA~NK zRB5J2&z~d0z6$eZXIxjGtCR+Pb8X6&Q;Q Mp00i_>zopr0P2-z`v3p{ literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/sublink.png b/e107_images/admin_images/sublink.png new file mode 100644 index 0000000000000000000000000000000000000000..b7ee6137715ff0be045c473feb934b8d3af9409d GIT binary patch literal 383 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl nmZr)%O|6dOi6LSP90m;a<;o|x;`kNbP0l+XkKn#Z#< literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/sublink_16.png b/e107_images/admin_images/sublink_16.png new file mode 100644 index 0000000000000000000000000000000000000000..47190bf52547b7f7b4cbe8ae4ffdf76411fa0853 GIT binary patch literal 1025 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLlfV@=9j5dCn=bfk-h5-*{(G$_{+rDGuaUI->B}!QC%!y?{q_Cde=Ze= z+Gm|{tvjM#a#b$(Li4fz3szq>%-*LPx!yl#v+J7wZ$5kvE84O4=HH?d|Kh9nMs4^X zJpZ+G>ZZwyFW4{nD;Kiq+xOo+E3V&u_`$mK!M&C{f6@Bu zQH49+fBL!N#{a~M-IZtlX4LJueDjT<-{!(ik1R9ynl1VtxbmaC?@F1F&9@)EH=p|6 zBWs63;Wg8QO&Y;##T*uz_P$a~*z30Vf6?*()1Lm1So>?{ip%?sK6?BAe^%=u-TGVq z|NsANvnK$UN|u)d`2_>HLjW+8T)nsg=;ZsJE{-7;w~`{-*d&s)e@xTOj^DI_L+wD8 z{;I8OCfwbjE3EZk$Bn$G=Sumh*?nOh4sPyy7dHF%bjQ!#(8A=gAaL^J=xdtm74%eh z+T3T>xR7tOT`MNT@lncc6aC=Rd8%xJjR9|3<0vB%4aZ@uM_#K>CX&C_?Xu3Y-eX>MHRwaqy*_ibJ!dZzfrJ$4QQ ZhLB@9Ob=bc&H=s3;OXk;vd$@?2>?P{W~2ZB literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/themes_16.png b/e107_images/admin_images/themes_16.png new file mode 100644 index 0000000000000000000000000000000000000000..0381db9292ebdb7587949607fda3f6066aac0a13 GIT binary patch literal 897 zcmV-{1AhF8P)6F+9#|=jrL`+S}gT+u?9>a;>ec%gf8# z+uP>m=DWMQfPjFBiHW+qySTWxsHm!%d0LifK2JnMadC2ph=`)1qK%D>tgEZi(a_-F z-pR?#-QM8r?(fC5tnR^a|IS#wf-iz=WVX4zl9G~bZEe%j(%#?TxxK`>zsReOb)$)S zp{u%|k%;}(d;iQ||IApzg)W?mhWGpZaBy$a(9438r$l_pP;8;$w{FOoL^(QHYiff3 z;)DOsWBM^}a&?+HwEmdjHgG|IA|l$XfEGM(dY8 z+M6|4PfLcGt!t|Im6)*k&p`j$B=@#P{?BOt&t?D2Uh}k1)CmRG006{46LVWRhM28$ zuJwSW;MJ{S{?A7HxlH)JS^vdc|HWDT!BOE+9_twi>~SlldNb3{%Y~V&d9m?@zWT;^+Y^3L9q3&6d;bMHQfq8qTf?1q+QgT;C!MM0{bam9z z(!0OJh?l2{nW%}FsEC)Sg_y2@ldOJ=p@55^fRLr+=I4BTe6g~!*w@zF*wx$D)Y{h5 z*w)h6)zaA3)7RG1&(F`Hp`ncY-YftB00DGTPE!Ct=GbNc000SaNLh0L03N{r03N{s z!)a7g0001BNkl5F;2A$+qcKrA^DE zf~cN_!KQjpni4EN5_|_;yG-zFb;|`esljK=*?{#;ED!!iNYl*yjl0z9US$hNeWbq^ XdbSlgF5ZMa00000NkvXXu0mjf5)J#a literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/themes_32.png b/e107_images/admin_images/themes_32.png new file mode 100644 index 0000000000000000000000000000000000000000..3fcafe36e3ece6049fb305c987745304235b9b30 GIT binary patch literal 1592 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 literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/userclass_16.png b/e107_images/admin_images/userclass_16.png new file mode 100644 index 0000000000000000000000000000000000000000..c4950aa7eba4c7edc25de1e440766c70687ea085 GIT binary patch literal 1015 zcmdT?|5MU;9RBoWwY;_Jysp-MY5Sphoy%<9Z93~@$`+lGr_RjQLI%08pwPXZC8Ya9AFX=Uo4{xxI;@Y1vIP(0i0ZNAY9;I76di2d(p= zx^0#vbX9j>|-bg2H9cZ1ZM*i~ImujRis-8m@6&!oEsCPDxvR^V zzftWGn!xQp!9;8{OS$CrdJ)UaaCaT81uec&s^%xGg@HgQ^@qLT*BwcmIK%C;9j;o_ zl1ZjhxLmILHRr`@uV_G2ClS=XAy;zl@DPwLJ%$9Q(n;AI6>A~@fO|l{0B%`8&wP`1 z3AE`ho6U$58*4GuuPmc$p_P%LZhL=~Zyn7q*Z7Pqu+aNt4xpBMPeUpMvDUcHaGQC$ zrH)cXS)cnR1BQXm$`=WP!JyCHZTB0>=zP~83;Y{k)C^Zk`Dqn40DyXPbV6hh?QjM$ zGZOy?fMDCGJaY0UFg^#)ETO{Xd8HHxM=r^y>?i!1S3t?2Ughb%yR1VuQ9#FY(h!$?WgrKC(o`+u7$n z&7(-V1dEdRJqNWvQL|i4OsT$a?h9E_5 V$xNY7ay;@NM8FeMAAUz-y$8<6lV$(_ literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/userclass_32.png b/e107_images/admin_images/userclass_32.png new file mode 100644 index 0000000000000000000000000000000000000000..cd8da878131c9c42b2c537d7c35e5b9abfd736d7 GIT binary patch literal 1846 zcmd^<`Croa1IItrsHWL^Y_%h^sXeMSw^o_q(IJU>B`RoIIt>vlywDVnR$h5dr`A+F znv!Q8h*#cDOHe{F5y(W7ATb3kB?KdV&+p&yeLWtp*YolE{q=aIIiqZJwDxO35Ts*g zi$rfy|9{@OZ8MSO>C8=h;g4`cKv2UF9F{&0LE9kb%dXaM`0TEC73mXx?Ud+NX|bu@ zpM!6QWD9ba6!hYnv}igeDcI)oXB9e9JSN+qzD^?D8*df@|J+q3lbMy3<>nduXLGi2 z8Gy-$O+^`;c{UYm*q3fGywv%C(ss^Y;JGOgh9`TVTD#H!kwW#xJ;517#y>jKf z8rr%jVv}P^2AWG>(BjO}PjNOzduB!p`YkJ#N zAZh}6M`#~ewq7m(4mif?kVSFtJzTd{!l=LKn2|&xi62ZEth&o&jz4P*B!)g2Z-|Ne zH#{IR>T!nqEmDAdC?3qW#Ir#EQ|ZaeR;P*Pj1oj44@}gc9DaX_rkUImy7l$-#fyo# zYhkYb&0!@PN#pf?5onyv_vmynAe@-;ztNN*09M!p^qG#_o0sk>0033EQ>_rR1qw%_ zFq`%NSrA6GB=)62;g&8rx_k6;V@12JWKT=ELZNmG;-dS@LeIZc z0S8LjO?}2-(PJtMLhF<2{IMIiZU)eI)fXSsaizD+DbNN6-nxR|HxM1ZZS{()2a2-i z+GAb4^(dE6%=md1YyH$OyQsT$s(m`g-72B@{O9HYBVsxUiz6RBdUOZUtFHC0Gp8+1 zM$~lfR~XLQz)u`b0p=!>yPV4Y<}rXP_OLPd!nPNxE0oZ;SaC6XVP!dDlKz^Zg)5FIJjC`$W&m} z@mvB|FYb}0XKP~;#_4Lu`#IKm{K0dmhhGEIUYKu6FaPiI5iw6TK^-(R8mVT~9C)=e z8F;GCEfV(&9WuDw4Esr4e7#rOHKd`DNF?^hwlvk|z_wTzUHX=Gj?Wy@`drX{Ssc=o>H4=iqpAc9DP?-@S#(xjgMd;eZW z5jgatpWor0ApVX7L4ho`eFu|XW}Ro{L4CI+Y0k2gq))$$ocPjMVLo+&rv24--|lWO eCX+8_21AbTQc0#h-o={(hwQ9TNZQ5g3I73RZg^P$ literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/users_16.png b/e107_images/admin_images/users_16.png new file mode 100644 index 0000000000000000000000000000000000000000..1938ffefd02d2a1f419b4895d788f359ad6f1ed7 GIT binary patch literal 1233 zcmds#{ZrBh9LK-Y*-EpzZCgt|JP za7GZs6?Hi%!mh{u+k=kw>-o`9tX*DD@W1MhAZ>qs=2Waj5QnsIbY$>T5m;qoo12@# zn7cvfJBh+TF_+7;z07A6Vl*mJdSh zLIH!b)yMe_Oh&7SOQ+L^7P_Z7B?$>+SZz$GuMi4_Q%Sch3i0SKc^jN6SZ?cBD@Wzb z*tXUTg8UUaWy1_$(HV_9pnNtwqR7oHThnMdepl%>mZth^GBa}`V(%rP(b9F8QiCrg zueYUnCYR=WCI5QG4*KC@@i-KXgIueXs;3)fARsI?Zw$Cxu1IT7jB8WP*|bW%ULVC; zXNsZh`QlF%LEGEgGRn8(laoy=1*>Mz4QH&@GS#(@c@hiA1x2b@6Tce_^Q`!o+##5x zk@MBp_61p8Yl%llH4eP7dnn&N4&kOW@Ud9^RwPN>I+a$hh8O4nU)yM zeh)NJOihx~Xa}t=EMX8^2yJa_`HCrT6vVB)@{tZcD^0Wtuvo|How3QPVMBxcHH1Tp zH_tO@?R3HbiJR_e{eeWtczT}LE8MhmF=4I|9#Ae@OuGU#tTa?E4W*S2?{`%X0DvuI zO=Pd5m=b}(+U@^pkhj7PZ`q%7rv%@iU{h~X?%}^9BL0NbTf~#76np|Pf`}(j$)iMH z1bOWZRFHq9CpNx^U<-W?Tm3Jwp#V{c?WGU#y&hD-nSsYH}lSpi$ChijO zWWJ4`6?godBcC_6HKA`SXIpBPYTk|}=ipWCJY6k=(3IllhrOS@R_b#2#Nex9b4j{) z@{y|d8mme9MfgqGor{tKoNb1`x363$ym$K&`C94+MIXUand*bf6DPGdB2QRV58K1bgt<#@&B$1sWY bB^D>-uTvQ<{Z)>c_S_IuFed1E0511myfZR$ literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/users_32.png b/e107_images/admin_images/users_32.png new file mode 100644 index 0000000000000000000000000000000000000000..87328efbdcc8dbb45fbf4c02492c5d6cfb2cbf99 GIT binary patch literal 1927 zcmd^(W%p^^F+U2>73(IQOT3iPmE~vR4!AP+>S;kR5aH@oZQ?%y3@E{9 z=&s5dsQ-u_GcHAh; zv?k%K>}4!=)N-ygk5t)09RmTR2Tk1z+XA+134YI3!2R^a#l@Lgj7Mz4{m6*T5f*2b zmDmQ>xS5hRY>_zba;jZk=N4FB-4t;CX8#^aT<+`bjgEdgKD&Lw^eqx~CqsaFEex5U z1*zJ|>K#~wOADj}MPG9f7hH9F1;F-NVlbGjSRY}L$z-s-j$?rj61+;KT2(LaObjU4 z4PdDsEOX&G(av~}YIT8(wC0wCM&jD~E}8~2?M;(Rm7}i{3WgOjp}4{$w&NL5Q2U;t zD3nrxQUX*{leBPUOCxiwJc~i>mjQmQFFVFp?1LJSjeU|5CltK&Si?zf-zWbcz#KIS z^Q*kOp0V6f&E0AlQa18IT*;W%eSCa8o-YIFWZu-OctZ`Ii*3QS8m~+cS5=Ccv@a_R zP?1^R*ikQOo=twZ^`&{`MHGM_#zJLo=N z!W&~f{%L}Q%D+Og*>_vbw**}Q_?7F~D6#&j*3_aqG@l!(3jlyE%|}EC(txn8w@|zF z|5*@f<6HgRpU}bDdtgzI0b1oDL@?S$IACnYePkj6ym4jS&#M!h@mr*W03J zijNGSX-8i~9D0sG8h*Chb}di9lr#Lc>j=^A`_B+G2QgY)gtM#n!okxYjhG*Iv%DtDHB89YL!TA}9WIrT-`5mm30n#d?-l(Etz(?Udl-~E1UIK7o;X}3 zb|>bIQ-ec7Wc>vJ>aNW)crHF=bKuQ6A-0#L)dIOXi|!g+h#0%H6QQWjOj0q91b2)VR^F7Luo=e_{(RfFt*N-BbJiQ zd(y>4cWsUM{{BiI16w1{vpK2s(vDv33XYCLNu!z_E3#~F=@$lTW$LPac`DU5ytqmmvg9DTjd^*xyNiJw?QhwAwDn8+ EFK-ve9RL6T literal 0 HcmV?d00001 diff --git a/e107_images/admin_images/welcome_16.png b/e107_images/admin_images/welcome_16.png new file mode 100644 index 0000000000000000000000000000000000000000..e0ccc3c55f81d4ea11c7befbcbc55f5a1fef6451 GIT binary patch literal 1024 zcmd5)`%hB`6uzXgDM5#E51Gz6vme;h$TF_=1VNUUmlKJEUawzWUA0&&X0v%^WyN4H zEG;d8AUHca8;L|D5=k%^G#ZV3KHqM)cXoD;jEwMjys@z{r_(t+JgiVC?hFkDT(PA2 zkdFR~g+%J<>9PCK<66i5{gacEx4{jmRBAkY7}?qg;qjXYvR;2JmPoPL?CI(0u-|dA zIcPGO)X$!IoX#1syXCGgDEVC|6b7i+wzf7e40DCTa5(09&JEgZKaM71u^6)c#iltk z>{gg@r+a&Q`xy+mTpkLAK%tN;5DYLFedF-0r?#%HE}vHG(P}`h$cn=5P%4#yKtO4T z%u8RaPW&aqpak@@Zf=fH51Bn4fk5yo8cjmS#UfE&a~R}usZ=VT4@RR= zkjMA?{Wh5l1VwZ@J!z=*UcXMG(SGgkcY8Nc+f096w!(0tphTrorBbQE!9lCTXJ9g| zfq+8zgv$k^KC9d7HNvn-`I1Z~qe-lDa`a?!|G>Z&f)FoGOU|En!gk1kz%V>DH5Cqr z(Xg;Rj~Hm=_b8>sW$6091t8m)EkcE6Q}WMI${K&5T&uo90`RqsHKc=u4b^p|Qc`v8 zPfb!14t>}+3JLh~oOjX%m{#%0EP($9ZQ#s5SS6>y@VZiepH1I8F>X505O16~d$ow& zz6E@c9AVA4=Kfmec0(PQV`jpQP{H?`)=S?xD(Z=~z~#sc#~pa`Q8JMS9(?%uw&#zI zRVY&}+2qs28#gbd@k?+1TOYq5{Z=m5)LHfcN*eW^r_Emi7b{O>9nvc^YciUAnEPMXJ?@rBb}(6-C{We=S>gxB5X}|>`g#qx|@6dj^fCzbG}dZsa_0*aSOSb eqTJEY!abVq_R^C3`SX% zQW&%f2*VxsT>|2c5!jRU@-TKsZ1D7N=jNOEvXLVPo zrdEfBJ_ZM`Eit^jyd2WN=H_NeNr^}##+R2nJ3DV|Y=Av`BofKMz(7Gk0Z@rDGBNK!9NwkH@dCugm3f0MtUEP@zz)3j}$2dBEEn0HfJCK99?th9L3H z8?O1Fyu7>~iG&w8ypd`SkN2)9mQ@>gKH>wgx2I943;zCF1S8MTj}!{|u-B--)n)aH zw__{^9yFWMtd*KtRxu@F4QMKvo2qaZcN#d7c{JG2Vm@e>p) zD_lnht)YR2Yg@iz%Z-TOayZP_u8Iwj?Bf+B@h%4Qm~CdpK6!GPuK++5UdW5AmOpsH zfQJxZ^5CVwBI4-i=BAv-=fff~5SdBjn;U5KKhs976XlqHmEgu0vR5c!;I*a2#W}io z@PZpIB!o#CAIQwCZiAa&_vXFc(DPTg-JMaZ)y=I`3YmR#~B=VYK1zhgdmfX+J52vlo9X=o__nZ4CjI)TXH3j`tY zGqhF*p+r_Q3t*v8&474h@(zy`DhyvLl&d?BY9e%1ja-MIFCetPPk?6pe=aCMrgK=s ziG66-5OhF%G&&{XUKDgTGX6%CnMZ8IttkJfh{)8$ktjzEJghxj&IURZ<`7a6jH3?V zgwDu>Y^dgt?Oul^EsJ(v%)6O&t#p){Pwrk!so;N6N&Db^=E+mVf{aWr{ENN zDY7U8O=MR(SkROhsysLBKi7-evb`_EfVq z{q~V9wfs$KgRDz5v9eD4qrJl6t)qd{kB+K;CspOX_^BqWyCvzW$}SFGOsQlU8nk*4 z_m8xtrHS9#>_gdk+I8|zWKb>{YcMl9%x+9m4 z>mZ-zraBu*F6cw+JKwxIWVRJ^+6c@fNiSBT=MTSH~(^%7WUwwE4JF6 zw>@P>$n!DjgORR}fec&jXrbNob@v_e#@G++{rl63o08fe+Adq#p3pvh4rjTe zrr6{^rlo_&ki`~|6;9^$$hxj_yJORlXZbBB#!laDd6X~eI03`ynPw+0ei?YV3>_b` zGl4;a`t=}lXY}OVhdQnSTMcR?&k1 literal 0 HcmV?d00001 diff --git a/e107_images/adminlogo.png b/e107_images/adminlogo.png new file mode 100644 index 0000000000000000000000000000000000000000..359480d71c12fbeef0ed0109ce4fb2ff159cbe5c GIT binary patch literal 4271 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 R>JR_`002ovPDHLkV1kp#I4J-C literal 0 HcmV?d00001 diff --git a/e107_images/advanced.png b/e107_images/advanced.png new file mode 100644 index 0000000000000000000000000000000000000000..60c08c1080c19eade1ad6a0f935b7997150d8fac GIT binary patch literal 4987 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 TkoRfx00000NkvXXu0mjf2ESc! literal 0 HcmV?d00001 diff --git a/e107_images/avatars/index.html b/e107_images/avatars/index.html new file mode 100644 index 000000000..e69de29bb diff --git a/e107_images/banners/banner1.png b/e107_images/banners/banner1.png new file mode 100644 index 0000000000000000000000000000000000000000..e7e4943f45de0b255f7bed34dd73ecf93f845af0 GIT binary patch literal 30779 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%0D&~_9%%^a+XFV zD0pE^ka1s^j3#yNh?hNr5*H^ma|? zXse5G=dNw-BbD~{art~fJ%v%0jJH(i>l^6m+8#eH%wKtR)wZsk<&Ms2(`JwBoKbGA z1i3tGv_*-Cl$4p>inJt*N>Qe_%XZeVZDyTHqHXGU z6DcmlZjc*uIrx+@YDD5ko}DY{y1;aWphEw*GxE)lYfk3;;i5FD$%k95H3j6S&i9rnk4NTyB@Qm$0jr zG_2q9>c*{G+A5PLO_qdrda0!ymNe{6)+W9Ec6zO8v~?#N$yH;*)Kr-h9g&&~OWZGI zWkh4SngnRC64F}1Q)-U!oSL(++vLfaCSs2<^Xq0xHVWizOcg<9;dCu!e)Ft^^#QW5 zY2H{ClX%8FnXYIsE!h;TzdnZE%$6<^m7<~B<_&rrLLGMjeny5oI}lA&POkShFglv| zT}>PaIhOhuoc75w{~wCSK^h{w&CFc`A?o2u8yo+vutoQ?3}vygh{j8 zU=8n>IwNCC>!;n`e9Q0r`PH#R=-ivXcmwsYds~x9>SjVP=EQ{bw*@)#3>fcP1rjH| zQ92n*MhGljrK!fq&C`_TwWw4>@hu_{iDBHt1fyMBR>{U$on)rMYt7k89@BE~CaFWF zAL1!xnw6w+u}rjepS>ekuE4h`2k4#Obwrfl+g6z*fwixD>ri+1#E$lSuCV#FP3yO8 zD7AJ@n?1WSVLE1b#|kJ-C(#-Z_B8L>SRQ-oPVEUHni-z3ZqI^%<`Ln4BlPo@+08UG z!)FcbnJ#y{HfX8J&l&=f9A=J4!I&2%SfKa%b9bH)UwP zWDTa%fuv%sd68+kIYezB40(Y(N+T7o} zBNX9;$@`4!oZcaE88f`NHYdH>vB+ixR?Q>GZocHjNisE~Go4hdYhhWu79st@CTZr_ z#BQRt<}#$}7U~o8^>kTY;~R}NAEFC5m4vLx&G~t6m%7=@gHi=fxKD43ntT+y$<Qfn@H1&_5bz;@T6Ucw!JN%qNi-&mzR;>pF2En|~0 z1Cci6kZf-=suPJicVlZd(X?BBbgW`z;T;y!eH56Z%=tY7!O~JDbVg4NfwVM36BykL z1n1MLd;Mc0h}HtP%YWGoVCmkwVGEPB?N*NXbzPX(mm3P(T*_{pARa|965+Y*(BAd(+j0K3~fC)}#8=LcYHum|jeLf#H2HEDg zvrTXU{24IevoYbofB}gN$`TUVMY{?sY2)nd&Q9q1s=K2d53Q7$9-!x|?K zm1Yni4udFs53tr{glAk)&c-XDkFn?;;-7Uu(Xjr`8Lkx5=PnivhH4X{XkH>QjZ6}5 zxQ2{|s!`X9F_rOweB~Ctp2Re^S+IOF3|T#6{K}9>t90qvN5$w-EE-d?16@u0buUSuo#F1UdN73mYdV3uR2LW;H`0S1ACP}r{yh6u<@k+5=CYjE{Nn4*Q9r95>-#E^%a zyhWdenVc%c(G)4H1ngv6w`W5M1&0y=Jq*h|rZsf*HW{NX`jrhZ^W=KzE>U1FCW+mbuVM{o;ets&$Jh z>k?Mxp>Wgc73Y4)PV@fOegvtI7-b@&k#LFur?z|L%6D%1*4I|8e5X_@opt7=Qzy@S zx zg|y|XaxPWuM5IE11T_ONn5$~epH)?}T~(1ud3xg*BANti3VMBv?bMumdIE12y3+bp z!M;X+k*TuU4#h`}1G;@`42ir&8%) z9|A$9+9Sgszrho5F^t>;7&^ug&=Denl1du9KKT&w%SA6udjbp6=Kybm!t0Pzt4MfG z0iCwcW)}xWP=*H>tGa}QNW?|#@=2~p1kCAJ%tbCaAQ&ROT2qbus;x7K4l-z{W*QmL z{Ry(q1aJ^_jKNf@nc_pt4Tu1QAe~|6{xOaVWYQE@vf{iyQn{OlG4B=5DIWCAYBUVittKiXCsXzcp@Xy(> zN+78pGabGDO3gwu_cHO^ zCa!ng1LlyCga5rSuNUsK03J%~bZr5DgL#Z{-RbArEHlVI2-a?iR>S#Hfn)y(OkBf6 za7y(CcU~b=iM~~pS@B*|7D6>wnA%NB{$N?>;}VY4dwFrLb+Ui=IQ0X{MFBPbZ@DvYnU^4 z?#DiP)rS@yQ(s^2@6`ZSDylG^gKMsIlKLa{pc?OfZ40kKwero-HyTk@mHiTBC}OXo z`nU*#$E`*U{Dka`CWDex?xXPi7;@3I+O^rSCsYJc%i@yfu8!|!k8@S754e)abw?+g zDt{;9glG^$%*E-RHw3c-K4@`FkWoLqgut&wM03+YUIPCQ1Ft*-Pu;LbhWcCzMGJ-| zHdKwEPc1&$zVY7sJvA%bs+I5j+qb{5dew^j=*a&29di8_Z#?;wg*3PNOgf!T30ht( z76%7%^tiKg$GyLKaM`O*MWeC0y82U3KmC%+u9!S|ax512K&qc!8jVgcX5d$d0C^s$R-FL{~ekWgG^VD~5{Ti^dF~wTe{PAt1$w{i12J zkRH`&Yxzu}x?ygL!b>Nn%b-SLc~V`c^b4}u!oOwEZ;yCYaN%I9VwD%UAjn!=IXxM| zoDkGuFAr6`I7$Xslt;i-rOqneAxTYm#gzIWwTZAMS__aGMIpuB9ZkqnJsPgL_!zd} zHXtsA85PVNE0;=l-}&En+0X4PbBg(VxsEARdxa( z;$c{R^3V^oT(qhP9MGWEleCii)#onuFb<>-9HYC&XodKIGHjUIMiX!K6PKonSiwjo zI;7<8sn=sb2saV9@;zl%TefDA zAe*?d0Z6a3x4-wT8^8MUOD`0PqlX;4@N=KJ;jqIGq_^tp)0FdSwH1LvaACAKFpw>m zt^WS((@(zi;>(X)#Hz2$oOF8HtepKGk??Y0b8UF(hr5La+kiW~wW0Cad)nNdWxu-|kdta@n_9nEZvo8Pml?NYkXgXatE`B#fS|K8WBte;kbpC=S zBaiz7dwGgqi#2)+79xBBIt+k%j5YJ)d0`xgppr6^kO^gr;J`5MTsG*n=B9UJG2%vi zN;Gv}waR98e97DDa~~p!UogrOVuAQ|Kt}}3{xE`PalEkz5*OXRwhRr|s_JeWbT)Nk z8IbrDaU;l}#0XV3nnf!_y;#+V<+j6OM;1Hgm+gjFF1?kgjOC#QeGX-Y1lCA?11LF? z^Mqf2A-F3;GZZY7togYV(buj!**@vqmV@H+E@$yAQ)JbOw{H2t_nv?5nPRChXZC)d z`ox!yKK4+`XB!&o>*`W=!Ip(81=g#jQkhcVLc#V0zwrF4@2q^;_7vA=jy`tbg%>ZL zI%QfSnG9+0`YD#$Y()n`1uvu0$&R2N5)Cb*{p3?gh`=6=2K#0Ct}A8xEyzIKlU1#_ z2=SO#1U^rtazYZUwF()*{Fvwl{tfPYqN)^9PlzW6b<>@q1_9Mjz}N3tes)kQmG1oc zPnX_$b8a|G(e{*+K63eGS4^7R5{pHfo9&Ga)oL^A>RfJwvfy&LykT9(vR7X0>)Vw` zBqvUqc;Q7KIr`XRGnocjRzNdU-VenCaWY_$RP7E;pjzHOAWpRNN}-~!096kS(#L^e zLh~|XkavXJfEC6a5Hnxh6jjDVg;&L>W?5*-ws0LChE_HA@wdf6w z^{k^LXbOY{uuBj}T`@U;9uY1Ajuj#&t6p%b2Yx zPt7;2`p&raeEriWF}Fhw^b+wtxzxUS(~V!h{^ggRrzkmj(zJ^|`q>jtT1Wvm(@>Ym z)S=LXSNvM`tcPfB^zZ0sVQ^rGf^0TB^v3HeH+QU~apLj#VMiSL(Tgvl6gZwpRLnfY zMCZXuX?p8CjB5-w3~vML^UjOD&G);a?(Xn=hQN2J|h+D5C4k);clCMzV>+g zw4*C0T|C_05FPpSQ;&c7`s)Vz`zThPbi%opTztiZ361o6>%?Zq!;8WMRxB0&$Vh%T zmoFA6lP&_Fz%XlZS^?8-~`Kj1*e3oIWhBXV%bJ^{y= z$cx+}5}lx!(VE9d(<0zq^cW>>H|iyx2gz`3n=+MHQbx@SGBFp^C2g1_I+V*MFr) zX{vC5dZAeiKd|ZrNt7GW`QO8ld5wJrw&|36HbDOZ`l53g7<5}LoJGQgN%Z>!@%MPB zTBXk7K1Q;)Yvt;f=oh4pV7W5GyN!rz8fMFwSh>rylPUpyAcVuHz)4E692CVik~#!R zz^ZT~IC0$D?3Xeu%CgGr3Nef)&$A}(MFR0IkZ-Dlmk=-&678?-z6!zj)qvIP#R5Ph ztIa078$WZLo$QU3-AEWKpkt`4{_lNv{`Y_WAe$XbCDUh~vE(1l`G;66noK5JTAL{I z4JN#TK~vG^^P?lfdHPFX*E{}U!)X5f{n?c(R(0>{viAbl*PU_B8H-LhF_UQ&E(lK( zHSkr2hRevnQ1=>C?ALNOCJH*B+rJW^_19iF9K>~-MZkImtuVbD;fy81XErPpAH3fY zV@n%dyZ}{qu-0zT%Q%!ysa>SC1)hTUFsP0S!?A~@D}DgcBN+Axw=iWxh_JLhYbnYO z9*si-lTMWjMo127Pb7~Lc~uI?h4@DW^^imu`YWXw&GpI>A`lA5m(nbudq_BBq&e^I zRWf)w;hB6(3v}{AFoyp{kWfp6MMSar3DmS~2~?H9N-Hd&)*eKFIhQ$Gwg_KFbBHfr zSL5@slmjM)5$vnF0orR+OWAc?eu_OrnA8aDJJ7$1tPR9m^IgdMaO1Wl3E#W^Bzs@i zj$K*aDU!(LM}}|t{td4zdzQ*{=8SzVy70OK4xCG))YYZy>Qj`r7K=e9Hd|7ofJ>=v zK3|~640FTqs$?>8)Q65}-#lq^$NK!p=;Mz)(bc)*#8XahX>Eoe+g z#ny$Eu(5TbaDo&d!!9M1RU<$F-GRVz5Piio8S^f~+{yvy=0Y1ce8q`At-{U~RGkoY z>_JYAkipF7WBPzoU|%{DG@r1MoV-(2D+K}J%vX+N zXM}Sql~=}>*TQxXJqLuiwM#VR5N!km(*{|`B69w? zzb+6f@{eFhS{*HMa&k?4%RxGqfx4$``f;VotK!Z*PNXu!Yug*(x(h5zaT*Y?&CBAH zTXP2y(PS6?ET;G#r>f#NaIQsE-;mS-qKj5Lfdf$YQ5X~&sJ7@i;R@$e6JmSNimC@j zxI%F5hqOe5c=FJFU+k@BSig+OnpJPuj@{PDhaIvg7K;t%@^y77+H;Pt7I_2J8|Kob zuuBOqor2{6Eum@y1^QC4yng+<%^mC7+U69Ch0ZPSO>LW-NM>Ba4Ffw4A@Sl|0+)Rl zbHXZJk*<1GD8Sn#RYB#*z+Zu-3sX+!z`lkaKcxUgH6bJcRxJNw31omxVvV;-1=AO3 zkfkibsA({KWiL=W*DIzmUkM0Ab)CR1`1%~6sS3nf0xke)OK$`?;}A)tBt0OhExs`6 zVvk;fD88MqTs9d!a(30Lq2{kG5D87;!WNU6SRqivM^wd=N&&l2%r^{nUHWO2UG&6~ z;4@&ggk>O97;3MwG)LUAgTc(F{d4&+v<`_TbR90rNYO^3>aD{1of%4Qb%joF#XT-Z ziGJ5Zm(@!Fw2+u?V?!)6?=hJx&fFyH;xON6%Lo!1Jx&fEg$9EFymU&8 zd4)16xTQMZU_FTTN^jMg46?U0SFtunstbV_Rsk?&!i^kbk8`Taej@Hqg#8M_%NQ@8 z%a{v7Xk^4)4Fi1uTk5qYj4jrc6#Lzmc7m7@A%Y9YcJ5h{i?H|>TTFAGJ>xD2$*FCZ zF}uk1S)0%}#RtX#TQ3po*kV``=0)(o7z8_*U8VK&%;LE=5 z0|v1DHxi9f42{L&@pxia&yN1V-dQvDoj7q)f8Sv9ghtAOSvw1bVs%MDZfMUK0` z$+jFy1fJlO8CkPt)yuCuna%cRGL5NZT?E-W+L%eUO=+4rvz5an37VJ8>(q+qHO`_f zm?AKc!N}xSB#yCPEO;8>&?jjHXK~1bGJYK>uNmAB2+~)nZ90i%LIVB}cjd}OWxke! zgqzRx)`^FVfTgc^0HpSDcI25qMB{)P4rB!Z3s{=~(7^&Dl4BFGA)y!o0Ghyt0L9}B z-8@Doov@S$Jdl-^EDv<64K!YVx>5DK911fl9a-j2Fc1VZL_B~ig|ElLoe*ubVYhQz z4yY_)S(nN-fu$iDjoI&HD2%?lY31(T$gsD=Ucb79gEMOF$+_85;u5 zFz^cV6(nUd6cVT@j3|is#C7#ZudC)LkmJKb2;vK*$%MEs#%23O`SuhI9}!3^IzZ5Q zmlx}n0CFo%5O}_sjW&WrXM=YUXxgK-Mp~bazzCS;Z~Z2H&?gj_{Eq#g-dk;7e(7+_K7v1f9X6Jw4t1{XLT> zPMbKfEgFpq$L<&ddzsFvHLt(%=5r$>!;Ov2sZ<^PN5MB9PdXZbdI!qy?-(78<^kvm zc?n@M(FvD`{S!e%fUkf!l{g8ZE8So=VhD#A=(hqZP>!vH#C#!9D}vN{L-2Pnh~cgW z&BkQ>8ga*hd+MqaW?5ko$yHAQMi{J_h-2YH#TtYN2M7l>%iT5vaNh#=755)MaD0n$ z#oQ84@w>x=uaCR&UB-<7`pbF(i+)~zLb$3WXr;^4Xxj8ReC{UhX;DGG0BB6K`VL?L`v<0Xu5&lgM zf0)3?UivN#cC6jEL0-HpP|5?e7by)?1DFXBqnoZflyD(H&f@+f;xW6Y7L;5)V#4Xlc3gVH6&(8*MGX(@tSRZ>*@04pvXKAiyKEayQk7y=}NZrD6;KOA#ZJMjLW) z{U3z!9ATM7n6uoS^nl-qQ*1tLG20<0r+KhG4<|xaOYv@EF|J)WjoKwffz}Go7zT9} zqK2w&gKyiE2GBY;Wipv?fHy|}VJw{qtXadu+4lF>x3o-dZfwQa{8GV+f#y%Od&99s zBH$_ld`JK(G0aW$mpjPiJC_0d1(g(@A33@eTbrwaHu2ER-u%VN0gZ{|6*m3i4O3APB77$*hE*)n+ z-*_}`IiFnQ?pGIxDFxoSvn!kJpV%^mqNL?)Zb9LK2}?TLG?nLYp1 zgO9tC$ziB(+Y1kUt7rQL8e!oXpFjMhk5MW9{9hKq?wYah!t*}$Q_=an8lt6G+HImQ z;nzI5M;rJMU|h5&8Ea}x&YIr9eHXlQwy3d>7imvDcqyN*8LDss=xuA z0KTFitI|qPE*zUS_!e*i;4*)oxT&h=utjD+_kN}v2j9ueIrF1 z%f|?YA?hTjsaCCirLVsyovKTx>lpH;QWShsN%}9zuA~yNgya3d=~SX|LV7}Lol`L3 z&o$^;geF~5w@pvR% z7jK$SC+!qq`?$hK0^dZhVQE)!?uX^Xqj?#GUJxvvb=Jn5cpk~6rS`_AL^7UsKFEOh z1B_UxwRAbbH%E*7ge4~1jn$6h`Y7t4c<>My?czG$?8f?CY&`}76^jrSLv4lnvqLFK zU_;p8d*UH+O=|SkeP&?MNkhUDUr^F7@^8q7=BHp*bE;I_>av1XKQ+ z%MY(v`+8^BW|~!9x}E~AKwg{q#*+eh(@C58(xR!#PMa7#cy4^w+=T1D7jq`S3#{px z$sfu!$rZXv3NW0j1ZxoR=cQ)QZk0BX%#U|3@ZgH64-jz8LcFTXy^wA?`>eAgv@3 zLVHo}8fu+kHzlUC$Hs_#oKXnuRoqWON zCtq;+eLuXeu0GZ>Imtk+YtyTjeDT)i)_7Cvq5CX2cE^@C_C54aQRth0d58}26Bl2{ z^8dF_9&*}}uN;5g)o|kJ+tu}x8_sE)d(gJ_we)o1sh4bPU$fOYzWN(??tAbeTABNQ ze8cKjpQcx)&pqgxZ{C%zZ|vRKMK7{w^z@*kj-N6)&ifX<_UwaC+`sgnfBFQyHIf_r z;g`-i=ZdfFd&r{uXp+r#lA}+%Wbt)3(Ssj;>FiTJat%F&$3MLO>BI<_n<@!z4zwB&pq%xdU5_?i?09foivk2eskNCf3O8RY3hv6fBm+( z`yKSclMg=d%cZ%Y!TL<&lB;hx?VOA6`RR9Pc~hp&_}x8Aul@2(zq@PcJr6HqB>t+! zi#~Sk4ac2)=B?lTri zdg|l^j(OF+qKieMnNUB3bP!Yl&Rmk~_RwNzgVtycU^J#+%G2XW<-`{@(_F3qYH6qo zO#@5v>U8C?Od)_`pLU0Ai*lP7+Gfs23S7(7KRH&90l4!yomB3v-`{&ze&@QUm)SUV z_kZ2?)}MZS^H1((wfIvVo-+}jxUa3N+qZR6Xglpgv!=D#58c1M@2pHbd;C0R9ieP? z@E1?t^T|(Ld*Z%PQ8SwMg#DthtnFz#s}qku?wb1_`u%V3qQzbF`5Tse><>Tr!A&nd z{Nqc{JN|)t@9ODX_sfT#n$|Y+i&tOr#vgzDrLTSG#@oI#d1BMu_pPJt`NGwgv^Aq6 zW<>-j9Ch`j%l~}O);Irf>Bp~q{L%kuZf^SA)t7$lOV>VKXE5Zg_<@e01xp zEz@TX=LRo4`-I0I{bg_0+Gk%`N8{aj$F0vku=JMO?~cdtq?V>%-$zUA`pi`qZ(RO| z{SRC~k@x;TJT+~`%wODb+fet~o@n-|hwr)bHxIT=pZUVGPyOgWZd!c7+4V`hVf~sT z4qNd2t83{5`}@0>zW&@p=U=$w`DdS`6}{rJOK$k$wTl)ly8XZJqQ!mslS`I8{opC5 zokfrT`s71*|MsDVhDI+dz=jiIxFuCYQ4~e5OmJj_Z*PHbAO?nU*;y`P`+P0SibkDM zOY%|SQVFq(43{bAr4)E@u$Q7I<*gBW^9%fdW)x$qYwMuDKYT z1OybIyEc^)d|X`~1@Sgtk7L#bJ!hpU2uZ&ULVoFufdmv-OYk-}AXCMSQjO38^9xn< z>#r?e`Nr}yk2{E+PHCGtRCc462`ZHFP{}?WX20~*xm%>S2pTNA9O99OAEZX>N#|Xf z^b3|WO_?=Z zMjyH2+MnHW({*3{&fBjq|Mt>*M(mt1rJn^050{k&oqqn3=bnA?+{>@~R&A0Uoj#_BW{tHe#_tO5N zUHF+7Ecu`RdFq67FMaso2Widwijg;8TTcJ|{EpjLlG*z&IMV5h^RBqIlxpfLnucpQ z{UEBsi*f7)a;##54ZbgKurv=T9eLS&MC^8Oo>8&fXOYX4`eL#ECNt-b`a&U3|54ne z3E3@rFfx*B?^w5^yUW?K7InP3DR)fPNkG)f;-ktcvT0*vFa-wy)D46XCSM_CQ8qnQ8-E>Jp-ag z4y*80&jdI`F5?#Za_FeDt~q}3R|Lg*eyxk3{W-LG7kObF(}(HFy2huMzdvh!8$Eev z#p?ZzI_s}a%+cY&2Y++t35&n-!rBT?Dh=$mvwCHd)ihAvvc-;Umxa;B?N+`>3o6?s z?zHFuy|r(XCzb#~HYEye)Kyv&Z9-i3nwcAJRncCaY5r8vmqvrt4uh`(iL7G<9vrZIF>HhUJMycIjLFA({9=tMpRH_QtjG}&#eOqLl>WtJ?5CU+) z=wUW{m?}3|t_TuCVk43ETx*ze)XEorlbLpM)71Izzw^kzj&+Bf^9`1KWTf2JTj*#X zW-(i59sTN)zqe9{_wQJ@^Zm8+PyKpFhpp8cU%5ZsI6X7-Ja)>$WB;-6pbvjxzhgfM z%gy!M1GcLx-#0X}Ylm$N+DS0l-BT@&sN$lw`cnn8V45SggA})(!)#V9P!cZJL%9KnKbw47azUz_`1XUx363A{DTWl z{X)n4c^qrl@?J;7?2(SQA0EyQ_Vg6mJ4R@^^nhmQ?S|IbN5B5$-A6CJd4%kfYMQ=f z-ST;hKHt$k(lG5q?>zTwDzWBi^E=*tq;LDWBhLM1sYJGS^)__mX^HKtmmhP{&Cfr4 z|IYT;jy(4pljk??=zPC>d(Y&#$8^7c+j9@!H}}ZJG}>E#{{E@g{5IT&jH7+I{Dx(}TK(+p7k%qZwO{qt zR2X`p;hRNt+zva3Jnl+dDwdsnxHf`Xmb>GyTvnz^h`(Z?Lwx$ZTrSanJ-ywXU7OiT z2<6fYc?HAOkT>n@?PbX8>^Mt^hd4%Zqy4=(63y!E;Ov$diJK`9fZ74T2MZv9lrqSi zHB0EYSAM8m9Y_T(C~S7m1ufw&4b@0#jYRq*zb*(c#~3YnUw$|s;Hm0Rgt zZk@NdcSpwyzxo6{jwKsr9(q~t&cPk)|FrRC+XuR<#XPu8Z$q%W9@Txgx+1chK~%5Y8Ufao5u|F=0=OzY`=}^eNKeoY`$E! z`gUep_g%cRW7RYNbs@c&nYe%3Ay@V88k)Q4`gPBI=h5#kOf^iiBj*bAqE=SJwBym+ zk4!$`5_W6uF<)N$%(ox?ce|?7=AYL%;|yApnMYo;>hZ5`T>fjCGac7MS-W~=%c2K8 z?9Je+WRea0P=Ul77SKFfW}Z0I+hxUO(&LHyUevq2OJ{15@X<%_Z@#SS~v6nJn6G z2c_pFI~qOa2UdH>y57Fs8uEJg^D^XRi)@b9mpL(@Z-r6ibe?SR_=9$E2s4xU&3OR^zfopm@C}qXAGMifAdg-_SI?tx5Be|USp5vU2Id0!5d|V76Z8IeD?*B!c|6**@XXL!? z3?i?0Kd*4|I?UHbZ(4f&{*)W!_1HXj&V!I%KV zdB|d9#FPblw?owVRvUpEd!4V1sgWtl+CE=p|1ZT~%Zjp6HRSc~=jE=3v<KWIl=P^R2FKWeOMr9hAYx&q`z^wfS56=$X%b93~GNw}v`G6bNTChYUORYh>u z)@phdTc5(ot`!Jtqr$qvc~`^52UUKP6^Y8Fq`vB#kjZWfV-d8gXjY4uTt zl|MBWK;TmrRqbI>Vwh(k_(q0GK`IBYh#dA+c5r1{K!Rom2Yg3|4c;$ev3+LFa~1?X zWKk}c2(h%?4km%nU`O*JZ;JbNHRPr7DCV+%^aka>@wl_aA`-D(9EE&gvH2BLWRTH;QM~Nw?Y+;0|1#s>W{Wz6PcsBCT4{^9q=uV z8q!D8_M^bLfu5ee$&*_tKSq2%nFtVnZJJvyfvsrBiC>Dx6E5Zg63Z<^2MEn9J9D#c$f`10_-gevawu;=Aao!SP_ zIAWT9#5$XI4N7}|Pi-#azl(r_7^L6Id+n}^>V-7c?I*!AIUYYFLVs~tZ61LTg$L|U z$HBSz6JUq=mJNu8({o0L4~rMpU`*D(`*u&?&Vvp-vZ0~ASS-m8GB^ip^RM$!3+FoL zzmy3(;F~O$>onwb_Vc=LZ-B^4A)4N!5Wjxi=ANGJXf!sE8(OjM-F&&BVd4~oH{N=IQsB0>Hj1j^#X9`8I}!I=oX)m1dPJh`j);Ww&WB_o z&7jssTmAwEwyR8d8`5R`!{WRuTaRxVu{V2@2}a|nW$@Pm@qe0Hw~kxv8tk7 zp`J-Y0n4r9FqXnR^%gQ8H0DfdE;snfxCir#B5SH`=uEu09cV8G_C!scCAARlDfdpc z1cH!%N#nDlT%Wsxwo}xiRRf5jb-k*9juZ$ zc`Ti3oL3l54~?#FN);%oZrZ#$o9&x9a~?&^LP2}C8O%rUA_G|lSogBMpF*T zhx|Zi$jw64JRpJm=6iEG;+qT1umV@#d(M<<1XD#mW6C9juhg&FM&oeIQzFJSi>ca# zW(y`f10J*H$dUjK>qYosV@OL)kK$`%1?>p*?bzzQyOn!oTul&%`Ibw5w=qt{Q*8y5 z*qPffv3@WSiFWVWn#~Q)nz3(7OAD<^u~>}p2a3J>e`%mlYrj3xXFo6fN7*h#-rUg0 z`|o!S4Gq|?hN0{`Yt{{o#_OB*PdCm^q-a6*M?A-|*|iFPPZUYUYOGb!q8j-SOfXJ7 z$jC&H8Ft6Yug2D`<1yZ<$l`D9#ontfj`668%5}{7Xp84Hw=t9^`DQM5K)MlZ+_cK& zz^tN)WNQf@ymPp#skD7!ll=|Njx8I8hNe!PI)kETu~=g5G4B7RB-ehKj%hzHg z*Yv>0I9G2>=x)v|Xy+AnKm8?6kvI)looCNXj;&U;N8T&ordshP%RG3ABUBMSru-Od z?5PQ^5U++}NW~cAP?RAX)wk&|U#k?Hnrd@2o=Ilr4CWgKcXUo|E;MH1J$>D|k?gc7 zvoo0tjI8bdrQl0Q!n>b0={$NtiE~FsXExhsf0w?$f5qAj`BEyC*(X)s7EiTCV=0>% zI>h|%Y&S!I_kT~+bdR+D@2;Z0c49@hjA6%5rRTNP(|`f4c6G>YW7Tg}u9)Q>37#)7 zXm|HiWpFjixYcGGew9+6EUH+0z*Su~=IHo*eVDKQ^&m_kb8;z??&{y!JhE%rq-3#J z=-j%grFrtiiBsb7xM(fhf5zMn8uHfFr70cm?d|XG-cBRa2x~WPcyG(DczR0xgc*tS zq*yG2Be5}jm;Ubzt3L?d;C-Wtc!;{fehLtq_|gijB61ZEycvxwAI4Ngrh(}yJgE|} z)k0LPCY-D^MVYECzKK?;YT=q;ink~B#<{Cz)q;MF(@z-a4`RMX9ubRYB9X-4XePIH z>x_xzhWcc0|IU$-p$QWvXEF^M{+3E85lciVgXPGZvLB#GjgA&}?btOEpl!J3XG95Q!%2q3Pq~-D}$byc`D)-2)##`%}rYF-=qVWvPJj~kK z-e~)r?yM z2nmYl6(#XG)v}eh_@-CsTd$_lM37F9XQ(gokqYKQRYBh&?)?x0L4iyrXivFOwbg8!Td$Xi#JDwoS$UE79- zvyn(7KRWu(+P8Q27m{_elJ#xzWJ@HPbiPf!*T23KDj0eK=(p@Q6K~P;33zaV7!PI4 zaLf08Zw?D|?6?8yR=P zJ6ucNK<~aYCs05i z9PCY}GgMd=!LX2WZ51~EGJ{`9mL9uU~mldj%`VCTX( zl!pR#Tj>_FKaVDkgVyU!#=%BFsEvE$;Of=vRL|Jl%9?h>TZr5$nQ#?~vJunyxf)|5ve0*n@8m7I<6{v>wlWMZ@F4&mj zSJ@&g|M#;HG~yDgR&XIA<47!nB8hFi10CD8l?r|KGsp3^RBDpFhc}W!CLIk}?}099 zhLsL9!(|n3a$gl>xruQC34*6ezL|J$`H3Zbo)v3r5R-q2d!4wAc^g%Tj4S4=tfE+? zHveqxo1xkK7{0tcGnIyT#>#gi>iDTmh^Na8H6ZFv;s^>mZyA>zk?)iZIA7={5dT}^ zzG6rC^|{!s$iTNcw?i1uBgU~vyg3m`$5WH-H%>;9ktl`Tm`(Lvbf~U4O>V5t979pX z&emwPMJ#vOax`7|(Iqlth#!#}iWo=E-MBC?j#XOCZsWw@AnixLIYO1o= z!x(|lxPqZs2q7MbsA?Pk7$xZYP#f})18p?(RfHM5?N)RaI5HySv@p-6A3)%*@P!f`V37R(E%IiHV7snVC>fP|3;3kB^V8 zuCCC~(89vPwY9ZjVPV|d+;w$z%gf8w*4Dkfy|J;em6es2mX>H}XgN7KrlzKxoSauz zSA&Ctz`($po11)me5k0XpP!$@!^6nP$j!~o85tSh-`~~M)qsG2p`oFxtE<1izq-1* zUteF>*VpCcA*&dF15ePft%HBO_;LXGuv(M@L7+ z#l?Yvfh{d9CnqPgw6rQJDo##Lj*gDLzP_EEomyI2MMXuLnws0&+n}JJrKP2^va;gh z;**n;k&%&wg@wn*$Mp2{+1c4-WMqwvjc{;qhK7a%0|U9axkyMzMn*FJA$i+g)}adC0BwziUzlDD_FkdTnh&dzvvc(1Roii(O-Qc_Av zN=r*ietv#GKR@s9?^|12F)=X(1qBEQ2u)2*7Z(?6Yil4NAX8IQ%F4+9<#CMLwh#G|95=;-ME{rzfcYC%Cku&}V;;NV> z`1lJ83vO<192^|e)6;EjZ4wd^b8~YfBqZ_i@iQ|sW@csp00960|8EzatpET8fJsC_ zRCwC7mWNx@XdK5gnl^#j3P@W@TMDI&4mL7mZ`mlQ$WTCJ$Wn0cz4zYx)N`HQ>A6om z_4M@i-g_tS`!C#^q=n+udmf)hzt7X;P1Ah(%l9`D47?;^0KP!2e8=Eey-@J{k)f}? zJ2~TpgFRjkMB9*&q=d?UQy@ZFZImLc+q6W>Tq z)}*ga%=%aWHcDyMK9SHJkL z$6Kea6~H9z$eZM8FeL(IV!(4|4svqwb^zid56cdJGHw4sS*ZQ{wj>i}%BJkVZrmh* zF=yiOXMi2MnW=G>eka#&=mfuYkF8T5Pq>q?V81q{i~Ovh_cqlAz~4QoJ9sbwo(UGM zU>rxcCdD_DIh-uN2taY{=oRV|8LyOxzH37@Sx1a#!PXa#OAyfTS3kc}1j8pN~`5zL$smZerTjl#`hp|GLS?}yTk{>xZ><2@cV+ip^Ij2O=iC^PQY$pIM zF*_8vsbdv2fkz-VW&s$AkqfUAX#OiI-C) zhO!O;jI+Fvs0uL2f5EPY)7JcX{h~iwY>Z0_LrM#a=}HUn>a&f^n#$Jij z;!~QE6F`dbJ4}iOj+8@GmSX^7D-^U4F^LMD#bLp9&o46yXD6^c#4lN2<8ksJdZVBrJ@FEqC8D%1JH zpx`T2K_ANXFfT7XF)uGMu};W=2h2~5hHc=Flq>e!iLxnbx!obNY`g9Ihz zC`holf+8R(M_@ULtY8U<QdmIYza&*5DhdQpMEft18XOa8UsX z?Ke8^+;z4zfx?zUC`HL5WgKc+Qb;5#Ltq9&-=XBOQaEdCLj?N0?~|Le{G_T+%N9Ur z-4t32f8T_vuvQWUTfsKC^MFUj&F6e!X`gCT?NV-AoBQNPc%s=t<7@8}ln;u+@V9p&s1>fsw>>*T*{?=e@eh~K||yLv@dHcWSL4eFS%WX8PpJ(HJ} z)=v5N@1L`KSW(r)s)k9mEi=6W6LSlzJpE!HK6<)*&7Sn!Mpv)!hmW4jS+x1iy(iWV ze#efVu4$R|?%l_apFV&1_<8co)#lb7@85sSE9?F8^_!P}TxL<1ol}5+Nb)gB} z3o9pN6?HYVPW|)ePh0Q8yt2+~H}2&Ww>GxVnKpaHuV264zI}J)>aEvr-dET6RMby@ z{^E_JTgbH=x0AD~%j>6Iy>?^4qLsDHQ^I0$FI~N}YW2n?t9H(wzt+JuxO>vF%z~DV z{>5Drm*!XWXXMqU<}{|~w|V&|IJpJ)PF&#Z5mwzi!^*)otGLs~(a*~-cIxc4)y*?4 z?7Z_zyF7ftiz>Pnuh^MY)VX}^Uf;l2uYiQ2(%OjF%-Yu3UjDJ)fBf_bOt5qE`}_BA zYHo{fP?D!#OmWqONmFLuz5mG5KRzY9VfWqxYd7sbb>@;^NXqPmn{M5{f9&|#y4G2V znRO0sVNIR0z5S#8f|K0+;(q@8W$Wl?Y3J)7n$kaQg?B)LcR<|H)Y9O{jD(E3q^yRD`bnXYDc`^UaQBHWtDClD)sCHe zj`;*7Mkf}P*G)Kn>f-jDd#f5J$0z5x`$XlG^faYv88leV)e_zMChYX{O2Y=$t~9CTUg4(x`H#Lb zazD8)(!MlXitGESkF&EFSwmin=LS5|^L{q@(c|aS?jK6HmzDN#Q%CZ}WPv^hMzvZbo5x0Z76{BlK&_1U`8lo>YGd-Uf`ojEhoBjwSt zjJc{jJeQ+XB6uwt=s*-xs?It&#Tanjs172L^y9jRQzJ3jkjL2w${&T1M&RBx${>{aUfg2Z22g zK_;+d;Y1FLm#eznIsEuZ?aelwZUW+oj;08eWz7jJ`30{)-+)LjztHCsQ*Q178CR=w z6gTCC^(2aj!pxS+tJ$ft&CO2*C5@GJcf9?>W%)OH`-T{)`DdMBZ|4^J?hktUUaGEd ztFCV?t5NgQ3s`9d5u{{AX%m?tOXTDtf=CfWM)tMqB~^C@wWAVw&F8Hxv8>9@(F5#( z;-#0w(K4>)D1DJQ{i_)^KaY`GkS@vLXOt$gB$>Ij%JSP(rqta#*bfKd>lVAh6jZOyIk-`Ven8`(9X_|D-;QZVLW_7;AjF@ zROI1vaeI3^S*URL#>7&^v58_)W;r5=m~y2!DqgU)wGBt(BV&?RRzLa&64%z&H#Ro8 zB4v7ZC7F@Ayt4Y?!wN^B@DC(-`C?Q}cj+uXSEyY5xVEvmIiwv)3S;g!zQHGz2L(_rx_UGaPt^5>+n+vtel+ql_geA#`i3xF zwy?11=8i;SNOxO1PTPS;MxSTrRn^_-?c6*rn#bY@TYmj>dS+HED;H%|u=xtMK&fu) ziB6D6WD35dI5sgeo}PI*Ns?1g%i$N^xY_LF<~R0qeDVGAd5AyM3sY25b-^pRsI>04 zdz#<>&@fW-Qba|?6}QT(n&4RzgA-#YifR>?d!EAfVR9Jw7+YwALVkbUfbIr{A>NM zFqLDD$$#R8N-qTk1(AE#n*+UhRnWU7eSQK=J@Q+^Hm+6*+E#s)SD?M%M z=ZeFF*5oS+p~;OOGSsIoG3Bqg-s7-ES4K~hzS0P?-!)_EGihJv=?7bd!HC#P>g zhY$|>=_mSwXcMPU&BuTLOAPjiW)d%u;^&tHuOJK;7XyPHqdB{()jioiA22;)_~bL` zDT}+dFrE(rfy`o#;>puK}1SLscB2cj~neA0xF*F146#0L}L}o$coq*-`kG zg5E&O&Me%#@s2KN-9ROd)@rpUt*!N8<}YKZPurpQF%h;IFL_Hk2e(&zM#D_9TN<`& z%lxoUQ7`vd&Bzr0*aLH8+px2LXw0?MXAT-dF;Yj&d8A8s-#Xp}(Otl!nEkh9`Ga>0 zxT}9BDsV4iyK-s|3PFf>*_*2!NC&{+Zoi%bN9o3fAp>+rnwwFh4Z$RTnosCTD=fsU zV2(X9u*ZBHfK(+L*&sU1P6o>g$NKxNAM2J3b=7zG-;}S&X&H7--&q_mtisA?mkzy2 zdpqO!$YgbJNNQ>gGU%|SKkNT}q3bar8+9CFYig)BK3eBGA<&q{QV&rNX$%F0)O+FI z&wE{@z=QMyzbQx(iM2KLv|GQaFeOS+@4BLl<6e(pbstUx|{iKnkC z`z0O@Q4wifhqWF+q1XVQ5ZC_<|1IZKYZgZ-CVMGHd1+=xSx%`oY{|Bq)8e#sir3yb zmP=a;OkH}&M25vJ3u2e=3*Oj3?+x2H^?_ATOk!FAFhjp8Td;asc zJ71~KXS--An6|(7NniWMXEp0SUp>3&-=DnQ*WwFBg)BGvFYW+(fWgz%&t;ucLK6T6 C$+!pr literal 0 HcmV?d00001 diff --git a/e107_images/emotes/default/amazed.png b/e107_images/emotes/default/amazed.png new file mode 100644 index 0000000000000000000000000000000000000000..90dbedc52c5cebc8386e57d03a1bc99a3b6d5ddb GIT binary patch literal 568 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+3?vf;>QaFeOS+@4BLl<6e(pbstUx|{iKnkC z`z0O@Q4W#lj<+p9p^X7PA+G-!{uftA1tmK<1sMiKS!NdpWmg9!7kd@A1hveG>RFoH zGAFsZCn~$zD=67AD%)$$-eOHl!#P{C*B+}D(A2DsimL7js_sdivNn6`x$5L>uj(mL zd+)VGWjpoEDL(eRC%Zao>$R4sWT)bmsAJEkEZtk|6=k{hTy@Ko?7i1|{{R0!XKl;c zy)8X+lIN_gF763B_k2#vl;ovrdzNl(*?Mfsv3qm&UYjyyY4OsnKoY2{_{3eFSwP1# zmIV0)GdMiEkp|>&7I;J!Gca%~f-vKfh`jSaLG2RPh!W?b)Wnj^{5*w_%-mFl;LQaFeOS+@4BLl<6e(pbstUx|{iKnkC z`z0O@5hL{j#uj&gLc0QdLR|kd{4cJK3QBfz3Nj3evdk_H%B~JdF7_&J32K=W)w49Y zWlnN+PgHibS5UHLRJPZgy~T63W=~lQM9FK9RWChOymW7Ibx%-rPx97t)oagHYg!s6 zXM0soiQ0RwW$(3?t=C$jvYmS76d!xulU*GZmF!g95_RnP6t5`DmMPhLul3AX+p>0V z%em)sdgdh0SzCSX`O@N^psnYo9J@DX@3|>0Q<9gi?OD3DW$Upid#_EIvb1>VRv=m3 zGNpLJ{D{jyUoe&g`2{mLJiCzwvL>4nJa4Ui^i+!Sztx)Sqp!yfb@xk50p+{x&3=l_o2$S7_@+O% zV?T#&vkwgoVzoCdTC?=P8p-RQVt4M`aKpsaYJ!H;+D*4=9$xAzTa%@7d-;Z+CG#~V zxvD)@ToZlJUHW7s|FvzRt3!{u{$X6X(N}6Z3-^7+bdxKRGdJ9bXFT)u&<>9#)p^>z z#+p;7OyU-)cRMa`Fi*uvVGmpWyxl1xev--@%Ip7%HZQd2I#l?@s4-o3{q473@BX%5 W+ac$@Y;!uua}1uYelF{r5}E*g;q%b| literal 0 HcmV?d00001 diff --git a/e107_images/emotes/default/biglaugh.png b/e107_images/emotes/default/biglaugh.png new file mode 100644 index 0000000000000000000000000000000000000000..51ff296145717219fc39c31d0fa6b309332aafdf GIT binary patch literal 586 zcmV-Q0=4~#P)#006yEOjJex0RMA)T2f;|LQ*kOS~+WTQfqrs zV{=M#gi?f@T8yP*gq&l0j9P1ZN>XDvT5C$2y>pzkYm}{Pl&xc}#(Sm4bEUm=dyGDZyQ*~}2I3Pr2V<0jxFft%AFgi3hIyE^UEif=JFr^Pd zOaK4?%t=H+R45e%!Lf4FKmY~6eey-I63j5E(ooX5CJq1p1+>u6c!s#}nAp}ycV;)h zkK}!xeuBVTvQ(eWpAWw4HjUbv@w`^Cf9&nZ?##sd_E41Gjyvl* zah>Xym&0a%zbjVoP>1;`rKhn1HFN%alon?bsMcY=w_+{ED`2cc|5i?0i~yF}hUb&1 z0@O>|J-#McMo=%gz5Xti`WO{la_dzXpEnVfh($07*qoM6N<$f*Irhb^rhX literal 0 HcmV?d00001 diff --git a/e107_images/emotes/default/cheesey.png b/e107_images/emotes/default/cheesey.png new file mode 100644 index 0000000000000000000000000000000000000000..69ce65587f81d7ccc5c8ba8949f7c079985d490c GIT binary patch literal 586 zcmV-Q0=4~#P)XDvT5C$2y>pzkYm}{Pl&xc}#(Sm4bEUm=dyGDZyQ*~}2I3Pr2V<0jxFft%AFgi3hIyE^UEif=JFr^Pd zOaK4?%t=H+R45e%!Lf4FKmY~6eey-I63j5E(ooX5CJq1p1+>u6c!s#}nAp}ycV;)h zkK}!xeuBVTvQ(eWpAWw4HjUbv@w`^Cf9&nZ?##sd_E41Gjyvl* zah>Xym&0a%zbjVoP>1;`rKhn1HFN%alon?bsMcY=w_+{ED`2cc|5i?0i~yF}hUb&1 z0@O>|J-#McMo=%gz5Xti`WO{la_dzXpEnVfh($07*qoM6N<$g3|>6(EtDd literal 0 HcmV?d00001 diff --git a/e107_images/emotes/default/confused.png b/e107_images/emotes/default/confused.png new file mode 100644 index 0000000000000000000000000000000000000000..72ed2e82787cf9e86a055f7c3b0045e3a40e7641 GIT binary patch literal 604 zcmV-i0;BzjP)XDvT5C$2y>pzkYm}{Pl&xc}#(Sm4bEUm=DLFBF zj8c1yW3|qEtU4gdcE^e{s~G7w-$94zTh zCw2pTN*=HK&mizIDYL`#-S;o(aBkB$bIH%A59m4X77OF!Ww(81%N z{a|Q|W0VaC<#@X9&+BUJe~;Uz@pdWQ{5nHR5x}O-`SvoDz{zw%GOf#?4%G&Ye|7HK z`+nP@wWdv_YipVJ!_A*J3ec6gW?AE15}?dAw6?^0Ni1>z``Eh4&R*ovX9yX6k+wvJ*p52D=GS|-=>u9V#mlqxo30<{hjZY2IM+Syqo(BD$p8S8 zv&zm8PupZ-EYaqzm%YT|PE}M_05H*;vfdm|azema?MMixCT=gv8Sss;q|!XDI)?!a zgjojKY>b6rtsG)F%s@mVp5Y}{kRdNYEU+A=8E9oWT2hguaAJ@EnynUDLs($20F@99 z5@;B5G!|KPkymwI(Rr4$2@=vG0*6^yMJ%)-p4B3vsOebIXx6GmqP)ndx?mWF6y$>{ zABsqV1f?JjMPwu}N=VceB{d}SB9w!Itni8^s=6r3NLGkqUPQ~%aF{HL2{7(jQ2uSc zg@mNDRVNStDOsD0dC=hhK+4>Jqaje)?rjeE+Wb_Vuhk1`JN(ok%I<|!VL?G5k&>d~ zl7m(%uYjDq#pWV!i%xq*-Toc%)6@R68W2B=hPqxfoOadj+_oIPn}m!18R7if*Ur^Y z=AQJycf-FWu++EFxsee!wa@!&e*ApdY}4Gp=UZ8A#?*TDnbpy}(%e6Pk3&?fk1RZn z){mp-D|4L>Ggii87c#$o?{7I!JsFBNE{)fBPp&M_>#5*X3-)(=y6D1>^+Thb6IU$m zXRj~$kFDtmPu2$WdnQaFeOS+@4BLl<6e(pbstUx|{iKnkC z`z0O@Q7)l|yIRITp<@9)A+G-!{uftA1tmK<1sMiKS!NdpWmg9!7kd@A1hveG>RFoH zGAFsZCn~$zD=67AD%)$$-r_l1v!|>DqU5#5s)5E#X<=Bpx45O4p}Hrix+i(-x$3p& zs*|G_qJkKbv%RXPMD4xTviDlc)@ve%xsUQw1U zQ?mD7>zT8*W$oUUbI<4W%t@ZJw)))jrNuo#ThC27c5lw!b5mNTBrjdtvvh0A)?-ul zUYjyyY4OsnK(e}JO0lif?d?FPFqQ=Q1v5B2yO9Rua29w(7Bet#D}pfNl8C(XKtb&i z*N775qSVBa%=|oskj&gvhTzgX1q%h2)MN!C0|O%r>P zzbU5m*5{vJ_pV>y$FkC$6inZ$msmFRt zw~Itw_E|hd&&*Qi{u7G1BMfWBn#boFyt=akR{01M~*+yDRo literal 0 HcmV?d00001 diff --git a/e107_images/emotes/default/dodge.png b/e107_images/emotes/default/dodge.png new file mode 100644 index 0000000000000000000000000000000000000000..fdb30c3f895e622c4d42ac56c518764805985324 GIT binary patch literal 591 zcmV-V0XDvT5C$2y>pzkYm}{Pl&xc}#(Sm4bEUm=dyGDZyQ*~}2I3Pr2V<0jxFft%AFgi3hIyE^UEif=JFr^Pd zOaK4?(Md!>R47wL&ue#rFboFZct;Rtv2@sOtP&Nx;n#yT?ah1bc)6|?&URpUjDJf_tPF@?|8)Fb>8PPL|>#C|UxqYFb zBMEmE$1F}6?Dn+6;>_q|1RH+kHYG(LHdrF^Th66QwvbtDL#~yG)=&t<+{fxvB*6;c zF@Lf?Ea8&w%94fFnwF#@2_E?Tp^#~+6u~^a@A^;1(M$-2C~k%3M!`6YCh_#{DwIyQ d*Xs{_{SOv~9?FX&(UAZE002ovPDHLkV1for|KtDw literal 0 HcmV?d00001 diff --git a/e107_images/emotes/default/frown.png b/e107_images/emotes/default/frown.png new file mode 100644 index 0000000000000000000000000000000000000000..acf7e31b80175e7ab20568bbe17aa9b93ee08c48 GIT binary patch literal 591 zcmV-V0XDvT5C$2y>pzkYm}{Pl&xc}#(NMcDW%49rM+`| zj8c1yW3|qEtwbNVt|;{X5v0d!JMQvg8b*k%9#010qNS#tmY3n2gi3n2ldSZ>b%001j= zMObu0a%Ew3X>V>IRB3Hx08@2tAUGgIWn&;RFfcM8GB7$cH##*rAT2O3FfgSLLQDVv z0MtoDK~yLe1;M>?(?9?Q!2M2&6c5G&ZbCyxr=EuQe*{`+_{jj1K(L4S?j*At;6w83 zvik@E?~_*T{~qo?VZbuB-l;kLUcND~+^)Xv)t{5;)T_ZVZ|nEty4pS5D3{l#V%*mI zquzTzJZZ1q7?$hR?(?W$Zli*p=dB6Tiy;X$!};)I6TIARLh>)=yb+j^BuVlI d0g^}>_zz}YUOG9OtM~u_002ovPDHLkV1l}}1C#&& literal 0 HcmV?d00001 diff --git a/e107_images/emotes/default/gah.png b/e107_images/emotes/default/gah.png new file mode 100644 index 0000000000000000000000000000000000000000..d2ac1252f1c2ad29c568a72df8f889b3fe9fdc03 GIT binary patch literal 588 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+3?vf;>QaFeOS+@4BLl<6e(pbstUx|{iKnkC z`z0O@QEr`xBLc0QdLR|kd{4cJK3QBfz3Nj3evdk_H%B~JdF7_&J32K=W)w49Y zWlnN+PgHibS5UHLRJPZgy~T63W=~lQM9FK9RWChOymW7Ibx%-rPx97t)oagHYg!s6 zXM0soiQ0RwW$(3?t=C$jvYmS76d!xulU*GZmF!g95_RnP6t5`DmMPhLul3AX+p>0V z%em)sdgdh0SzCSX`O@N^psnYo9J@DX@3|>0Q<9gi?OD3DW$Upid#_EIvb1>VRv=m3 zGNpLJ{D{jyUoe&g`2{mLJiCzwvL>4nJaD4z_MyE9h71A0?K#WoBb4;f9H;)dUTxwVQ6$JiOFbwkAvE_VNusOXh1# za#ee*xF-6byY$IO{%hMrSBD;R{lmC&qp#F-7Vi6s=_XesXKuI=&v@qRp&cGgs`Ipa zjWwrEnZzwp?{-|?V4jMT!XCE#dAn0Y{3Mk*l-K_iZC+^4b*S)*QDeI7`rB{6-u-RA XwnNT)+2(YR=NLR){an^LB{Ts5GII2! literal 0 HcmV?d00001 diff --git a/e107_images/emotes/default/grin.png b/e107_images/emotes/default/grin.png new file mode 100644 index 0000000000000000000000000000000000000000..a11f7e0e8cfa3300a5159daa58c9395545276367 GIT binary patch literal 584 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+3?vf;>QaFeOS+@4BLl<6e(pbstUx|{iKnkC z`z0O@5evg}9I5O;pRFoH zGAFsZCn~$zD=67AD%)$$-r_l1v!|>DqU5#5s+S%sUb?rqx+kc*Cwc3+>b2*pH7yO3 zv%RXPMD4xTviDlc)@v z;Bc|bUBJ|*V}iyu1Lem}kM{llpMR4xph`aIWw2)`Q$m$Ze0N3Y8{g-rzfMTq{?&F} zO6i%;KGQ!1YqBeAPE9y}!cPC0$-*|qi(%bCCYOXB_VKOVdST8B*2BIG-KmwWUCS1J zu`>8Si9?NMQ zuI!h1I7G!5ABmW4018zH_=LFrXZW98U2SP;=wxY_TwI(T6_g$1WoT*Xq6_qN0FQc16Tlpfeatg8YIR9G=}s z19CVEJR*x37`TN%nDNrxx<5d{sh%#5Arez_&v}bA8Hli4R6C_Eb@DRXls1lkcmH$A zzW8YIp)Wgtps* v%i5hf_4}$-&WEifl@F)=n7Grm?SEWDI5%&gM*m}=0~tJB{an^LB{Ts5{ZN?6 literal 0 HcmV?d00001 diff --git a/e107_images/emotes/default/idea.png b/e107_images/emotes/default/idea.png new file mode 100644 index 0000000000000000000000000000000000000000..236f5c65a0a7fc5461d8370186b7949413ceb279 GIT binary patch literal 474 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+3?vf;>QaFeOS+@4BLl<6e(pbstUx|{iKnkC z`z0O@QGTv>$J`WvLJ0vrA+G-!{##bh(Tplq^h#FriqeeAwyd6FnB8L8GRJAkRBRL58nEaloA!>TQo3B}chxNj%Wqe!qNQT_~^M8K~_d6$!Ia^p5q843T{$5|d`hZDL!I$`^N#vVK}?TO9l zJtsb=m&7$4dsX^o{vDA;hCEsOT3=6_ektqjv1_I267uIW-?ht2n+UUCINovq=m`c- LS3j3^P6QaFeOS+@4BLl<6e(pbstUx|{iKnkC z`z0O@5o@Cwo%A}O(18G-5ZC_<|BI`mf|8w_f((PAEVGM)va5rVi@l0lf?DQ8^(;+p znUh@I6O~=<6_jilmF+cWZ}FV1*;Cd6QS#bj)k}{RFWp;Q-4j&Zlf3m@_1bgQ5|)O^ z*$R4k>g1?wr=B^*$Da3OS4Tx9I~BJ?9eX~-E6TEEO7`AsJ^%mz zpR=}Q?cSDi&*${aNuIN|`rPxS#XUh=&rLaYZ_eIxQ(C4ZFJ0TSbZg7jV^j8Cn=)l- z@zSk8vbtqTvDH6AKA>M1OM?7@862M7NCR>>3p^r=85p<~L6~t#MBaIzpmvFCM2T}z zYGO%dex5=|W^O7&aA}@`g@Q|JvVxI;ff10fGBLL@wN%hG0D`6bPCh_ww>(`OLo`HL z4{r23Y#`Eh@qPK6Et%X((n3ioXLz{Z|7SR3u%Y3KSD@&sBiDDDJ?CJ!x3t)*hC!jh zTvK}a&wtN_ISxcz%KEVU^jFc0gge%JC+Ftf<1u{KH94(8PVe`92OYmz?Tv{M8`{-p zZ4A3)bKutH^M^ zK60g9(|NY`sm}UGkwO!!S65#C^+WXJHsKX&w{xSq6<_rA3Z!K2v=(Q%Gc`;>muou{ n(+d^PNhPc-43j1pG5pW_o1?ak=l2buFBv>t{an^LB{Ts5)+G7m literal 0 HcmV?d00001 diff --git a/e107_images/emotes/default/mad.png b/e107_images/emotes/default/mad.png new file mode 100644 index 0000000000000000000000000000000000000000..390911f06af092628d909f8b7ebf563a9a5a7a5f GIT binary patch literal 598 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+3?vf;>QaFeOS+@4BLl<6e(pbstUx|{iKnkC z`z0O@5i4o+)^ou?p#uRvA+G-!{uftA1tmK<1sMiKS!NdpWmg9!7kd@A1hveG>RFoH zGAFsZCn~$zD=67AD%)$$-r_l1v!|>DqU5#5s+S%s*0eNSy0^HxC#bq7dF#3Awdbmn zv%RXPMD4xTviDlc)@vG7t^3t_EOSiUcJvL?UwJB4U z7BAfjB&%Dd6f@1T26}~ou_VYZn8D%MjWi&Kv%n*=n1O*?5ri3+MC6?Z3Tl_QMwB=g zr6!hS=I1GdWag$a1efM1SSYxpCMy^j7#INwD-&}oQ%eP110Yz+@8kp2cGc6xF+?NS zw4b}U$$+Qfaq=mLDIz(oerrNjTDhhc`)~jIzkchM1J_@x{?wc9%^+jHzrOv^jVFEm z=hsJv*3N(Dn%E5i_#%&j}9-YZP8=Gr#-O9@|HhbUmbnc@udjl@7Tr_3= z%fOJEs;!4NZ(Q|vW=gUK?@B&BVHu~DnK|y$IJPy1yqsne9+a@5l_~dOKvCbB+YCCN zr)F(97JoTT^YoG_Ws?*h+ur=@KI6i(;c!~3;&ue<$>mdlap h9dY#r5_Tp(?KAvk@8&n%3QaFeOS+@4BLl<6e(pbstUx|{iKnkC z`z0O@5i{Y|*POXPpRFoH zGAFsZCn~$zD=67AD%)$$-r_l1v!|>DqU5#5s+S%sUb?rqx+kc*Cwc3+>b2*pH7yO3 zv%RXPMD4xTviDlc)@v>0i0CPlNXM0fMOz3=~XY`Z0q%)}`)ZNumL*NT~H{N=vCmRIyM=CyUfRpmBYleWe7)@km&+?KiD+IQMT(Y0IKs=goH^i@NBO}fmt zf0dFiBNEr%{QSH0<-)Za!aR3=@x09NCiT?cni-6%GGnrKM&7fn4QX6?Wm;Y5de0Dc zuUyOeUt3o^)mrgwn3qrH4g$5lKh*(f^*d9waz+~t#; V%=P;vFk~1QJYD@<);T3K0RUgD`V#;E literal 0 HcmV?d00001 diff --git a/e107_images/emotes/default/neutral.png b/e107_images/emotes/default/neutral.png new file mode 100644 index 0000000000000000000000000000000000000000..7f8ae23a460af6af70eef74bb88be49837d3cea6 GIT binary patch literal 580 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+3?vf;>QaFeOS+@4BLl<6e(pbstUx|{iKnkC z`z0O@5o@NXui=+~Lc0QdLR|kd{4cJK3QBfz3Nj3evdk_H%B~JdF7_&J32K=W)w49Y zWlnN+PgHibS5UHLRJPZgy~T63W=~lQM9FK9RWChOymW7Ibx%-rPx97t)oagHYg!s6 zXM0soiQ0RwW$(3?t=C$jvYmS76d!xulU*GZmF!g95_RnP6t5`DmMPhLul3AX+p>0V z%em)sdgdh0SzCSX`O@N^psnYo9J@DX@3|>0Q<9gi?OD3DW$Upid#_EIvb1>VRv=m3 zGNpLJ{D{jyUoe&g`2{mLJiCzwvL>4nJa4Ui^hI6A!gb$Q-Tqss*Y*6J==DkQ zr#4Mk`flr_&67mDk2suMd8K$(LbCkJ1u91b#l_uiwoF!XkBMQamfy7Ymy2LO)3YxL zv9V2sdNaIlZSc!-3xXZCv2d@*XN50y4393EYvaQaFeOS+@4BLl<6e(pbstUx|{iKnkC z`z0O@QGT<7E3K9Tg(?DkLR|kd{I{&0qZw7K=#{MK6{Q)KZCO3VFuTRFWscL7tzL8X zTDB}TEbd8OdMs+`v7kA7i?^Q3UVF@`XKnS?b3J>n0gY+ddrdRBddjhDbB^7UkYMPk zW(e|PSlh#}^xQoT4u-vR7z6|uoTltud+wg5B7=kgL-N{VYp*?*$m{k3YGy16@(X5g zcy=QV$l)yTh%9Dc;8p}-#w8JX=YfLSC9V-A&PAz-C7Jno3L%-fsSLrTc?uQ^E~&{1 zMg|5(K*Gwz+{)BaLDv8XmhwCK0JZJ$ba4#PnCLp;rqCe;9)`S^hRSs1t$hw(pt&|hkJ);Kab?D3)RKj%nlul~6tUsQAHi|oUmS^|pJPgM3U z``+5&BvE8iWF&a^-OVE(A3C<~^bv^dzGTajY51I5x?A?midm04m0y>z+le^`OBQSJ zCrl7?I+469lc7e#XQIB*s|nvfRjrAb-ut4mw(*+bie9N(zfSCRxnjkwdF!jT%l^q; le80D~+xzamS+;0i{nz!vA8zz8L;?N5;OXk;vd$@?2>=@&zFGhP literal 0 HcmV?d00001 diff --git a/e107_images/emotes/default/rolleyes.png b/e107_images/emotes/default/rolleyes.png new file mode 100644 index 0000000000000000000000000000000000000000..c895b9b5f794d922023f1d1fe44d90bc1697873d GIT binary patch literal 595 zcmWkpT}TvB7#+>S}(pDneakq6BS7j8@D@5C6OB>q4J63dS%e)%a zV5IY)G$p0ek2r$hgn<*1G4ul~ExFi>)JywNVxk14HC;cxa}MXgc{sgwHJ*$#YZ}8a z8Qv-vM|I~GQnpbJWQK!OlFm5&PKKGho4y&?PJOcA^}Ca!mXzI0UQ17@g+_W^b%Wbv zOoRakS(Yp2fP+UIk2#2Zh;T#(q5_Ewu?TqVO@p?=&O;c8hs*^}u7G)@_ zI1*Qo$Y~MDSd#UKL?o!FqM{Mako1@&DM-;MV%r_tq!&V?@R`c&(_;n`?Z9ppe-X^%4br1p8^r_F5Z-y#qjpYH1G_E&$nz4{~T z3n&y0RD~;7&R#BnkMrJ5yk4svdNyXgw|Zx@eehUw7BUid1&f4GzklsiXDvT5C$2y>pzkYm}{Pl&xc}#(NMcDW%49rM+`| zj8c1yW3|qEtwbNVt|;{X5v0d!JMQvg8b*k%9#010qNS#tmY3n2gi3n2ldSZ>b%001j= zMObu0a%Ew3X>V>IRB3Hx08@2tAUGgIWn&;RFfcM8GB7$cH##*rAT2O3FfgSLLQDVv z0MtoDK~yLe1;M>?(?9?Q!2M2&6c5G&ZbCyxr=EuQe*{`+_{jj1K(L4S?j*At;6w83 zvik@E?~_*T{~qo?VZbuB-l;kLUcND~+^)Xv)t{5;)T_ZVZ|nEty4pS5D3{l#V%*mI zquzTzJZZ1q7?$hR?(?W$Zli*p=dB6Tiy;X$!};)I6TIARLh>)=yb+j^BuVlI d0g^}>_zz}YUOG9OtM~u_002ovPDHLkV1m+>0;d1~ literal 0 HcmV?d00001 diff --git a/e107_images/emotes/default/shades.png b/e107_images/emotes/default/shades.png new file mode 100644 index 0000000000000000000000000000000000000000..b6848e4e025886ad09e8c9298cb552d90c46356b GIT binary patch literal 588 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+3?vf;>QaFeOS+@4BLl<6e(pbstUx|{iKnkC z`z0O@QBIb4l`{*0LI(nTLR|kd{4cJK3QBfz3Nj3evdk_H%B~JdF7_&J32K=W)w49Y zWlnN+PgHibS5UHLRJPZgy~T63W=~lQM9FK9RWChOymW7Ibx%-rPx97t)oagHYg!s6 zXM0soiQ0RwW$(3?t=C$jvYmS76d!xulU*GZmF!g95_RnP6t5`DmMPhLul3AX+p>0V z%m4rX-@pIfGbee@+Uj%9m!5k*r?@9*>$xe%?#$B9#*!evUaB*2(si& zHkzUHEpEPmPkEPv@$Nn9KHIAoI@;Ih9xX9)VYW^C8huCQ{fg)-ORXwSm=wRMf1J>E z_bP0l+XkK7zg!s literal 0 HcmV?d00001 diff --git a/e107_images/emotes/default/shy.png b/e107_images/emotes/default/shy.png new file mode 100644 index 0000000000000000000000000000000000000000..9b2a2065cfb8b5f263fd25043cdadf0532bef3ad GIT binary patch literal 594 zcmV-Y0XDvT5C$2y>pzkYm}{Pl&xc}#(Sm4bEUm=dyGDZyQ*~}2I3Pr2V<0jxFft%AFgi3hIyE^UEif=JFr^Pd zOaK4?)Ja4^R45e%!Ld%;PyhwcbDvGH0#p_Y6;ij3nPK7ozo0V=9V!(NDFhPxj=h!I^OCxEdbOqweNjPV{5cE%9P)qr8Ne&*mlW$YQ1BBG=OTVW%=2ibpTa4 zo$7qquivg!pvQaG}c8P05iE~kEVo7Fxo4nJa4Ui^VQle4|5r$p_&*RuCo%hqcxQQ1yCbBd2W@5!!?ib{4WZizbf ze2Q0;Wy_T8z1Mo?tZiAlx8>aPIX!cd=d7(h_k3w_PtewLQ;yx6v-jMTmMO_g*Y+&k z+OqZ7l)cxcOj%mIbSsdoZkbX%VSdDApf4Cpg8YIR9G=}s19HxLx;TbZ-15E9J*i1S zq~YP@yFQzndPKN9cTbPqwzh2dp8wgUe9x}fKjx`n=3z?MZ9i{y3G;lt>-&S}{m;+O z)SP|)u;OyDhd*`IwYhbSbG7X`xSnert`fW?chv9Y(O5NX}c7>!x+=uI7OVbvMbbBeNguRg&{w znWOQpW8M9PhY1QT347l2&V8iLy#KgFqrAn_V3S#Sr$66zT>krOlIZfNwO6}8a<8hC Vi;-0RmI(A3gQu&X%Q~loCIEY1^c4UA literal 0 HcmV?d00001 diff --git a/e107_images/emotes/default/special.png b/e107_images/emotes/default/special.png new file mode 100644 index 0000000000000000000000000000000000000000..be3f858b6d2017059da6bbc48efe92ab2624963c GIT binary patch literal 584 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+3?vf;>QaFeOS+@4BLl<6e(pbstUx|{iKnkC z`z0O@QC=Ahm5HB$LVE*zLR|kd{4cJK3QBfz3Nj3evdk_H%B~JdF7_&J32K=W)w49Y zWlnN+PgHibS5UHLRJPZgy~T63W=~lQM9FK9RWChOymW7Ibx%-rPx97t)oagHJ2^Qe zXM0soiQ0RwW$U#TpgmF9PCavqk3H`>cI;Sob=3d=|D%$fid&+*qAZU+pVBfVd+)WL zIcrSQ6wH%;50sMjDXAS>O>_%)r2{2*Qj@BJ$1y1+`0DBTAf$QWHxu z^Yau!GILWIf=lxhEEHT)lNF2%42*z;m5I5PsilIh0T3+Zck%&hJLT!(7@`sE+n*`i zq#)q1{kDnrnKMg{w5)k!_h#My|C?{M&U#tfSZOnZ)!}o^-svxIy)m8s`fY&7_p{1> zXMX)yqSbN7zW%JDVv$SNG_&6-$`yJO^E$F-7c5rUn$&*r*bJYS77rD5!e#h-4~BkZ zJ5&7Xe~9R_Uz|(N*oJU(u*SM9DeF3~kQ#K1?QT?XL!k_}qnpc(Tf%d+zqAD&5wuU3 zm)o21$LjO%zX}c)H?yaH_PqYm$n8+!ezx6hSGUZacKh8Qo*=Dot*f(c)-#xK%KN^G S&s_oZ6@#a%pUXO@geCwMkNB_v literal 0 HcmV?d00001 diff --git a/e107_images/emotes/default/suprised.png b/e107_images/emotes/default/suprised.png new file mode 100644 index 0000000000000000000000000000000000000000..549c376dfc8fa60e1db043dc126cbbc551e86535 GIT binary patch literal 597 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+3?vf;>QaFeOS+@4BLl<6e(pbstUx|{iKnkC z`z0O@QC8ssC$=o0(B1%_5ZC_<|BI`mf|8w_f((PAEVGM)va5rVi@l0lf?DQ8^(;+p znUh@I6O~=<6_jilmF+cWZ}FV1*;Cd6QS#bj)k}{RYg!ss_XJhbwU(%Cr=B^*$Da3OS4Tx9I~BJ?9eX~-E6TEEO7`AsJ#*H! ztlisk?)jXaImvU@R-b#mw74f|>$xe%?#v_ugLjFSqUI-BbhJzY*uw zZr$Ac>)+y+R~9o|Nql!a({nkaX>ncba=BT|e4#=2el5skc=l<+`Nvr-E86z$n)Y{# zb$!6j#PapJe|7CtA9k(WcINo}$w6iZy=0@FE#-QBSHki1+mDrkHhQZk+%bv~XL_yT hIcblAgODfdf5vBv67pm(t_CF<22WQ%mvv4FO#l}n0OSAw literal 0 HcmV?d00001 diff --git a/e107_images/emotes/default/tongue.png b/e107_images/emotes/default/tongue.png new file mode 100644 index 0000000000000000000000000000000000000000..3820c193b38d72948ae74f6253a9c02af4b193a3 GIT binary patch literal 597 zcmWkpTSydP82!z=W{PwXLmYjo^|mXfji%_hYrCtv$?OI?1iB5Y$)rUy*~3Vr{35}W zl0UWKKo_0pHloCokyAa*L&!)Hi}auw;@B0dCn?x|KfZGg=fHV5S6ltZGtzR?000>t zx0A-2y@Ql^%%QByVJr#V4Za2dW=GTig%Yt(7Cb&z^3v{dfVC(bj3i7 z7a5wRDB3|YB*)X7NVB|`hcuKKNnxSPiW0+#UYaEt&MWJ@tZ_)i&#H!~7`&qMhe?Mh z(W1m^rl^`CM^P;26%nJaKs^ezC}cQFl6k|D6ofdDVOWZXjA0=!Lqf#qQAt*zszcL~ zC7G2~(Xu#P4n**lIDz&DK>fyY7dENq z-R(R8=>-xN&dxqo>6`9%{d0F~F6aos0Y_T&wHs=%3B{ zi~_zUuw~0LerJHVdH2T4gI|BTgK}aOE*^uU$fhOJ-+A``F{Lcx~$qoLLwf=GQ eMF)}krEL4a?LerkHSCzf`+&#gcTQ8CL;nH6wer;f literal 0 HcmV?d00001 diff --git a/e107_images/emotes/default/wink.png b/e107_images/emotes/default/wink.png new file mode 100644 index 0000000000000000000000000000000000000000..960d71d3b1759b01f055401de8d5c539abfe8270 GIT binary patch literal 587 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+3?vf;>QaFeOS+@4BLl<6e(pbstUx|{iKnkC z`z0O@Q8wk;ZK)ukT>(BJuKyYS7gt9GB|A9<83sjJW)}x#R|h2*dlk0?wakg?S(@B3 zC%L*OD!bY%DA_V9+iT9=;yGKhr>q5{gBX>m``)^k&i-J7%b+?19n$xGMvEZy3&_1KiX*QQKaTD){CkgRT* zQaoXP#ATo_7)yfuf*Bm1-ADs+I14-?iy0WW6+xJBNkraxprCe%Yeb22QEFmIW`3SR zNM>#-LvU%Hf`x)hYO;cnfq@Z_ure{XGPP9DH2{L8{7ybVZ5KRU978ljSr6{?mPuq_ zzwmu_X!#Llp178X48<1RH#vX)Yj=li^GsHh>saynhph8G?t;lS_4)T350nOV-~Il# zeLqLoZQu4!MRnd0y|K#|e0|QpG3s1wW83tPit8?k@?KuS$6mk5OGLhB*+#zm?)^XK z`Y~TtQoWq6=ghon;go;#PVc+O5W3dc`rOMM29kliORs)17GG~4Qro!j%CxWRExeuX zE=igD@=5%hX{iEhjL)`zPs~miT&Nab?Y}u8{~piD@V4_a4}?up@w_LX(7B}P|Mt0& V%QbF%%mez3!PC{xWt~$(695)I_j&*T literal 0 HcmV?d00001 diff --git a/e107_images/fileinspector/blank.png b/e107_images/fileinspector/blank.png new file mode 100644 index 0000000000000000000000000000000000000000..3e5659f03e5c2eca97dcfde3409d3ca54fc6292d GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>3?#4ne^UZdEa{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5i=?1^9%x0%;&vn!fWqkYX$e@(X5g rcy=QV$l>#JaSW-rm6WhRl!3#5fgy^4(SB882S~Z6tDnm{r-UW|4-Y3B literal 0 HcmV?d00001 diff --git a/e107_images/fileinspector/close.png b/e107_images/fileinspector/close.png new file mode 100644 index 0000000000000000000000000000000000000000..6b06032ecc1be030f3b3b96e7b4daef1f6ee819b GIT binary patch literal 911 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLlYYD-{(S!Yv7(}>t*xWBw(ruV8#{LF*t_@e%9Se*A3lEV z+MN?8&MjNE`uzDjeSM40oVj%C)~)Z~f2OBrrlqCF#id=ja%aw*IUym5-@pIP$jJZv z`Ex@<^Q>9xD=MlE9JsJx!Mc)?@>j231_edz+`043n@=t-{;ytr`1tWldwa*%uU{@- zzA=0D9D94$jEsWF$b{tNfa8y``lkJUpqjbw)u!{mGLT|Ni}5 zUS84BG3oQ?5B2qvqNCHiyh1ZFihlq89TSsKTif;f_pd#B4(;80a^JpFXU|@?vU2?V z`P<2p=U1&dFm2k3rl#fx51yr^6*e|DhKI*?b#;CH`gzHcl@~8wjE;^!ckc3~OV^#9 z1C}jY+TXt*CMN0Ly~j6iKJxSoJ9X;Xym_0JELl-g)4gZU(Wg(}?%jJNDk}Z->5DUF zEO_?p&4mkBl9RLY@~Z0V>%+p5Vq&tcT)EuVHvRhbJ2!9Myn6L^L_|t>cuHz&c76Ti zBS+4+w6xdPcc-T2L`KGEWMmZ-H2w#Jl}{90fw9|P666;Q5g9Bb!^d0^O`y}xdb&7< zRNP8>;mpjFu&J^4;0Y5!MTHA`YB~|Crm_hqoZ)^OdP!TPyt|R(g_=aywdtv>hS?evD`?;KS9sJ7GWY^VbxTR+E7nK04hI#bTiYLW{W z^t+Ykt1aKpt?u2HZ^|CvaB!vG{hiw`(OOYVR3EFj(Kldcd0 bhXKQ(i1@H15%Ft4k1=?<`njxgN@xNAu!9)7 literal 0 HcmV?d00001 diff --git a/e107_images/fileinspector/contract.png b/e107_images/fileinspector/contract.png new file mode 100644 index 0000000000000000000000000000000000000000..66b37a2c6f628e44410c2bec9eb8e734fc2bfd2f GIT binary patch literal 308 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>3?#4ne^UZdEa{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5i>#1^9%xzW?;){m0Ko&fPe6?$-UM zukJp2`Q`if)0gi&c=r0+_n((GQW+51#-0_3PQIcUNyeIePx) z_aDFh{{0Iy>Hq)#Q>HEgGJNmsn*^k!N`m}?fr8ipgNPEtEubnlPZ!6Kid!~k+=Utp zcvu_-eU5oDUHkuEBRl5koL?qE7qps|vmX4K8q$;Y%s*>yHn(Zz%f2ToOxiX)?>)77 h)i>rR|MxQSFeu(*6LV5Bj|ZB_;OXk;vd$@?2>{+5oaF!j literal 0 HcmV?d00001 diff --git a/e107_images/fileinspector/expand.png b/e107_images/fileinspector/expand.png new file mode 100644 index 0000000000000000000000000000000000000000..3463d9cd833800cf08bf8b83520773f27b35938d GIT binary patch literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>3?#4ne^UZdEa{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5i=K2l#}z9y@pI+xMUEKYjV~{rk=P z&)&TMeCxsU2hU#LfBNe5GQXrzkWS?_3rBJCr8iU{Ql$D z-@kwV|Njp(Y0A_^KytCfle=KMgZzSl;#dI#qY2k`pdt@X7srr_TQ+Arg&GuiSTC+$ z@!-gWBQ3w@Ux^60xq5q6iFD}=W1|@zD>!z0B|fd$rS`XL-Gubm*Kb#4US2A@ZkzB$ f*2Dj+StS_6rnA1d@M8NfpqUJwu6{1-oD!MVZ!gGrLx3_od)TyUVow|4L-lk2P+S=Oo?b~CtF%t-oJnU?Af#9$B(~z_wLiDPcL7-{QUXzt5>hyym|BC z!-uzT->zJ_a?P4G|H0scdw?#`o1P^>e!&nC%1H(uj`^WLLl1hoIEGZ*vN?BMtjR#Y z^`ZmMLe8$e-|y{iTEH~x&wp{tw8rmm-?T?IUpu{fM&_*D+2K!LoICQyi8Xr7#pfqd zcBpv&3hw^1!RU9vl=NviFU~7`N@fja+@#pa7r)f#z`V|~g~mm^2?xF`k&jH~+mQPI z+Y+k-SNKe>^G|g@=3FJ6km8=X+L8Uiqd)Ju&t;}JBq@eXTDNPqe8LNzAoZQEwDvK| zNN$^SJ$d=pXBj&dOcCO;kW|b^$Jo2Nvr>}4A+O;h$Exns(9Xxoj ztfM37kpH`P?>>F{^!fAWSFc_jKYskpn>Q<0uKe)f!zpr3nr_e2bcG=@ z-_-VYc;_+Z6GG+7=k7W7!E6DhnVs7fvpG4v z_tGt8R=q6z_L%c^{bPLU5@*^!?!P}@yzIUBx>r9sj?`}5YhL~yKg9>Y3Oh(#_C+(o0jXbY}@;1EmLJX&o34)d~vfPn^Wm+*M0NYVz%pNY>a1Q aV^FcQ+jDXC&ND!NGkCiCxvXuxBb93|EyLXF=iz_QD z7cX9%m6esAp5EBlsI9Gi;J^VJ8=Jj*_ck>(<>ux_L`0l8aiYAue9@vs*4Eaksi_w) zUUYVL-nDC2Mn*yB^wQo|_tFKHJkn=+Bh16|f-ORI-`x&>e=_t^aO?R?fA+n6<+|^X|8;i$ z30!^+mcsly%J24C+b=OFHWRnl`xN#L$c^nKYF03~MS6aiEk6wU$BJL1nxW7Z+q; zsMs<2wH!2!%qc-5!ZVg2ABE>Gb)0o12@l;bFw%L3}=&%Vo7%{eFMY;W#`zoSB)i*-+2r z@p$xlz0qj&Ajr_r(80k$Od|P-LWvm+QGvioCNC^3#6Zw&G8s4==lS!7sw$V;tx>5) zMnCDu&&>Rzv2nev zP1VrgtFE>Kzyl`pvB~7DuC~U-={h=$r%u5nQcR@^Mk2nBj%}Sz-O{2#??TWpiKOQ7 z9O#>Mb+Fxji$v1%`7)X8ubP_a>1idK-P6-^qqkRCSs5B1N3d9_R2o4LO?x{8!$t@) zVlW^GibSHo&6|(S=B1@24V(Rt%Ux3{w^LGr{r&3tdau{Jy1E+s7ZX|W{b&_#^Gj)E z|2h9t2C{p0f@mL)7g2M{+jJ-USuMZO@l-D5UF;b=ZjiFI)jfx1k0M1`>1v;n1jQb}hcaLq{C7i(0 z#H@qVhC4I&h~n@INaN^r@s;Sg{I=&-$I18pJZGn;W&HY)`l}L70r)(H6@5s2^EP=x zqjk`rBXt;Mu8rNa((1ihvYRqWpuClwkJ}p(=11Pf44Yo5z+?J|>)hhk&!#@B|6D4o oY)Jm5lNbKoo0f~c`0*3Rfe)z#KTb_Z4$%aGqC6T^OsW0kZ>2nr2mk;8 literal 0 HcmV?d00001 diff --git a/e107_images/fileinspector/file_missing.png b/e107_images/fileinspector/file_missing.png new file mode 100644 index 0000000000000000000000000000000000000000..22174df016229d417c9c8ac5c6c66aac3e83ed2a GIT binary patch literal 862 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl(`$?eL8>s{FW_S3@!W5p1Zhp>sDpso4fZu{qX*svdaELC;zuj z{D1iH;s5{tPM$LV$f^H-|Ni~``*&UQwU(~SS8u%g_3PK;$B&mRS->N{@#ek%@7}%J zyzBq0S@WmNy3Q-!=;ruz*REYTMQ7!t?-&?e|NQ0G_3PK&1D~Ee^W^#S=l}oz@9vpD zY5Gl0p?S-fU*ETH-|E$?H*MPV^5x5=OBUa{b!*?ghr*KU>l@cBTej@Lft@}53-8{& zo0pToDKc~GjysV_mpuJ@SFOER*?2E9eDmf_ak=%|wr%U_UAX7q_twt+UEOou zzWtGqwx2_I#@TaMzkU0*eEIV3-UTO5o;-8r4A8-SLQ21Z@l;z9_i`FdSk*SGEU}P7RdzK}pCT5l< zCz!aPfuY>g*nW0Op9-^mvFUaPUgpIji_P0D0@hX}db&v^^ER`)i%yn1u_a0OYli4O zDYh~;MK!|-4aJR#GdR@g@;Zr-oiL7GBrJ0V6d!iy@e# zz{aB;No0h9@-VJ#Z864ew+D;}aO@cw+Zf}!@58>|J?{%^)nC!)-k}CJ}wq&2o%8T>qfA*;jaX)xuYknL_rPR|@02tDwCpWm`_Z|-I3@5+r6V7Eu z1rwl_lwD-*&t@@7nR!e`$<=Z#^Edz`Cgsu#Xu)7G5{Y=dUJSzw1_PhZSE*EiKp-3r zudc58d_IrI1H-V%WI|Ci8jXfRA-~^`AP5M8?d|OZK|m0MdA;lF>teCkwPeR|TrQXY zA?Sx8th2Mz_c#slVni^u0>bMAp-?EMy1#YUL)!1IgRtKRPqnnPM1+}cxBJQ0Bw_D; zgB5iy+FdTx1A>v?PpKL!1HnKzO04uBS_{A?QB}k-$ZP8eNr1NNby4fUv{I)M4cVOm zyUk|!ZO~+em+X+`*M0~MEZT9sUccf1E#uEis{ptCk z!StgZ)yRF_**Cr?HogG_A*E7@yAX9FEA01U3*)}IA$@2uB2RwYqR8F-jxC+VfBm+kN-u;4S!Q8e>0`n7*?rZrwow)mlN8XAtZ->=S)Up87zixY$SISzA;#E{_OURcN;U+ z3@iE4QFd_yf3_GQ_DN6l^j=WVoQ2Zr3qRM>mN&V$XO9ij<*pB-!R4ZyD?Umm>Buun zg+&=fCUIq`{FRi`Cx59o24JkL|50q zg9i`ZyLb1|qi216eUm0l-?eM^#*JInuH9BsQ}^M+`-2Bh=jIk}+O+BZ{rmm>OHZCW zdG_p$=;)Nomv29N_H@gZJ%@r_=HKz*uZA3GxeuhzvBzp!D;34bVxyJzX3_DsHKqx>|L}L8SHKWQP`y ziH`!x%f(*-{qQbM&8O(uPVY=94k$looPPU? zu2%PBw&v23Iono=Ju3RcM8fZ9FHH7xxll1mEj7<-|Huz-n8oHpO@}z zhG%XmIajKl-re}Dm~H=zYn?B5TV?0)`s_Kgwn;xvaMmt~+pq6t-q`>8RYQ})!Y{k) ze&;Uxw(ZwSdnV4nNlPzpJvw#e+6CpCuJCi}&GOmz{R{7-z+aSY%$7u&^eX5F7Jp>b<^VtC2@XX~?*-uO2#GQ3#nDfKyT*EwJ?FnGH9 KxvX({S8e*F07&!6}2-yc4F z`1kMMKY#w*v13PY>)o)LqYUn+Hf`Dz)pc*ij2RD}e_Vg?$=| zJn5NodgaPp41qT_otGWF{N}`o6Ya|%YGyo|xBr7i;Zxh_HIpY#4sSfq7I;WJtreOZ^kqn_wD)=)&D}f;J#ee-MSU;ts^$>*|Ue;ZQG;`k0wr>C>C*M z@7}#9PoC6tTo_hRWnaNs~l`B4V@_0y(Jibga{*1aS=_frbUoa5;(7GMw+9a%)X%y; zdB>;Z%sCS#OxSF!NfS=Z5qVvKL2M(wT9o*C5SfMB{t^R$_PHu@CKP4j%Fy+kIlVB&_|H5R!fhDa8 z|K61GH)p6x92f5i?ZLW%-nTX5*F2Ez>4{`%;|3@o$Wkqn&=CKP54d zv+KOZNgZy3jX|+T0%8&lv#?kOPflO8TY_7MiNk=QW_5rFv&a=SU<5LFy85}Sb4q9e E0B`4Zr~m)} literal 0 HcmV?d00001 diff --git a/e107_images/fileinspector/file_warning.png b/e107_images/fileinspector/file_warning.png new file mode 100644 index 0000000000000000000000000000000000000000..df3686ee917c1b2c0f13381f7a3a5572ebb8cb59 GIT binary patch literal 967 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLljKs|BDtL zceH%@`gOjWYo?>)lqpjV9z1y9z=5@E*KXRh>86#z0X2mkTpUlHJef9a+H`-vjl5iw zc)7c}y8eIpa^~d8TlXLAHPf3qb?Wuvf|YaU_P4e)HZ~qlPy2uG-kXOHdV6~(PoDh$ z=g;}`=l{QO?sRGK%MklKH@7ne8fTgs_wC!aYuB#->sI&o_n$a%qAnx-@4me+o;-f} z;6ZX)TAq*h@yM_QZ|`f17ye(re&ecD&z?QIX=(Ih$Bw%P4m^{S-o9)1qZ>DJU7U9* z%D#B<;^v(@8IBI`-o5+u>C^l7?>~S3{PykJ(Y-l5TX+@MG|s+BFYEuF{rD{O%iq_!j!W)`JefADiG0flK-OX6^+B0)wZkpUXO@geCxhl3c|A literal 0 HcmV?d00001 diff --git a/e107_images/fileinspector/fileinspector.png b/e107_images/fileinspector/fileinspector.png new file mode 100644 index 0000000000000000000000000000000000000000..cdc463bf24b80d68d47eb0f46c8fe60a85392896 GIT binary patch literal 1218 zcmds#{ZrEg9LK*cf?AmNLk4!&VdfoFT&JRz1sB{4MR)Ak*HTJ>M_x%<4{_j&*Jx%a#LRKkfJ z*gaSTL3Tt(;SxQ%>z{r7RSyG$cP4qnD=R!c96>n4M_;RW;ko?_B2x;I@-hpE8TkYx z{Cpms5D=Y{kwr)(WSlR&G(z|iK`_~;;*ull70`Sum8yoRHE^LQwf3&t?SAwEIt`$Z z%Ykti?uT-8pin6II^gM{keCP#`oMs!t))t#P%?gsw=qx84-bPT2UN#~h91gfGU&jG zlqOeK()_~nttr{)a{!0MJ<%r+2*GKiUdwwaIrDoZ6&gM*t*SAU;Z+?hSnjFKKaM(` zi;Ii$w(ksUU|n3)*dv&&|+2_j58dxG~ zi5N~LzN(3V0;s6LtX84O0Iom$#9|5j83?uSYOV)p=B!-}l*V$Bj&;NG+ipjBkXohM zP^R^99~h=*V3k*2U$0WB>gwvR7R9dfOMo2;JtwSIn|4&MwStJxmmADb6=XCTRW{)B z1*64r^s++Un4`acz;3tq664XSZnb6tmUYl~T-?lJ77^Xkk zZAhh3vI1D17if5nu-hUIZ706ddAE3;n@LrHLCBjY9}$o~1XdVV?VJ!2+8^9!lB=Xo zfm>1Vmr!Jv_Zkd_-rKR;raHH>1?Y!l&*0@k2#IvPMd_ZGcQjY#c1(k|?8sxYbAgvU zJw1b>=-|1d@aS_G3>R|PEONDc^jni@PAKVQ=Y9d`?aj?iHx&yDd0WqnYsF#1^$|?k z&8c-@>A*FRi=x{Wiv|9jeS6aaJk@+$keHD4pYuN`m`j zCSJ@XrTXq76+a1G*GlghF`sC%N}5t|k;BLbclKZN#vEJqtFHcKyfK)vtYkeAMC>(< z?eSjMijsCm78Z40h{KX?>V|;;@l(SO2Wj{qbaHl@QsmC}$0ncsb>ZNO{iN?j5iyV# zk{QJtx0>q?kVr;c<5$G9<`C~q3;TP@H#ueJQub45Z~F;K`Yv_MO1mD$TW-|}eY-MG z#%HByKIY}?O|tHM@kQ%C`V}9)w`k_^hPn4d)RhZ!^i=jpmjBwI=_3i2P?1J#)<@;W zVO)cj^s8~%rGsH#3x9649u80v#%+@$se10ZC3Pj|kP_qNhlH>SIg$f8Oi$8CbYudK I9g$x8H&jtF&;S4c literal 0 HcmV?d00001 diff --git a/e107_images/fileinspector/folder.png b/e107_images/fileinspector/folder.png new file mode 100644 index 0000000000000000000000000000000000000000..e11cc48bf4391ccb071cc307cce1c80c47f986ad GIT binary patch literal 1202 zcmds#{WIGK9LK-3`rvfBU1#mKTb=2qx3jI+(XFJ%7A01$gxT48lN_074#{Kn#^Ej&{7kS z!1!c(f;%ONmY5KkK#R{xd6eLfAda-lm!g8kMn`en29+<#<#N*#CXVA6fPU&>S64Ui zd}J~i%p_G+Rj;o<0saLH!v>-}wOSpDVNKk!<>h6gwnHYH-W>`h;Af>$iIs)mnl#uO z0Ch%BBOm(6fcL_~P_u?%Z3r6~89@yU8(yZLqHFTqz@UK#moPB}C%!l9X;5|=Mgw;r zMVp#E2-SO*btYiNL&6r+nhK~;F*6UlorGS1*E)l?Vj$BSwim2V7w;6Xv4xw2f}`yX z1;Yii*$jsIy@^D?@4&XOx%gH$+tVbD+f+T<6f$OV-3`O7q7FfSfB)kQM^wU;*Ls6t z)T&{iScXYOH;E(KGhXcJ>1DHXYi}g;z6pEq({-b!VWTU1fuC1hUA?lhy1cTgkjr7{ zA~77iIn@WcJk#to;|9~pb_TrOx~Sz$?BqOq^Dd_wN z{*_A_;c9QBloc6H{crPsATqew$U_hZghCFC%3P$s?{vT;=uAsnoZCLK`9E5O{w~$m{O*T~+TIqft*)#}ec!5}6_rZy*D0cJYtFk) zpkcxg+5(+E>q+Iy{bT4~8TWj!suPUzrMv>)PcrA!0D_va<#k8E3DY zO6imD=Wr`(^IvGa-z1TGq^W&%#~6pa(w91aCna*ve5{N(x&4fFAU#+&@a7xdHA%k= z-l&e!$H#C4C6e~QD5Nm#A@aObBS6)4- t@+qYqo=Ce(b#r>H^7B#GopS-%4oKvWS#CwytRVY~5lT=vS@2<8&fn+_E(8Do literal 0 HcmV?d00001 diff --git a/e107_images/fileinspector/folder_check.png b/e107_images/fileinspector/folder_check.png new file mode 100644 index 0000000000000000000000000000000000000000..357a469f9c08978ab5b545095f373d67523346a1 GIT binary patch literal 1202 zcmdr~=~G*E0DMJ3gmkOo8;CsHG+?>->5ziy^1>O_xPt(Hn<7>1clCZ$qY(bNPQ@u1lk z!}2@CZR0G@#lEY0PyeO4tj3`;Mczap365d_)nC`Wgy=jRtd%?AaO zNeGHwpADDEI*f3`R`=&hrAnbtV5)k6)$pGsT;vAxm%c$P88P>LP>ZE#Ap)Q!0Ff|- zU({|UjE|`X2Zw+~1GcBpX^yU4WLrDS)+S3tBCtJRUU_bwRjjV9KVdom(T9C~eP*+H zYfCSXLvVC$Y`8(x0C%MsvsGZc+lJvTQ;>L&uwrmy=7RJ<9l_H8KPAq(TS zDSChOaqurfBXRlmM~*WhNm2hb{|AL0uHF|x&;f`TNQlmwp`3SgLftU!MY*>V$1m+@ zEZ!B(>Gq3}6Ft^ds`g7SzsA>Gecj>ETW7|455HffmCjSIrO?QU%TDo5J?`j&5GcQpKt{wkHUmQo{?9%trr&~X{%#MxvNIba*1^5N@CeyE$ zIx_`YW5TUtTwK!|Roa3FI!;)rurnuVMc9LT_vCEx5BJh84|sV?I;S+>9UW>t$->ER zxwqh_VD3_{?&mWMbLNfAqNnR!M@}St%o`O_8qdo@>Jmv;>Q@$i|I#)5G-TDLe4q8L ya~iP|EvQY!d3mTD9p5&DuAKhEVfUP0?g8kgYqq=R1=(5q#1Juv6xik;m-jc|+#JXN literal 0 HcmV?d00001 diff --git a/e107_images/fileinspector/folder_core.png b/e107_images/fileinspector/folder_core.png new file mode 100644 index 0000000000000000000000000000000000000000..e09f201f2cbe136e59d2d61e3de6f0908cf5878b GIT binary patch literal 1199 zcmdT?`%l_;0Q|PYwli^>t!vdKjmwr+r*3UpT^AHzFvVF%KwPa`TAYZA=qNDlOd9LA zRcjqa?Zf(<5;v;`HTZr^1r%#xinY`F+O&cl^0J@>zF+u^ZGXisxx3u`dUu-?AMNJq z?FvDV8!-k?cDlzuJo1K9eFNPoPQx%FE<`|3=k%v8rGGiI7ng96OUX&&=F+axp@`I+ z6uJ+QMPty(bXw{)_G5Yo1RYE!#U&6jGBV6&Gl@jP;c)5c>3lwaVqzjID=Q}_N1;$C zmCCJ+T`rdknuB6uV&>-NP|NGpwRH}M16o6G+<;LOMgTw?Tv5kO`*3V#W~NrF)#>zm zq5`XG8GvROh82og&>aQPCeU;i)pGW=znG^PsCh6g^~yqH;ZE;eFc!VJ`NFpTMBSAJ zc5B6A37BUAVJNV51qTNs#zyLe^Xl!Fr7#v$`2myGzFoW}DzHhimGg_XQA%-9(bSX- zv071-jUaY(zqhru6};*Orb(c?572sGSkm@~I+kHCFE3!iAxkB|FlG|BTT~m{-3jRI z&yMYL$y73`tQf4ku5Y34X$7U%3-`w^zg}gHjEtbD9XvShFbYB4CzH}kEEda#Abx&+ zdAV#VmFn*9u8_;gWHL~8%)>qe0->qonn={Mv9SS$;s6k8i;n?Ov>mM~|1JRRgpQDz*lV#?-qO$1_tp!;Okg;Xy2>`rY4}j# zZemDC$mda~t>PG+MgzuUzfHnxG@2Qi%qSn+%Y zgVHj#?l=uc4KMO}-e+S~$FtaPsv4$eeO3%Fp6~QM%O8^pe?(5oKBiay@S$�zVje zj`#lJQQ3^|Ayzp~0 z$H`sf4yMR6QhSr4zW*Q~`L~MU&#1`_~Mg?tNh?X56NxfCXqAqDt}1x w!NuS+at6jmXVBKnb(=x;WgP)or{W=uC**^&Wl>?3kG@ApigX literal 0 HcmV?d00001 diff --git a/e107_images/fileinspector/folder_fail.png b/e107_images/fileinspector/folder_fail.png new file mode 100644 index 0000000000000000000000000000000000000000..f700ee8a805791df766fcaea9a6d68aa7808916e GIT binary patch literal 1236 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 XY}U=vllk+Gxgl~mC9M72k2!w>oW4xk literal 0 HcmV?d00001 diff --git a/e107_images/fileinspector/folder_old_dir.png b/e107_images/fileinspector/folder_old_dir.png new file mode 100644 index 0000000000000000000000000000000000000000..d04d224ada681dfa4a10259706d13d82c255b9e2 GIT binary patch literal 1222 zcmds#`%l^j6ve+WW zn?+Y0)<1f)ZAcay112M)>g%+(z(zr!4(?8KOA9>`qQ8 z3P{N-&PAPt-OMRKWukKOFeQtqBmfA#dF=`^JunTll38w#*W>k9bx{5~IP@MIG6f3q z_>9-NN0>hJ`(;`SsJF62DkJ{fvSG8A$|2AeHf-CxyGNXz0mNbtV(5*GUt91sIYFknWRcjqejo!t{unxu;*X*x!COS{UtIZ#0 zOXN(N#V8<-Oj-GFbEI1JZ@|XpX3LYOE4UMcN9|82LXOk`mY!0`)GNjf^U#NT`yTqU zewEf4AOfsKnWOg%*dFFH4NvpIb=!{HX~TBWM17U~1>T|CvEy>*RJLw8cAp2|)9(sE zvv&qCSnL9Y!Dw=`pLOhm7hg(2#Xx5xp6=QWm{=5B|3^FP>kR~2OCKYE2WAD!t(BOW z2bjJJq+F>ZPApb+P!+2dGL7l=`6^qAp%?~>zT<|%acb~-S!uRg;(-tI3pO#E!$q#8E)^&4n z<6!dNwP9a)vj6P8WV*!xmp1g zD-3lFEgq+&XOJeA>191NzdWXD`k*cy6W@(hX^m4HfkZ6!%v>f_V>-Hfe439du()l< z?z~84(um1J)Fp*;Y;x8-H%^;->5`9_dSWJdpnotb@bBbYhZ2MBl$2${5&t>=7Xpww ziLn3>5(Z04L6)m?6J87dp|2^%RDI)EWC)A|G7@kn*^tt7&QP(ho=pvW@G;b^d&d< literal 0 HcmV?d00001 diff --git a/e107_images/fileinspector/folder_root.png b/e107_images/fileinspector/folder_root.png new file mode 100644 index 0000000000000000000000000000000000000000..073a5a59911416c1805b3f8d491aa0dcda52284b GIT binary patch literal 1156 zcmdUt>rYw-7{*W6&b21CX5Bj7hpyZDVO`d^rY_AcZe`Iq+i9HI)g?_@Owp~>F$F5q zn5ng{BC8iBa=2Dh)PgraG2TkKigLUFEm{FZzyk*as+*`_JGT85dy@C}k0MIvi?q#w&lH&;}xrA(7KA{9% zi~&&Bae0^%X@%$lOcn-x{g)yw<}(0z>3rrlIVmvgo12>pg+eNo%3`szSR%t?tIM@6 z7E2HWfnk`<68Zd_xSxu{;XS*34R(1cln%Y#1VIp&+s@(gB@(H@U}|dW+1lC-26w2` zo`_zzYN-kM~(1u-Vx$ZZbU$27`7xGAh$e z%`Xc3WgbtUTdX0IJE|MFOUth2=61W&t5WIs{O;}TZ3=}i6b_h7ORW13ghG)*q4fJV zYir4cg+*#L#9%P)H8h07VJ53zr_)I!g9?Rea>m5rh^D6ImX{rFx37*&<#kH5+G!%W zxmz%zR%<}8k4pVx(YgjfvxCDblgTWj~>nUN|XrVZ)+cfj8;b1Ft&(PUQQW^ zNUEKlo>k};lu9LwHB?bi)!I5@Uq!~o#_03`Dplz9dPn5*<-dVWr)N}dv|24QGqZAy zQ8)br@%WdPtXAs^udQtj_Tp>mjYgABr)M%5J3Bid$TgeIkDpj3Cn1p8zOk|0+dI_W z*3;P7#bysqsErzpCN<|fzyDcFOK%%*sIv0*iUR?`ffxVkBPo11QaBkQD5D9Ec;CT?o)Jr~o!n*~w3cit@(qolWQ)zHveujVH;z@_@j2z+Yz3@RKG adkrYd!R7Ap4;_ts0!T~ANbddeTGii@6A2{% literal 0 HcmV?d00001 diff --git a/e107_images/fileinspector/folder_unknown.png b/e107_images/fileinspector/folder_unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..e1712f65639f37062bf24f76d007c7b1ce69d8e7 GIT binary patch literal 1235 zcmdr~{WIHl0R9>#wf1Ir8`a(Q+;#1|bQq>*o2Y3TrZN>&)U7D(%BYuIQ(L>C^WH|& zs$!~59fDR6k+_D8#9JjAsT&%hB1Fg=Nl1LZe5TufvFGl2o_n5OpQj`ohdp3>$QFX2 z10lhuBKF+w9Z{Bh>iorr_&u|_92gb|LG+Om)}_k5>`27K5b;+p5lIPI$xvX@)x>0{ zkhFx$$q~s3NjaIL$=^cId)LCxL}F~P-P0`vlaKQeWM`XvkkT#_3WW?tmwk+&ux!XO zpi{3mHwpmc-;D}pWl@;=fmW$>4mvwCE1g43TLqGqI&}ULj51IGQK62@2xN7nUue{^p64rlp1M5rs^)XjIj6IGn?oYw$DlF8dr} z=qVxn0?Zl?$@Mt4p{QvAHk(1M2hgj)eV3QR!$3bseLyaw3_^kJ)6*-z(X_CL;ut-S zI?Yumx4=5nK577{E5Sy`4_OSQvMVm-p-0M;>&5Y1U0dd#GLb~LZD1ynXS=$XW~~Z5 z{R%;lP3{Fy?+jsI^7;H7SrzCAf_0B=g8RbrB}O&(oe7C`11`i!tG0XbC&Ig2ev+XHEQ>I4>uV5OzS2@%Argt80Q#X=K~}9~b#>Kb zG66mM5}{yOu>!PQe8v#+su4^)qxZ{A624SA&tkCwTn+{Gl(#GDxH=dBO+%ENk-IGD z!Gsotm2TW?ml5&?fSxK8zIv-z9~v6I&)#s(T!N>IkvdzTZKoFJY{T%b!YBR)-7RCD z$K!AF(i`(G_O~~e(B?nDuy-e`0oA*vrpE2;3-i(&e1SBkbYWA~7<|`$?M4fiMbM&`f&Uf>JLO2#EDM@GqQFjqm;}CPv`!|26+3 zg^=PFEd*IuhnxzGy#6MUje5U&tZ`pqK4HI|g*sihsQNiEBacaO$US)@L^R}HoSQLk zjf!`V_YCm4GKUGJyp>{8kKw8xRq~&(+CG19MRUz&%~vfjBm@4e5^WIC+Tc73VND-@4V>5 fWV`=ph4O@a(|<+#XCH0an;Qzj;7+xD7oYzREXyAG literal 0 HcmV?d00001 diff --git a/e107_images/fileinspector/folder_up.png b/e107_images/fileinspector/folder_up.png new file mode 100644 index 0000000000000000000000000000000000000000..963e3cabefba53604afa579c61bc9fd5460bbdab GIT binary patch literal 1248 zcmdr~`A^e#0R4iS2%Vgd+gLMF)o<%V*JPy`i)0&NG3G8&MhPJuGY5pmLC_JD zhl~HdANz-g4(zL`rBT4XeS&xNafG1GXEvYazTeNr39i8j0dcs5Bn%M?IY!2XW6z>u zF?g&$7898g{~T)vLAv+-ywR>aE*H@t8jV&e7W4Uh2BTZCOgK?B9ThBloDJ>#tqQr9GV$eUfqxnW5BRGpD);(BZFQSP*{{PH8mp%7xgarKP+^{Kt(J@1`IQ zXLK;x5>^wjj2rmspdGd+j3kM-#cGa+rpln{ah^uds2C0d)t7oYI}iY9y$$r*+Lfgb zDiJ{}7Eh7Svgs{aQQ51m+H6^jV)%N)lR}FzyS4ckCX+SP7_6Ef19C}U!Goc9gX(mH z_M+&$X@X)sysVGR9Ar*Ty#iAX2%?p;JlE*BY(^$L7_ik4=vMA1p_~@h>xs5R$&7o1 zKQJ1N2GJseXp=ud1EKb(^)7UGcMo8=?{VCDyr*C)b|y*pF^Dj2GyAwmP|7f%_S>>D zs#4m9qFW2AEVccfY6%W(CfWUN4$E;J1Y01lk;tVonXIM%+|FY1E+b7g5x&_|6e01E z@snqVF!pn{?}0D}gyufTNKYqE3WYV`H#%L41#M4!r$o3g)tENP9WQmIcn3E*Fd^}pIbEi|3r z?;G%6^S@GvoR(n^K{^H~7e{pRTsX_{;DGDiyfxe6VD?DrBW_lkg|43t&myn+rB|ty zzUSK4L@cYKWa!+eiF)Jwr7&9fq3`Ynm|uzSU8WVAUrs;TRcJgt|0Sv9g&ijKdh{)4 z4RzzNVGe#AzD8PYD_pemvK8F?;ixlSSFeA2K)*cm8r6ndNgbP@Um(_1vFDCWR`O0c z;q+q2#(k~3#e#J!d24CTto>Ds849M_-HYYqP@RAHb_zxMS-Y9x?b4GMPqr{Z2AP{7 z+Y1G+NoVq7-z^I6{ML+SaY(7&%@S-@EQ(4iCQco%h`vWLinNBbq9`u6RD_$pkIU*g rF?#x!^@S!YdT9MT@4yEehcq2%=XmNfP6caoe{~4u>g&?s6qfNftXD13 literal 0 HcmV?d00001 diff --git a/e107_images/fileinspector/folder_warning.png b/e107_images/fileinspector/folder_warning.png new file mode 100644 index 0000000000000000000000000000000000000000..172b0bbdbcdc51abad415b076b0c0244345da94c GIT binary patch literal 1236 zcmds#=~J6!6vba!1q@5=Op&5pC{9}#rBJ|1ut2dOi!^0OP!KSIl7OQ?t6}Q`ls1^w zaXJ;1ux8S*uR(|jYYT}iC28MKB!q@EB&;D}F)Uf$@EG;K@Xp-dnR`CmFX!Bg!i3tP z-bO(XWEUP59BtM&|5@w(X1cl`z?$W?)Syd25Y#^U;p_KT%(oLcB$kZLB$0EHz9m9I zDVfPc=kWBTRAMwSDJAdP81Xy=?aPje#DyRL>{g*+81Cv~FD@<5&dOF+S5+!i0X{(} zeBOV+ro6m-x`{%gm6zDta#7Y4Vt}~g(cY2|pU($dTL@x)&<3{pe`{^sRx|gwpBp#m zpsm@^k2M&LV)E5-KNp=&Cy`3!N+qcDpd`i@r=>*?+}adegaGbnMB_`2!1 zT=ks%h4*Q}*ce=6H8jKn4gT`Wkvr;oq#7lf5Vz(yfR2lUJy@Xm706^@lg+7V+T^7G zgwb%*lXL1MSf2*QW-5UIv;n$>xt+)Oy~&K3S8{S#==|JfOI8Gj!>uhVnIc54`5xE3 z{#tDeA|5pGGA8Lo0#8@{x*F*9Ph&nZ8cj=GVQP;5 z1Ik^nnlqi_h3Ixm9IX(<)Y;jk5f(`NJf*WTFp;j&taaF-mgkkj!y^*3*PPFBWUD(T z)S<7hkD7!x4fIbJT&s*eQxqFp<>RbYt8ZelvfFv=#>N-7aG=zY$K%7*?sPg`zc6E* zran3445p^EL(Rwz8>~MDj~JYu-o1^sDJH`p8yBWWEOp?RKcpA|xI!YO`J-2Gfg%{* z?kogMSD`>AgggjE=NQU{~VWW2%Z4)cS`p|fZ_dgWJIG< zZEM<*=XJ$+{8n!+K)9MU!=j)YX#b$#@d||!Y*xJTb_SxBy~(oCb0>^12X=RN!8&V^ zMFIwvQLoRBj|YEs+`fGWj(d0U*gK%T{eFJYd}rZe;Vr3D3iNB>-$4lkG;>WS$k7<= zf6o7i5JGKQhad~f@Zca^?o2Y*+HxrZi3=Hg-;#QvR)JAgQtYl;pyzBZM2(I~hwTrJ zrglRXl0IA2*&DwnCX|-JXd)PvJB^Jv)!db0mCw|P9cb9Y1b=3eVJSIzE?cn>&;Md* zzO`O|hL}vdAtM@#1H{t0>NnVK?_F+BmB+z>V``RiQnhfs4zr_S*v^dDM|`@53jDga zAur2BWhSsGOSr=hq|URE zI1)|p!Kw@I;c}ke>8Z)w)%vgA`rcRTud?Z_{XwI{?ocKw?x`y-3Yc|+kLnBcaL2}OScUP~s6 literal 0 HcmV?d00001 diff --git a/e107_images/fileinspector/forward.png b/e107_images/fileinspector/forward.png new file mode 100644 index 0000000000000000000000000000000000000000..f66eeb20e0e8d3906e6a9928572f783f8a03bd72 GIT binary patch literal 1231 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 N002ovPDHLkV1mukXyO0> literal 0 HcmV?d00001 diff --git a/e107_images/filemanager/def.png b/e107_images/filemanager/def.png new file mode 100644 index 0000000000000000000000000000000000000000..8973e8b834d4e60778bc77e382b81cad2b6bb2e7 GIT binary patch literal 396 zcmV;70dxL|P)c-3s5K=F}9oQ?ea12JMo>U;OF?vCMR%odu z%Zc;(^G^~iisCcR^Jf6K8UZOvsk^=Bc@PAFYTNcwmgO5}S@x8sDWMcNgh;Jwtv723 zAPmE(uIm@n@#ecxAz2vHQBdPo##{=udup@&`9U6LeuoaY%_Z^AVn!uEX+<2Zg}RaNgz)4ZDV q2Xm<9SC;>Pd`58?hOcRwK7IhgC?CIytPidL00006otQeJ3HRDUfWTe1bG!$7hpu(fP#=kgd(AUOo1q%Ky(yFqN8?){r1hzrFh;DQgEvoY0kOlo;g=7FE9VL zxVU&85E0?gQcC^j9z_wx7`3*xcC@mx@&T)>tGWDd1qs26b54q)kl}DBA|gqWNUPQQ zUWX6@fO8HB0j*+0f&hXJVpJz866s;|U>Ps*0V%BYwFtV5h6G zPSZbfOpX;?ny)a|H1x7^tPlbsBGHJzR27@sDWCn2vYk&d`}j0(zIcKc=1#GFc#01{ z_k44;OCtu6Fd`rt`F7YD@WoGkeB(6U)G=D|#7Q`F0!-Zy)z0wImyYCCO3kQ$2}1Ay zY~1YAPV4MshK<|s>lWk=u5H8BHr#ibn|oEh{;>m5Kqx!wa4ezI^W4u3gTKLA$oufu zF8q8Q*8hMaE$H9A$5yKcLEsptC6tG%I68YniUts1>kvNq7Orf-y*LwAR$?bwmW~go%^WymWCIC4nGN*uY?5sc1zUSBT@7IF3vTGo{{d`Xxk5Ait0n*d002ovPDHLkV1f=zb6x-d literal 0 HcmV?d00001 diff --git a/e107_images/filemanager/del.png b/e107_images/filemanager/del.png new file mode 100644 index 0000000000000000000000000000000000000000..902c38087e26653438637e9f0620b12536337896 GIT binary patch literal 864 zcmV-m1E2hfP)^PxWD8#Z6A(zQMLnQ1do6`UM5- z008k25X~PS%#oASpP|eqChs~r>^nR5OicH2amGwcv_eDwFfjN40P6q%=Kuif3JS;> z8PJ=a)u^h+9UbW@DdsOP>O4I3Mn?a4cgjjj)2*<(LPGi_CGh|Nu z!VeGQ78c(jA>=MD?mRsCU|`KlOV*p6)3CF@KS1>!9_j!9*8l+90Rh|w2G>Ow;2H#g@gDZ?ix*Q%}1tgpBo9rQv%|AmGBkB|S3j{b*-^;cKMAtKS6oynu7 zyC*05OH2QglmDQg{g#&fm6iXWpZ=DX`)X>*FE7iEk;tZ~zc4WTTwMREs{gdK{jjj? zJw56+HvOxs|Fg6ItgQWkfzCcY%a4)Crm49*JN;*8|GT^Y$jJZ1#Pm%~w*>{V2?_B` zO#i{b|Hj7uzrX&Jl*>p+&5)9-JUstyZvWKO|KH#L)6@4|UAYnx&#JA~wz#$z7xZFc z|I*U`+1dZr*26|dsaII-TU-Ch$^Y%``)O&r85zr_sME2uyCEU?baemg>;K-~^NWkS zPEO<4+@@1h>sng>XlS)1CCH_x(yp<%D=Ynnhw_AkxJgOk%FW~0+pJYqt1T_csH@bl zva>KSw@ORm%+E@VvJ3zK00DGTPE!Ct=GbNc000SaNLh0L03N{r03N{s!)a7g0001c zNkl0C<^utdx5<`Gzj`W z-LRYuG7=C7UmgU1Dcq~n5jY?84q9pZXG~vLpf5D4q&z$)M{+eD$hzBk<^+406 z8k4rM#+0ViwCu7AyW>0W>^9)Rfyv9x&ij1LAiCY|mrkei3V^18e}@oai^*&;6Z*QjmGm<3HaUAoU&*wUdB3>VjM!H_Fe^#_1fu%<#z${T~TJ?R6sS*$# zl!{m^7QCj?etbJQ!R7B?5F}9}1xrD-u*f6>UcQJI&6gRlRyw8q@%iPyZf9{aadr-7F3`6*Vk8l=ZI-R0W@UTq) zQVL?%s}`i=Fx$q)1`O%((Gh|mFf!P8FbfD&z;Rr&n{9Gmrhwu`u~0<2-A1`wMx|Os zjll$~lft3uKoJp^0+xxkKir(hEa&HEsMTs{G#c35-NoA48vB>Rusf8GvH_ARn?Yg~ z7-T<~;c|Qh*OA!Y-^Xw`#AGsI3%>6|D#;d1$4UlKG)KNrz`M6^2;iFSv|25`3x<^n z!YIU}Y6TA~6$*F8@0b`i0o+Y}G@DIoP<;L-RQt**6qLLP?(Fmw@gj!3CZxc~Q%Yg$ z@e@v6XgVSjQksonGB(Y}_^xk0<$!-)Tv!FfB#g}U^>t4C{`zuIiM^Fc!k!bZF-oNp zJkK-xrTThs5WL>m$FMq7@AK~N^1#5ufPjK;Z*Y2ge7Co{%gfFHMzw5gZQ0q~7kd9{ zum4%4|5v2{Ripn=p#M*w|4W_!N1OjlOiiAiq0i6K5Ox1(uK#AO|6!{CU8w&mQRQiA zYdVtu9e@9Ry8n5&|97_kbF}|#u>Uhw<)5FT5qAHM!~coE|AfB(b+!LCSmoN<-ear( zJd^*R&i|au|Ch=ClEwdv!vBZA|3hEpDv1BB)&Ho{|D(|Vp3VQ6%KuDd<%EQWki`G& z_W%F?|F5sIMVbGHoxr}{|GVA)w6wR)=Kt{U^zrfa3Pp#|00001bW%=J06^y0W&i*H zwMj%lRCwBL&esltP!L7YQNeyxEZD`ywfBY%8=`{c|Nlma7++kElby_=7i?iKeL=V3 z&hbyz=kT!UzYK<98m8%FRs?mXs#iE}96{4G31|HS7Xo8!gRQ#TAC8KG6Jau$Vm4nW z%hg&&wnGrbE_(fe%!Z>Ds$)W}4w*HYEuqx50-jI+gkni5$CDLQqt;u*gm@yE64M!E xb9tgLej-t8nAhhIID#SG-tKaH92`%7yaBlw8z?-6xz_*y002ovPDHLkV1j;)92fuq literal 0 HcmV?d00001 diff --git a/e107_images/filemanager/gif.png b/e107_images/filemanager/gif.png new file mode 100644 index 0000000000000000000000000000000000000000..1188089ff65f1e7103b136d1ef8c374bc042f238 GIT binary patch literal 768 zcmV+b1ONPqP)F8*vsa^XM@G(+@WCFx}|RoI7XE8MCvq^W*mR_H{s2l^4Sp z^Pk*WOPZ#p-|tU%cXz*JZ*MQx{|OP%7^9YDsor}nib7RY2ZMpGudjdSL_`3}vP2|; zNw7A-7gJ)4vtM0GECXfmhzOldhq5eDRqXSALy*SnT}8J69J7Ki^___#4Sw2C6lHi?O0$IQjJs?MsT?TqB&` zCLE1$bMrLbUS-i7b9(nSOKUyml7vbzt2zVldBNntJ}WD2jz>A8BIok!ml&6khes2- zy_fMv-*Yw`Vv+_G^?C;}3aK-++$rsOi}x+cgD$ zw(&84o_VhH=4sk_WXX`NT!zLuclHmFi|?{ z`H<#)gZIxN1i$%Tun zXj$NWfM!-N(N%Ip5sWcNn9$5pdT(8yd4os{o{&$7s;CGeLX2@XL6RiKIY+D2s!?Z; zf+C10CP_%LtZvM*j4aDA##nc7a4_B4+G>UnYVZH!PDK?esVm+g1O|fv(G3Okv?aX<7_KVoFs7f2nv;F11#1cmcM=&MlPPA@#~!}IX+@bdH)883$h#|9Gw z5o*ZQkrGErI2PnD?e}Auei8*VWEW-=#B_hie(fPi2igsV`oQJGvg4|RC|_!YWI<7Z zNe=`d4}m;Eh)PFHI~EZ}W`Wi6bP`8}BgQOpE)Xc-JAt!`h~$}cj*3Q9Jfca&x)AH; z**w4q1SjUqf=`Pmwa9sRS`C=vSu=<};Mzr&1WW^Vf#^bX9!6H4tpq>-ZV)NVy8&4N z^8g->wQ{r?3k>#=03v{7asVs<16(IymS;)M6D}}n0Xczl0ti^35z~o%l^hihqLXK} zSdi{9AnEx^;GF`S4nTw8#=KSJDF7c}4;I=1U}gw=r7C20(pW-dZLQQxLf)EN(M}K{ zNB={%ym4<|GL!B4a(hmjrPkiqVpEtJn=M4iO`Afk&{@oiG?gk%k*3z1Ij>Qx6)7rd zyx#5_DL2%h%Qh(oEd$MEU8?9TZ_LS4pE|NrbaKOVmok73pnK~dmmk39a@J_h#*y{a z%!b?FVtz-OKUVjMi;LUO61P@nF02|Cn19sp`W12jiQ`+gGX*zbu^{Zk>zV z3;T1!HZ%~WFYccG75m|}n1HU1TxZC*dE>pU$@?h4n~%5(d3d_f}ie^$!8Ga4-M> literal 0 HcmV?d00001 diff --git a/e107_images/filemanager/htm.png b/e107_images/filemanager/htm.png new file mode 100644 index 0000000000000000000000000000000000000000..ef5f018eca857b41307bde11ba3eb07ed0be2f17 GIT binary patch literal 796 zcmV+%1LOROP)>bts000SaNLh0L03N{r03N{s!)a7g00083NklbLO5Qd*~?zxWd^~Y@z3W+P~R3%l^O0*PF0tm#8z=8!!y6T2C>#Xw&Sn>n- z2T19HDr!-Y3Pe;6l}Z&*pZM9n3Y&LH?5fOl* zC=d~>Q4GpB^W?e5pv*agS0T#<5usYGQWOQMiktq&dm#*9lzHyAQx1m0TxdzNf^s0N zzTk+pI>)F2dgtyNs3l$JAGXQqh z952EbcOKKr;PurSNd)cQklx^k6H&qaKYM)s)gR=!;H(}4ocA7pN8OY!zx$PQYb)IC z!`_`A*t_==L0IBpyU(rNeHKri=EF-HtS{D?P0Y#Ed6HQkKG^5$o8R!y!ACTnKg-@> zo7*>T;c=XQ?F!2a3GL1hWTF7TsZ0P-2=&@LL1#pNq|C<&r(b!C2m6PtuASl3N)ze+ zMN+Zk-v3vEssPGTO?m%~RbIYwnG5Ha=nf!xuFl6-Kj6isD#OPE4%3XrLQElwOcOg* z#e2n~Tzzw%8$T;^WF++xF0j;B5`32PcdyGkmnzKHV$#f`daOVJWt<61Nx*wA9r67y zzjODIWsq7LNlqgka`~jC*+>{?LO7K_Y2q{x@r+VKHFCVW7IE=Z%3zohTIEEojtd>5 zw7`4MMD^r#K@b?{9B~{^Knez7If_|U#fy>`Lg78-vcr2%6h%Z)gfYgt-QC^s`uch~ z&vRxwAtIolD5`oacjo7LPOH^oFc@T}QmI^PG#Z}(p-x8f)G0rE;>H+^F|O0;4Ez25 aXa54O3cgCX>uewZ0000QbC(%RCos%_Wm`Z2TVsIAgct($ddcIBpC2#Po+UXH=;dLzT4 zLqyRFy^)E6m5JimP*T|1Y!j>wS};!A*;ScsX&Y*qCTWuQeV+GtVH@{{1Bb&of6o7W zsNvz^>xo37S1AMp5vryXD5ba)mSqtNg;Xk)DvgYcoFth{mPJH-U!+(Psks07+c3t6 zF-El3;<~O>DiskCNvG4&*4B2__Candf4<1zp?!39HV}zL*xTXYL~TlCjn+OQ zKECf$Q&WT18WF)(z`4ug{CNI7p6iPfk2f&0yu!?4FMllM=-U(I{`+EVqR`&|GJM}h zM8vW!n_@9T>p&l^2M$rFT&JfcMQdb?a!oDQ<^zmfUBxTAM8Xz=V2r;_fTexSV7!N& zI~^v1zw>=@j@!APIP&OC>NZAk8Z`O3X1*C;=eL=499yt$Fuo5WSf1yyyLmSkX6G4B zy^TC@H`D%I++4WKvqKr`SI<%||H(a%bTWC{=3;6McheC=_IyS#x?#9nF^|nyh(ZajmuCuyQBpkA^07QfbyW08a$#;LA*zv7$H9kt7}@(i^J$k^ z?<*SiJk7aZAh&XX?t>+s3Y{UG`h-)58)&@Op;XdXA_9QchK)*&BLfLusyoBv^eq24 zmxy&d&*-$n>Xpwh3t3Jd+s}c%dNv9g09!=ZChfl literal 0 HcmV?d00001 diff --git a/e107_images/filemanager/js.png b/e107_images/filemanager/js.png new file mode 100644 index 0000000000000000000000000000000000000000..d5e25fc04429e23595b1e8206ff29b0a63c18d5d GIT binary patch literal 804 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 literal 0 HcmV?d00001 diff --git a/e107_images/filemanager/png.png b/e107_images/filemanager/png.png new file mode 100644 index 0000000000000000000000000000000000000000..b174057ccbab27db4d780a5d22e7d108ce3e6e64 GIT binary patch literal 768 zcmV+b1ONPqP)F8*vsa^XM@G(+@WCFx}|RoI7XE8MCvq^W*mR_H{s2l^4Sp z^Pk*WOPZ#p-|tU%cXz*JZ*MQx{|OP%7^9YDsor}nib7RY2ZMpGudjdSL_`3}vP2|; zNw7A-7gJ)4vtM0GECXfmhzOldhq5eDRqXSALy*SnT}8J69J7Ki^___#4Sw2C6lHi?O0$IQjJs?MsT?TqB&` zCLE1$bMrLbUS-i7b9(nSOKUyml7vbzt2zVldBNntJ}WD2jz>A8BIok!ml&6khes2- zy_fMv-*Yw`Vv+_G^?C;}3aK-++$rsOi}x+cgD$ zw(&84o_VhH=4sk_WXX`NT!zLuclHmFi|?{ z`H<#)gZIxN1i$%Tun zXj$NWfM!-N(N%Ip5sWcNn9$5pdT(8yd4os{o{&$7s;CGeLX2@XL6RiKIY+D2s!?Z; zf+C10CP_%LtZvM*j4aDA##nc7a4_B4+G>UnYVZH!PDK?esVm+g1O|fv;}jH z6D1iZZo5BJb&p2~QIgf}cGau*UbV%1KL0eE&7KQ^;C;ZqA?U;3A*Do~=i>bQ{J2;w zUgPZSeH|#A^St~woO8ii8=9sG#+Z1vTCKulGWnoGfH$Vadi@*2VIN9K5E!ydqOMzb z@6hXI%!SS!?LFlUL4Y6}NKTMapeze$E$Prxa)=+hm8HdGndGo624W^Ub<9wQaQKNA0==Co5P)WOf09anYv}WL5D=0ZkZxKXks>kb|AzcQ3*8b zJm#}DYg_IarTCD+c!@%Kh>Q}1za1mj>2AJRrXp1~OzVQm16u0#?n{ZyLEvF&AxZ9& zM-}dkl7uL&)6>yn2I;+p2o~SBWT+9iHo&(X$)ucIvOg|)K>7ubXD}Gt7!xlo4sF2K zpBne?6nOEt!qc(A+s`9>yvR|Ga?0-!BOxjas%(_Y)Q5jBN}X$9<2;PipVNII-9 z1D@Tz!sWHXaaV$VChYe6MwDgway%ZtqN*&UA0Y-Cs%6q?9hpgMp~xRamk3H<{P;_}1vcdH?_b07*qoM6N<$g3h8jDF6Tf literal 0 HcmV?d00001 diff --git a/e107_images/filemanager/updir.png b/e107_images/filemanager/updir.png new file mode 100644 index 0000000000000000000000000000000000000000..8bc891042fd4647d41fef1d873e84e8ef0cc9082 GIT binary patch literal 798 zcmWMjeQ4Bn82**6HePo$YgczT#Eafo&r)feC!P-V;vM#aR=sx99Yw8Y@2sb`H78S} zRokd+M9bEz)*7b>5gnv+b=Lz%?t1I@VqZPe>~4m z%W4+6T@zghA$PPo9CNtD*$G&_gKzhK%Q*B&Dzqeo(4U<}?;8pnU6_e3i4@-cH1Bg) z*;=Nz5}`bL+2XngAkYM)%4yru44KqLToXxMPHPHpstlMS7!2rXOO5HGM-vH6ifJ-y z$U(4mFjzsRO*LjJK|>-m0n-GJs$@-t29u*W0#9R-8n@MirSo9RVDo|!4+;dCB{+!! zjWJ{jKnHL%o`nQ}sLOHCSwkWL1WNStcHA;J0M*vw02Y7(AjQ=nC(;0#A^E}NEiDFM z`Z)qD0W8io(wymh!8R4vq$!bL49YS@Mh{ws0Jfp3D#0LH_NO%xB@oWwBugeVlHw?w z$4J@ZmpqhA#8f}c(;g9{6~e>eiEM(Gc#K8+9-1BDJsdkJ<|5xIaXvMD>DnXG&W?Knm2pvnl?3}+O3P$^mO6#aU(xIZLQxnzVm^ae`aNct9`m}^whO**U`bnqb#bi6!aRYU2mV4 zVh`5+5qEbT!CHEUu3u&L~f4k&?tpPW2d`7HGzH_d$1b|OKF_s?NnhNgm9sj*^?Jr;XqWeSr$9y*icJ|b_ud8T!7cE%OUx3~e54En| U)^Yxu4kuL;8 z=}4Rpd)Ldn**FS}WO=N>@60H4+i(AQ$zRnk2DyRlx3PiXvtbl$791y zfr`R1jNsV7CluP=xm8Tu2mEklxU zDPsDdeBCH#_~25mbuHtx^t~Z*ppBdR#mdwVGeX=aM zfU(-F*XzS*G%A{=5f&XllEW-`OQ26L`QjbZf6cz!;M1& literal 0 HcmV?d00001 diff --git a/e107_images/filemanager/zip.png b/e107_images/filemanager/zip.png new file mode 100644 index 0000000000000000000000000000000000000000..86d0be456373d3fa6a46f167d1cc5e4f200d84bb GIT binary patch literal 923 zcmV;M17!S(P)!3%__AvU~_fQj*?#>7|t3Ln)c z_0b2T1`JVxT8n9DG?Z>BwY0W{vfW-}X}ff{-JO|p{66jaut0?Y!ZZkWLv%&EWohrb zxz0=Jt|P~1=Zd9;shOJ*x%=(x8lz^^2y9(q81P*lgi?|)0G;qktTA(WUr*ma(}`1w zL|4C7mo^748ZG7J>5mrg-u@sp{&%7Hc6dx7JjddL`@!_o!u)49Hm+)uU!Dnj-}zA2Y#X(= zMOZBn?v;^&BwSvE#vHoP(5(i9n?<<$!7?aK+~VT!*LQ@WDXEoabapFfb{yfR5c`^e z9ne#dPC+CCDgrwtD2xI{sI1^CbP*a+a6G7N!rB!06)-GtGm!3piUF(lpt=IG4DkrW z64bOPO6p34h68RE_Nt%>sIEe}0BaM_bpf;jh)qZ)@heH@$G3PiF;DhT6yccYq2Yp? z0mp-=2hl9VTOrv2B7k(9hk3=lU$?25aaJGutSwbZ9BL-;K}ZpWXcpY(pd_F`N$_is zNRc0T!tBU@9DcJKr@I;NXq9+J4!fm^pe7NavcT}bDMKg$1u6tWcFHFIjFlL;{1Ow_ z=SUrCXZ)*4yfzQv3UoVykWvFIa6FI!Xdx&c3`tmZ*<7o#cz1(ZRZ;f^M~4RJeEk@8 zt%hH_iHJl@9bzCPL;)m731LX0EyHWWuTaQ8;mp-{$(`(^>zoUCY%Jtaq0){0R{dk! zsJj_2iHPOEj)M_`AAsqS9n8}6){De)ZGa83#>)L!Mt&IOmp|v{wUe!O^TPVxC$AoF zxp4OE>7F;vziqy7;xJ}I9fSp15oCqZqjmoJJpwLpp03aE^R+v{A7gV*r~iF6x-Iz;_z9>2FxVNx(ZJLo xX@O$^;51nbb!FV|vyQk1Tmc#Z00000{s*>TNbGC=KH~rY002ovPDHLkV1gmHt(*V= literal 0 HcmV?d00001 diff --git a/e107_images/generic/bar.png b/e107_images/generic/bar.png new file mode 100644 index 0000000000000000000000000000000000000000..aef87804d85189660ed8b2b216386f25fec635a2 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrA!3-pwc#c#6DVB6cUq=Rp^(V|(yIunMk|nMY zCBgY=CFO}lsSJ)O`AMk?p1FzXsX?iUDV2pMQ*D5XPI*|TRKJ$m%R zhYyDjAAa@f)va5%7A#mWVZwxkM=tk(RC>BNhE&{2N=QpcdXSQkkdTs)o{*f7n2`E_ bfy01-aVmqJ!K|WtK$Q%hu6{1-oD!M{prP+0?{7RRuf(3UL;A zL>4nJs0)BFnNnpAgso4F7X-a=v`|a_!o+vuDqq zI(6#w>CTMxojNr-I{L+n7x(YqpE702%a<=7K79D;(tu*a)}5J zi}jC8VGa@4{prP+0-ob*2L-pg*Xd5 zB8wRq)CEA8aY|;OBv6ng-O<;Pfnj4m_n$;oAipcXC&cwX!~dL|oG)L#T)TGd?Af!Y zPMtb^`t+GIXa4{H|NQy$+qZ9Dy?XV-hYzn_y?XTM(SrvM?%cU^CSQbl@(X5gcy=QV$XVv;;uunK ztMuY+p(X`^hD6S_XRh)Dg(zs8_WSm4{q#)ZMGxwK#=d!Xrs`hMiB;FvioW`pd~I6* z&mAFSj?0al3_CxsJ8rD{prP+0+$-?;KeJ6yhxK zh%9DcP!|AU#wnSBl0ZS0bVpxD28NCO+CSy)cya&!{g*FaK79D_)2C0LKYz~mab5~k!B`UH7tG-B>_!@pQ|#&D z7*cU->c!h!4GIFT7tg%&OPv+__J6(cg*BX0Gwk*Fj1ndtQHpcZ)=&CzAd~mhCNYZ@ zJ5w1ON^YkgSI(QuoV_z)-}ZdI^%pPSf4zS?M|Jo4#;sE>&Aq$oWm1N9$a(hDrOr2n nm!2u`+AI?~MY6L#YJ;%)KGD!U(YsFrt!MCb^>bP0l+XkK>JG8S literal 0 HcmV?d00001 diff --git a/e107_images/generic/bbcode/code.png b/e107_images/generic/bbcode/code.png new file mode 100644 index 0000000000000000000000000000000000000000..07313851f26c8f8e566e8a671794236b77e43bde GIT binary patch literal 637 zcmV-@0)qXCP)WdKxYbs#e_AWdO%ATls8H6SoIIx{yqGdCbDFfcGMbBJ(g00007bV*G` z2h{@~1}G4Pn%G$Y000SaNLh0L04ERt04ERulxa~J00004XF*Lt006O%3;baP0002z zP)t-s{{a7NY;5%O^w!qa&CSiq%F4^j%goHo|NsBz=jYqo+tt<8@bK{J>gwd=|=HA}k+1c6e@9)RQ$BT@Mudc1q(bVnj?da&}-{0SJ zbBY@uU}0cpS5}O9bH0|f*V*9eSeE9uu)tYaV8Xz?kcY(6;PtJ_jSV1uQAvFVh$I)&2d>FMF&;qvnG^Yin^`~DjM0004WQchC7mvOYgmAn0TMKka8v XiWVdHjuGEx00000NkvXXu0mjfBY{PC literal 0 HcmV?d00001 diff --git a/e107_images/generic/bbcode/emotes.png b/e107_images/generic/bbcode/emotes.png new file mode 100644 index 0000000000000000000000000000000000000000..03377bb17b643ecea5c21309ec3ebbaa028ee77f GIT binary patch literal 4100 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 literal 0 HcmV?d00001 diff --git a/e107_images/generic/bbcode/fontsize.png b/e107_images/generic/bbcode/fontsize.png new file mode 100644 index 0000000000000000000000000000000000000000..7b148febf41f8f56f36a6ba38050a74e5908c20f GIT binary patch literal 869 zcmV-r1DgDaP)2{JU_b-fw@00GfZOjJex0RL=kZ1nW>*4Ea|&CSZn%FD~k z%*@RH|NrOb=iA%c)z#JT@bKQ*(bv(;cb2~mRJhE{%{N}HE@Qa8zsua*+}POI@$vDh zt;8*Q&JcUwMT*Z#hs#QX!xCJ&0A0pXce&He%HH1I+1c6G(#(C2zDaSuudc_qwaGGA ztSVx(v$@LO-{02M&&tfr#>UFBw8Poe&)3t>%FWKCtirjt!ra%;u)4`RX|oMVu7s1o zv$)0+POt!0yfI<1ke$M`w!#)ls-UmN!Ntr8Q@IORypf={!_l|F(YD6WyVujsQFgQd zMy&u`#5!iPp1+YGpc@US2NI?cRI^Ck*wCA#!W&kzfRntWuEQ#6xdT?Zd6cHC$fGK% zBOtF1XR%(**T2})%|B+dSaPy_l*0gI$_iG3Ade#(n;9;w6(ph)xzMYTox~bZu?}O! z0dCW2jgzg+q%W=>L$n-NxJTC4$;!#iJ9NSWeB%sQyGyV_d&O`(vKm0NAf(Ea+}O~4 zkG(~P)l7_w51$Smq!UoPB2=$Q+Stv?$jx00001bW%=J06^y0W&i*H32;bR za{vG*5C8xt5CN2FQ5gUL04#JxSad^jWnpw_Z*Cw|X>DZyRA_Y|Gch1dVR9fcFfcVB zFgH3gH###nAT2O3Ffen7aA*Jk0MbcBK~yM_V`RVz7{Le){0E9LvSSGU{0|cDD~Is9 z7#W}S0oC@UgM~Y4L4qxZ?HCyuD;OC5@Vo&F^M3=1Rx^S@Jp)72lzVXDB1R}^W03!j z5YB`N_oE2M!-N@UAPI-SMHv?%gxwjDz!|u(EhEUQP~n?!VPi&+I9QN@@i9zT0m!|~ zpa&8?$AEB&7$aEaAJ*S&jEvWjTp|wE4>so!k}x;KT&S%OVHT(vK-H{_j6XRTUxS4~ vOhjP+VBq-npAqUT1Yl(R`}aT2NW%&M%63*4@iYN;00000NkvXXu0mjfNPMA= literal 0 HcmV?d00001 diff --git a/e107_images/generic/bbcode/image.png b/e107_images/generic/bbcode/image.png new file mode 100644 index 0000000000000000000000000000000000000000..bec8eb21dcf5c88661e3dc2fdbf3422795694e05 GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H3?x5i&EW)6Iwh_VCC){ui6xo&c?uz!xv2~x z8Knxwh6=ukMG8g+2Br!I=2pfaq@Zg61jQW%89;sPC7!;n>{prP*))0ox3?Yy3UL;A zL>4nJs0)BFEaktajW#=YoR6ufwn|mZJ($!{f8E8`Mv*?g~{PrzkW5(WKaJX5L$h8 z^`ujwrH^Ks`@Wi7DOIuRtugQ%n^*4} uZ5O{dwdIA7yi0M)+;hHr|6exy&E)k@Y;Pmuk_AA=GI+ZBxvX{prP*)&!5n#!&P3UL;A zL>4nJs0)BFMoPl)S(hW|M^IbXhfxpwW^*|TR) zojP^;^yxEa&iw!X|M~Ohw{PFRdiCmu4BWmu zO$t11iQ)+}rPHF%z4-TjbIUyUuAg&1%Du5)@Vc*Q*_!EUC;qJR=1hKgq}1X}tK`Se zUv7scEy-MIc_6rTX4}{Ho!6)Gim7%p-bi5CXpyzy#_OcQ6WzStaetE8SG`p^t0a`6 zZMUySWcl9PHTpI&cXvF$Gvnuznia3k%k|lxeZzY^Ojvqvo>(E!Q4F50elF{r5}E+0 C&A3{prP*)*-(trX4yg*Xd5 zB8wRq)CEA8aY|;OBv6ng-O<;Pfnj4m_n$;oAm1;*C&cwX!~dL|oG)L#T)TGd?Af!Y zPMtb^`t+GIXa4{H|NQy$+qZ9Dy?XV-hYzn_y?XZS*~5nqA3S()=gyrQH*S3V_z`Hv zy?gg=-n@DL{{2s%K7IcD`OB|~cYvadB|(0{3=Yq3qyag3o-U3d6}P5de96_IAmDb< zCwfg_w9nhW@g|oJac+M4&!&c_$#r74N@eckj_0D!WlkK(JH{x_e4fFh)kr;ij;VR} z!Q5T@KHZLbUH^K$zUR-M+ipxgeNbUZ7w=<{8Rc9018-I9X|4_^J?!!Ca^7tQr?(WdKxYbs#e_AWdO%ATls8H6SoIIx{yqGdCbDFfcGMbBJ(g00007bV*G` z2h{@~1}YWD#!gfK000SaNLh0L04ERt04ERulxa~J00004XF*Lt006O%3;baP0002q zP)t-s{{a7NY;5%O^w!qa&CSiq%F4^j%goHo|NsBz=jYqo+tt<8@bK{I>FMO;c$>-U z(%0V7(9YrE;p*=4^YioO=H^>lSjGSV00DGTPE!Ct=GbNc0093rwsxe@KJ|NNV4YPbQO0W->VybyTZYM^P>B35%HT zKIW(6dXE4LSq{$sVrEjuAL0&u2En2#NfZ3CI+lV^d|!rsZLx&NkUOw!Dyg%}?4ogb z;5kfmyYO_isNc#lzuI|jY&L1Jtx(xB%RfD<)T)Zt&I=EQX;&!1xFmeEe$19VGggv0 zu1T-rD9iD{ePs36MKH3YJM2SBW_&L1Y0*8ceGn>u2?9lrs~F>d4FIA zvIrrL#}vN7f+*c~Ji7+;5CC+`XJC3h>f&-roqpQC{Q`zmB%u4}){g)H002ovPDHLk FV1fj%QDp!C literal 0 HcmV?d00001 diff --git a/e107_images/generic/bbcode/list.png b/e107_images/generic/bbcode/list.png new file mode 100644 index 0000000000000000000000000000000000000000..832c6fdba0a7e47f229e76325b364902f0d6239b GIT binary patch literal 407 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H3?x5i&EW)6Iwh_VCC){ui6xo&c?uz!xv2~x z8Knxwh6=ukMG8g+2Br!I=2pfaq@Zg61jQW%89;sPC7!;n>{prP*|fCTmIwa_3UL;A zL>4nJs0)BF4iPl)S(hW|M^IbXhfxpwW^*|TR) zojP^;^yxEa&iw!X|M~Ohw{PFRdiCmu4<8sJ%ip|tvuV?&J9qBfxN+m-$BzuT)$iZG z_wn($ckkZKn>Ty59DMus?TZ&L?%%)v@ZrNxpFVy5{Q23lXDNzo8bG@kOM?7@862M7 zNCR?8JzX3_DsFAPXfD>EAmAD(z@stafX=S}v0VzMEG4w!E4zOlW%wZS<LEV`h8vTx0Sun5elF{r5}E){d$AY* literal 0 HcmV?d00001 diff --git a/e107_images/generic/bbcode/newpage.png b/e107_images/generic/bbcode/newpage.png new file mode 100644 index 0000000000000000000000000000000000000000..9dd1fc3e4e6fec021fe10d8efc239114793b084c GIT binary patch literal 1018 zcmV*4Ea|&CSZn%FD~k z%*@RH|NrOb=iA%c%E-uOSy@g!JyAYBQa(OYJv~!BJXAeAQ#(3MH#c{5bk)_>@bK{J z>gtJXY@-1Hv;Y9M006!K0LB0T&IAO~2@2T?3)&VJRU{pDIz>gp$!@%3z`u~HDok>hljERq{ zu)@*b>;3=#%euRQe0-sOeVRE*zS#TM^8cf>!c$mMz^8$ySQ~m8Gc#=)a8ruNTsD0i$thUQ1Z-@9%gaAeMQh#P9#N&*!?(<+jAx zr+rlS*=+yLE9{#9aWM#0Q&i>U<0gzD#K{Pk6l$3ZFF`c;UtIFe=t;MCn*Qv?iuhr|9sl}IYPv+Hd|NdJ4+yty^ z0zD-muCA_-=qQcsnzS^CRrm$vvu48$%Z-=yAg0wp)-?LZ$_GSOy7pHSW zL?$bDGBR*RfRDlOmcH7kgq-A0Tl+^#`%F*$QBwY5WA{*6%~eI?uvPT(uk5gSbuATm z4-;WworSK@vS@qlM^N`mQSw$?^=51Le1H6*qyN#()Q+BYEi1c#V9I4Ddtza21r}&s zkIHg{{9I=IZg=>Ejr^RW|FE|I!N&jI;>M1bgj!+j>+7|KhM8z)eSV899(!3Yif2Z}MWV+jBJ&jKW`p=!5~ zJ<9+R{>lgkUJMK$K7C{W3x7liuK?nrPY~e`j3}VK7^^VIWuyy#LJ@3qz$$Fd02SVE zh7df@!w3^*_<|5td&YoG7#eP1VYuN8FmbT(13`2bLfnlMD$k`D!EwOIj;i!6gYfJB oVB;8(BZ!gl@8AD8A`J%s0K&;78!n}hCIA2c07*qoM6N<$f={giDgXcg literal 0 HcmV?d00001 diff --git a/e107_images/generic/bbcode/prefile.png b/e107_images/generic/bbcode/prefile.png new file mode 100644 index 0000000000000000000000000000000000000000..8576f44b52c176076fec5ee3abe4e08b9ebf0ab4 GIT binary patch literal 790 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H3?x5i&EW)6Ea{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+AuIMx&-)yxW0e?{`2S0Z{NPXcJ11W z7cZVYdv@o}o#)S=KX~xq?Af#b{{6jo@80d(x2I2$SN^{r_Vnq~ zfB*j6J-_A2lP5sY#^&qQ)vf=phu^)pV{=R+3t7>=tf71T$S>22MnfLGC|M20%zkmN8J$iKY z>eZV!Z=O1J>f^_cIXOB1|NjRDHIVfBcv2I{$|(u*3kGuO1sJ9UM}`3HecBKQEiA~1F1`cWg7RtiRDGjZX2Ng6srz&%@2t_I$`WNXiVP1+%M*4$yi?R-#V-xiA z_wn)f_rG-Q@>cQ5eVyNYTe+G;cUSKGwCY7htB2Zw7RRp3xmQdcJ-zCxyjM6Ng#9!} zgd}Sw7ngE~vB8q%vtJ$WvOdxp^<%-Ruy33DCIt0xJ#b&aCaEX*?%@-iB~M;-uDW$0 z$WKwTv)h~HY7R$2LXu-3FWbwPJ|2f!LYf)0%|k2#ujxoKTHN@daOjQA8BLA@XXY@8 rZA*RTwm(WnOIt4g&_=4@)M$J0%zl^ecm>tDnm{r-UW|liAmv literal 0 HcmV?d00001 diff --git a/e107_images/generic/bbcode/preimage.png b/e107_images/generic/bbcode/preimage.png new file mode 100644 index 0000000000000000000000000000000000000000..9c191c3d182fefd413561a376a9e44bc52f5a3a9 GIT binary patch literal 790 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H3?x5i&EW)6Ea{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+AuIMx(E1#xW0e?{@S%`Z{NN(Xy^L$ z>C=lBFYesAv-skdvuDpffByX0vuB$xU7xxC=#ne{9z1w(GiT1U zt@c@b`QPG;f2^tmrXD>zai8$J4>un^e0cBPy^JL)?K|g&`|8fU@NMq-ipA&uEx7R2 zxsRb?Q}u$CGV?ES=1t+9y3lRyp>^x8{x6#3_WR@Gg_o7)p8q_rC#+_D+RAIqy@v$< z|Nl4d9M`1%{I*Ser%#`rbMEW5Ywvmw>X}Ut&GFR;UTryXS-43%!~OgBKYaM`=+UFA zSFhf@dGpk%Q=dP7{`m1@PEOAM|NnuZ4I~xUY}5s^a!Z2zf`MGR0S4V|SG<81-|=*D z45_%4bmAbFMA0TALkF<{3uA8Pl&03p6B)U^g~VNEs7iAf-I(jE`=w%z%ni$%3Wp>; zJtZY2m5R!uF3Pn9PQ11{prP*|b>?XXO_Hg*Xd5 zB8wRq)CEA8aY|;OBv6ng-O<;Pfnj4m_n$;oAU`C)C&cwX!~dL|oG)L#T)TGd?Af!Y zPMtb^`t+GIXa4{H|NQy$+qZ9Dy?XV-hYv4aymb*uC>%O-Y7R@wY^Hm}{_gqArLh97Z cKQ7zJ&Tzopr01v3J-2eap literal 0 HcmV?d00001 diff --git a/e107_images/generic/bbcode/shortcode.png b/e107_images/generic/bbcode/shortcode.png new file mode 100644 index 0000000000000000000000000000000000000000..459c658a31b6cb70287b02248bf52c19c73a8119 GIT binary patch literal 440 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H3?x5i&EW)6Ea{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5i<91o(uw-nw<`L$B>F!Ne_;5F)(#B&Yv&I{NXb*ivY8|u{>MCGjs@)N>> z!^oi^6UM|Mz{d_E-ZQWWocXNtM&JN9$k+`A)&?sg4m31(&TeJY0BTW4EMxNvC7JnMi!B0k5XKiLChBAOF-W-R*NvRNHCN~@; literal 0 HcmV?d00001 diff --git a/e107_images/generic/bbcode/template.png b/e107_images/generic/bbcode/template.png new file mode 100644 index 0000000000000000000000000000000000000000..ad34dfcb699da61a794189044f5736ffe817caeb GIT binary patch literal 379 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H3?x5i&EW)6Iwh_VCC){ui6xo&c?uz!xv2~x z8Knxwh6=ukMG8g+2Br!I=2pfaq@Zg61jQW%89;sPC7!;n>{nUDgn1 z*Uz3kyLa#2&6_vhzkmPs?b{bGUfjQb|I?>WpFe+&n#~amw1u%G$S;_|;n|HeASd3_ z#WAGf*4>M-LJkTd4vCufFPFKf-288LRwPR;_dw;JIRDV8PLXlHb)Nk6DdsClSbnMD z)B!GqRU4D4Z@Aoh`!Rgpbn|uBXE*jMdHOZJY>4DZezx=263;B_rc;;gb~DUr7ri5} SAtVfF6@#a%pUXO@geCxmh^a#W literal 0 HcmV?d00001 diff --git a/e107_images/generic/bbcode/underline.png b/e107_images/generic/bbcode/underline.png new file mode 100644 index 0000000000000000000000000000000000000000..5b5770faf02723239fec5284f27b54b52392dfcb GIT binary patch literal 413 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H3?x5i&EW)6Iwh_VCC){ui6xo&c?uz!xv2~x z8Knxwh6=ukMG8g+2Br!I=2pfaq@Zg61jQW%89;sPC7!;n>{prP*|cRZuzgnt3UL;A zL>4nJs0)BFw!Pl)S(hW|M^IbXhfxpwW^*|TR) zojP^;^yxEa&iw!X|M~Ohw{PFxv}x1Tt5-jK`0(Pz3m+e!`}gnPxpU{njT;|7eti4( z?VC4m9zJ~d?Afz>_wL=idGr1I_dtU`efsqI^XJ5WcjSQ_#*!evUgJ^vt7Y@F zwSE8arR_+2r~gBzLBQyvP10xFygEasy%>~Z@ literal 0 HcmV?d00001 diff --git a/e107_images/generic/code_bg.gif b/e107_images/generic/code_bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..59323bc68050ee6a4f4748b3a7c3621146be0148 GIT binary patch literal 2093 zcmeH`3s+Nz0f6tl%iD+{xt9jZAb_O2WaJeBT3=t^(9qD>*x1z6bnV(TlgVT@ zo12@PuV263($aF{#*Nn2*0#2`_V)IUj*iaG&aSSmn>TNEcXwMX7OT~I`}S>{&1SdT z@7%d__wL=^-rl~xzW)CHd-v|$zkh#VU|@K7*x_(EozBtG(Xp|y=g*&ykB?7GOiWHr zPEAcsPfyRx%*@Wtx?HZgxw-lI`Ij$WE-Wm(di82?aq;!**KgjuSz20p`}Xa-ckh;$ zm*2mC|KY=jm6a9X|NJHk_%31o=e+`i{%Zg0698caDA}r0IrH>El2C?@I>y5XiE&3w z5SK?K3v0t$1n&L%H4;Na-MsTOs=~Pkr;SsLoIH=P^sXKusUUc5gIA^K8)6|PvN0Y^ zA0xq()z>&6IL1Rl{Hqf-eI0;7m`P2X-qIuc2g=!}l7q6sUp%bkSM6-f`l${VC@ecL zt_78+JUrG%C>&1q>D817IU%J7#1qzhmLRaQLHrue^->cnwddKY?=tqEAB)nyjq&Fd1pkPS)IqU%dZS+hxyA46%&8~h z^pSJ<*_pE=*0Z#Y2Lt+l(4|$OD{cAD@(}!vv(d%*g`}KX*azks3&#-XKR^6?V{lp5 zv4t<#=3UvdC7(EszY3684sMrUR*G&NMlo>5S-`FqYBSVSKG_P&lhRxqBtF!vf_H@b z+DY5P>GqS|5?^0+l2lWf>y9Foc5KuJM*_lcu;grwZ*b)_iQ-W#!W&B8k87LgucviG zU#d-sk*U`FcJFp89K$si!Z@y=Kkc7n`?X33I_m4t7i?4$UC5 zPuG2F9gnt1c+5cI5FAQp+o=+V#iomY%u@3?6@UTe87OIpID<8Y@G~slv4K%x4-t2M z%A7qhtt$-q{olOid!rl-4$OU#dpjc`ehAD?VCa<8&V34wP`s>Zq(ulS_ajuV!%lZ< zMBnb!L*~o{WZS3zS{VK_?_0r79o_+I3Qx|m5}`8;2!HH^3&d{BSV3cO-UWl8n@5g| zja{1}>meN3qg8^R?L{Ht+Flu2=?}$|4Y|fTo_%jGC zTxXje+E&4VMFO@eP9RW1vE)M8FpZxh_(0=rwP^MDYP=mx6FY5KlkY#5ifW=4xz-cj zr$?42GH)>rD3NQ;OKdjkh$+fwVp#7M)t#Hn&_hu}hgHisKQ%>T3&QsG(?T`uReQBe zuc@c_TaVz>C!E0e3^rBzUGzzYFDBmKow#z&5*~QQ5+&RVk>z3-!VP&&CQRVqgHOVU&n-L2C}6 z!3n)eeJu-?e}%<(|MD204}?Hg6a!X-(TRzdW{E)i)i|zHg zX literal 0 HcmV?d00001 diff --git a/e107_images/generic/code_bg.jpg b/e107_images/generic/code_bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a55af1c63ca2d4375c41aab3767a0990a8e30697 GIT binary patch literal 1550 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 buK)u8W~VCbXcppN00000NkvXXu0mjfFM1H- literal 0 HcmV?d00001 diff --git a/e107_images/generic/dark/answer.png b/e107_images/generic/dark/answer.png new file mode 100644 index 0000000000000000000000000000000000000000..3d4868190c07c0c69f87f9ee7203053f2e13386d GIT binary patch literal 924 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLlt#%Bv?%TaZ^;A0CtD9~ixT*S_fZ%)qet zxTMU|%7#VD)FJHU0YTcIfjJ&+O;sZxchDRmuJ#Z{GDJMCrG%h9g z^w|rMahb7++39(e-@pH8@0;P}6PlcsACs7!m|nPG@yf%;PN!xTy1E6PK67EhlsPf+ z>FMb?JN6tra{NqNTZeZ*WI%9ieo5_%m#?ZDI`2Ptlv7w$*WA5m`T9l6RPD&!4}%eDyjYG|n#| zYUh9@H%PdICDq6pJXMA$*{)5Mo)AK9p+C98N^2-_)FI#i! z>_z{O*vh*0knn_#zUlw}|DQQ?W`5$yPrwMCP!i-93=|nmfPp#nc{|W;*F0SuLn>}1 zy>MsdQCM^??(71`&C{6G6cnaNiDJa hWqKE#!XS{quwhfwV>6esbwD37c)I$ztaD0e0sz)l^@#ug literal 0 HcmV?d00001 diff --git a/e107_images/generic/dark/arrow.png b/e107_images/generic/dark/arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..082f440ab2ee8a75a6e689f472445ab20f71d024 GIT binary patch literal 584 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstUx|{iKnkC z`&DLnPDX=|?-bk_7#M>Cd_r7-Qj9*k+0x!J$J}I431<_89c*$jM2 zjKSyGbH8wu{}-$IBUJL4G5i99Y7~Rp7Qw71a!r5PivJ5$|Cg@+$&vMm!C?*qJ3j-j z0;APTrJOs~y+6dN|MOP;S84wvTKbJC{1SsK$XW(wP6nlTvB;wy-LF-e{&AK4SMUC( z-137h`3-~l1O_&K25wm{hdCn2_gHg(G8Ft5Z~ULI=CAX_?@Ylb8Tix~tmbmZ-{vp< zCDZV~cJKd1XMS0=yl3#)!yp~Q<*`Gz=BfFVe<>UOufO@Xe*IfPprzVX3@jWByebUp z%_{Ln;+B2N+3|ng<^St1eea5)l*Bp7I;gdJO8HV0gMdk@qB_Z SmwZ9-&EVR+p#`|jWI@2X&6^}y#4V!&+qyD{&@a)ew8VvwZVJ@Pej3n1f5yX zkTC>u0;}iCErN)4Xp%KVEyrXdTg8HxQRB zDkZW(irSFm@blUeB$g8+5~;Usto?T41@?MiyN2lFkR&=u zGJ#l`Y{9Ormj)fLaNq$lnvq(ERW(o@0+-N4G9_{H;AQ0*t{*Ng#`_Rx4UumIT||9*nyUp zxcLh8Phi?NK(cjQSboK|f%cEM*MVsK=fGEIcAfE;y(9e2u5m8*pN-6Y#jsBwli()bM_c?nl$x9aqIMP2N^2%4P=$L zUhBf`T(tf0YQAdQ+|F6?c15I}@wpPKItqHr_%d_2dVNi-rZlU86a9APk|HUKme)j( zy@RJMQrlvZ(fjK$w9;&$3r+`lqtYM0w>TTe?{6}v|4HvuX%%v>>-=qxkWPkplkWPO HEhYZ}w@x|{ literal 0 HcmV?d00001 diff --git a/e107_images/generic/dark/edit.png b/e107_images/generic/dark/edit.png new file mode 100644 index 0000000000000000000000000000000000000000..3e19bfa044201b30aab45797e1e3f08e5a9c37c8 GIT binary patch literal 1067 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 literal 0 HcmV?d00001 diff --git a/e107_images/generic/dark/image.png b/e107_images/generic/dark/image.png new file mode 100644 index 0000000000000000000000000000000000000000..682c56bcbbae169cd12cc501644259e1e2a7e562 GIT binary patch literal 746 zcmVq0uw|00Hb!OjJbx000dH1rrGf0ssOM2MMQxM#!2! zb4Mf%1P25G0RaF2VMROo>yH25X!^xgn`tf<2n9Ycw|W(wpYLSiL+bn?^%}nlk0URR76U|H@74k23CkF8{t! z(VsmM2?q-R0B=l4wO&ZZLrF4-AqAoUjgu$iwQHuPjDo7LysK>g(ow>WJPQQ{C;$Mw zCoqLrO{l?GthqYmxIvMeuO5E?E};K;kD&j?Lw8Rr1pol3A0JmBAP)rvg-b%zp=k8N zT;#xEq@|UEo3OT)Y?EOx4h0Bk4i0%792p1;QZ*`mS1h1!A&yokLL?Xm0tFHS15*wT z2Lb}&sB*Xf0004WQchCtG>l07t?nfhvM{<~|Ig&Wt;7?8!8Ic9Sx@ z4nWwugoCQi5w<2)0mCK*gtZkcY7g#z!=v)kZyb7lpqRb%7 literal 0 HcmV?d00001 diff --git a/e107_images/generic/dark/new.png b/e107_images/generic/dark/new.png new file mode 100644 index 0000000000000000000000000000000000000000..3323cb9b811a4a591589ea6beeecc7aa20c43183 GIT binary patch literal 663 zcmV;I0%-k-P)qURi9&OK`!Ri11 z`hbGP0Rmf4Z?o^}>UopMWQoUcm(X*Z)oq&CL4(&Zf7~#H;)=ZS|NsAig2n*>PEKvI z-QVUWUA6^Ev=&{#9cRfUa??13-b0Y(N0{zDne~*-|NZ^`K0Tx1;ps4G!4Fx$A8N}d zbk#3_-awD%OPcRaqW4Fo{-oFc`1krXHJwp!v;6t=q`l#jwd0<_>Y&B$mA&j)qVGhX z`Aet%sM!Di|Nd}ry#N41HCwE=!`#2d-M_`&y1?Af&*K02_Ghs9PpSXP=l}is`D$yq z002(_0099PN(CBV1R7lg7+VAkTscIa?C|!b)c@u8|K8l}Lq((j073u&0ssOMGewv9 z`uzX>{hp-M6B>X3044wf7&%U#zR2WMVYC1PPXGZA00a*UD1H(pg8%~~_>Xz&00001 zbW%=J06^y0W&i*H32;bRa{vGy!2kdr!2!c*R8s%|0ANW(K~yM_V_-l7j9{{xk&&?o zS)i2>1j;~6Ca}OyFld3OC}cze%|L-URoApCc5r?Y|iUlD!*^M5m71pwC_7BX5z+cy9J002ovPDHLkV1klBB-;Q0 literal 0 HcmV?d00001 diff --git a/e107_images/generic/dark/new_comments.png b/e107_images/generic/dark/new_comments.png new file mode 100644 index 0000000000000000000000000000000000000000..bca1eb734aba8db78f922666cf280902b033ec21 GIT binary patch literal 357 zcmeAS@N?(olHy`uVBq!ia0vp^93afW%)r3da;;7u$YDu$^mSxl*x1kgCy^D%XD{*e zb!ET8!oe=a*RAm7F;HlJfKQ0)e}@0lYYUr#oEm%`XH=JUCfe@tVR-1xaMg-ou_8l* zm*e8eRj2b9{#G&k%VhWw#_-gUVUZHUqK=jcl`daqGW}m+^MAhc|6-o+Q4FW78JdHf zrZjnc+^qWla_9fcv;NPs`IFCZ!Iz;U+I{u1&NEBI{$I`if3fEO3jN=W4D0+ESInL? zr6=U@JmGhnrQXb8*qY1ITO7V>`Q%ysNwd3?RxO^UR`lQ$(5Z|iL4Lsu4$p3+0Xdun z9+AZi41NkA%qUhn^Bz#p#?!?yL_(7FprViig9z(^{rLedDihTn{xdf?oGWs0U6GX3 y@7ydM&yeXWl&70^8g`mhUS*RrcHj?SjsN?{hfQt?&pRogISihzelF{r5}E+lv>RNJg*1Dr#KCPXz@cOhX z|1TFax+~iKKFaw2oc90w692y@E-QA~R}+3waH)@Jc~B_5GQY@)e(M-1&SeReecYbMu;~)$KR> z4*&oEH^Q*!#m0k|x1YKH+0{4q&X?C)GJ&j}>pP6&v$B2S2^=rJG#p zIM;u;p%lrsm8F)uk4aTE)Ny&z>IV#&Y>9_M+_?EzSI`<(N{M%R@Z=GCZj+C!~a(2_Xpm3d;t2L N!PC{xWt~$(695VH<&gjY literal 0 HcmV?d00001 diff --git a/e107_images/generic/dark/nonew_comments.png b/e107_images/generic/dark/nonew_comments.png new file mode 100644 index 0000000000000000000000000000000000000000..7d8823cebdb3773fe998edb21674a175459f80c3 GIT binary patch literal 341 zcmeAS@N?(olHy`uVBq!ia0vp^93afW%)r3da;;7u$YDu$^mSxl*x1kgCy^D%XD{*e zb!ET8!oeeZ`TwrrU`efr$Fb2~aZX3m_sdGqE)ix!oamoHtq zw7a|eOjW)x&^?SLL4Lsu4$p3+0Xdun9+AZi41NkA%qUhn^Bz#p-P6S}L_(7FAS+V? zP-5d@myNr3U-4^s_@Ah8{Fwectf3ahI iQ-G@xTT3F>561PpEGB!irs@EVWbkzLb6Mw<&;$S{XNbuF literal 0 HcmV?d00001 diff --git a/e107_images/generic/dark/password.png b/e107_images/generic/dark/password.png new file mode 100644 index 0000000000000000000000000000000000000000..1dfa8241ede7ab89e0402db0bbbe586c53cca0b7 GIT binary patch literal 2132 zcmV-a2&?yrP)_00Q(-OjJbx000*P0Y?A;RRRH~MgfaD8aDs{ z{?!2J#XE5x7ytkj001)p14{kK0O`L7-Lpzt4-^0mY5)Rv0Sb}>7OEF8ul%_H-?s(- z<|f9QMrH^BB1XM6YSm4Q>sqn>ZMObDitmRf0RHFz;>s2Oqm0frCR8P?M?Fp;j767DXM$?;7;kj$vwPw|=TF|9W!<0C&c_AoN z@FN2xx_vb1#Cq+>g5{+TofY{1@MUg z|Nk=o+(^Zod-~Uwh(-zBmjM6%OaK36|Nevj{hR;XTHUmGv~C_nBM8@X0RH|L|NW%@ zc{{8w#%h>?$N8dYYE!3h2zMl|MJ-V?$g0q0Ir5?Vjdg+_vd>(2LIX? z|M^;bKtPgQPql3%HXH~4%Phf%R*_9R@5olZlzh&bSbr=e_R2HXtaqMeHR{;E<*EvP zK0Ap}CCR0P|M1E1&X%`_RD47m#DoT1FcOJaHPEz{-oThsEfhc^5M($VX+0r2AP}}x z0K0Vrd@&~p(SET20004WQchCe~q4H^Xb;D`4xSL1N^)VfJ5=& zpYB-oU}JF0A7dQ8&rCVfA{wXNpgMUq5Iv5cf+uzyH)p=i;Lo4``SAAWtpp(FA|@u< ztZe}B?a7^~sr$4bjC8)7sXcS>AW3kI=&5bv<9$^cn>`1Rawg?a^xct}wEVjA z%~sEZ%~W`L`B}hmUVY!k43~eohk<=tW-b@fYa|SlKqwj!Rv@@jHuo(3)D4Gs4;{=f z0g5pl2?;~A+eJ+uzS2ww*n4PM{w07lgj-`P9V8&?&VtH94{&eXeQi6Vl~JG?C=rGV zh>#!eDIB5Hm)u~E&Nn8Ch@uE16;RspR8L{sv-Hnffq*E&;A2d9C13i=dSd$HL!^2{ zI%7m65D5jXfg;w|_wHT>nALv&jZ7dSQY+SqH2_6C-?0_DY{}Z!$pZMVeFhK&!K3GE z)Tn`KH{ZW4+gDajy!OH>x4Y^3hsf0;}3{fu{fTHw52F7w)!m*0_7!_Zj{*D zPF8B3-&XY<$Cm;B^ZomVt^yd}oh|rTfGWA%CQp8geP7?z0|$Jk+GwA9?!=Qr{g%WT z+4aF{GFvC)e);gGu|#loV`D_5e4~8v$k9@B#llWEmD>y8E-87(l6eyA=49iyyKZQS zOC|SfEpw)NF)<&RRio>2fgX*tXUXyc-DWJ@d!E6V(#Gm78!igo`VA`>NoLG+=3Y0~ zr{He?rCww@DHk?m}5rEW#!F0J|w$hLdyvns|7gMjKT-bWrBbdSw>-M+19oEad}W zXwn4mj6te4@bH?{Z4>V*VBu7@TO|c(Hk&ldni+tAOHEcGz-rr9rTFsp8JkZg!%h&U zyc8Jnu`y9HZUNPym0rkH=yz`*fHC=fc)lCf!OMGj0udw>z{{5h>sU4PfRkGq155d~ z4&XsTL_`6~gLMY0Htqp(vmpy~=m-|61B0D9gVX_76kGL!b`MCZhi_1kpjB#P0a+BN zgB6Pq=jVeKS3V#RM~V#wMdV^G?WAStsOw(GIGrH2fkz*JIFdDKk+vZxDG_?7V+__< zZz+#uLL65lS~^d1NcW``i>2L5qZc|Na=o8`YXL-v|1JN2SpNVv{Zn3IXj#z!0000< KMNUMnLSTaAhVr8T literal 0 HcmV?d00001 diff --git a/e107_images/generic/dark/printer.png b/e107_images/generic/dark/printer.png new file mode 100644 index 0000000000000000000000000000000000000000..becb0f4c8f40030329ba61f6a96b0a23a948ac1f GIT binary patch literal 794 zcmV+#1LgdQP)-{Pp$u^Yi!b@Ad5L^XTaD?d|r| z)Y=UV4jLL7u&}es%g@`};`jIa^z``g@%8EH@8jd_>+ABz$IjK&*r1@J1OxLf;r>Cc>nwp$rV`J0P)#&KzC@3j@etyi%%(Jw# zYiekEa%z2cZhUuee0OnucW{1pZh3KNad2_4W1a>guGr&%xgJ!`<}1-1WEE^sm(Os?znHwaM-3=+x%l+uz<8 z7#Ii$2u)2*oSdA#zP*EliQ??|)#CEd-R{iS>Bi6E&eP+ns<6DgyOx!eK|nzQ0s;dA z0}BfaZ*Oz-_x$bi_~-5Q-{bA>@%K?tQwIkJUteVR`~C6t`|9%e;_LME`Try&CS+u3 z{{R2+_WSAa`1t?-Dk>~zXKnlb|Md9%D=IByWNf6QsH3E(qob!rMoP@Y7TEv*00DGT zPE!Ct=GbNc000SaNLh0L01FcU01FcV0GgZ_0001eNklQ7zOkh#omf!U=!j35vX5tzuxSla>?VEk6Vz}U!$2HbS# zrl1IrkYuJ`I>I|Q(ldE#k23bSKg?e_h|8+w;ijWOUGXP@#}Bh{D@>`%>*O&hQM?_2#uz3zv0{g*S>-j~mPEM&AoCGm`!|0bV?`|B?KH%r~m;J8WN zbNBTpKO5R-*al3_pK~u_&QAvC!%2M)K7aemCNqQ0eRuh^^E`@E6l2aC)xPCbnKOIi zqyPW^&zw1PwiXW?F#2be1o;I6MFuBeIK81Y8R*K}o-U3d6}OURbh1e}ux#&1PMy4> zPSU60@P6yFcdx9vd7+V4N8xT%;L$T@PQ6OJtH&YqBISIhpvOGJ#RlPLRxFg!NO+wl zWa+%ufA@Zc^GCboH5BeCr=Op)V$oEC!)acVR0AAVsdcYZHuDRrbo=A-Sz8cVj5?eY+tn+^UgstoUx;H literal 0 HcmV?d00001 diff --git a/e107_images/generic/dark/search_advanced.png b/e107_images/generic/dark/search_advanced.png new file mode 100644 index 0000000000000000000000000000000000000000..00a3a7b276361ad9f451b7f44c289ad334230c72 GIT binary patch literal 1077 zcmdT?{ZrBh9RAwcW;QoEjNM$f+t%&2T{*k$hxU@2n4W0GIfM;23sHGVTBcyWp_5X- z2MB^lyrf0o5=jLl#JUbML3{(mBo#}mQ_Pxnw@r7qJMT00XY9Fqp68z5p6BinW)ah4 zW8z~F1c}Wcq>>_z`H#`BMD&w{x3VL)lZ8KlM-cPq;a5d#k^BxXjmpa|X7bAEr3?gL zSe(yzKjRlVi$P-03oA>;7)KCf2PW${IZfjQwNg2;3Ks=+QmORbGRS4k6JccqdQ-|Sxi4Vkc6xm)W6w6Pv-MC0UfjSUUPAecwC zaIJBD^RVeS+SYmX%%Yw%(fz>ZU+wTEOe^Hy;8=e8w9HmW#@tc9z(t zws+OrlpGS{LA% ziN~%f#x!Gk+&005I`g#osvmkDfPTh6qn+vvf+GNJe&~4Au_f3eX=xTK#A=%r9Yi%g zu+D>H?)H(cuRD)@ccZtDEi94`TpM5by`zA3g+W)yWg?MiV0u}FqGD~Q5JgK$&IyG= zo{s!Q}0B&Ah0(UF8Xb>XKUSfzi3=8kOqhK>BGmdua>We4x>2Fr$*=kpo$HBw{xF zzkn=+_hv@AzsyL*lPf~`)WO;$@t1GEYo4i!&Z7=GJLVXn6z)dOA%W?XrhcBgsr;Cd zvU4&N_LP6sm$*AX9o~VBhSfP*NGR_>!F=ijRPd4lKH*?)`Oi{b3&{+Yx)sHW=T_eJj^w37-F zIGP7WJ+>$ccc|S#ws<}p^ApU~Wgigom{oSca(!1!lU={Kk(L~_?*3l;#G1o@F}oV= z%_;O-7PA~(-+uGqLB{q!l$x{hZC7FQVq}j_xPDhRH)l6=!|%%%W?N=}1Nz KF|{`(@4~-^Rgo&En3+)&8Hf-?`2d9=B#RbGt<=@#T#0WswTC&=Y!01zeQjoL*O|EG zWBC9#W!`)tVLGbm)|__TS~|;ClFpgSFkL?kzt(@zfpZS$m&5mQ1lMCP@ALBWLJ(vh z`AQ_!<-Y&u>E_Z?A^T}AbI&BjkPxI#bJn9~)s>ItN8QY)IK!J8%Mrc>He;*D!Cr2oR@ay8$9SKA@%SsYq`w;$H*V?`>xNu?#wipS!5 z44-s}F;N>kSDcrZz@Q6-LfLz0r(c4Fs|-5r*E>qP0$-9OJ*QsK*?=&9Y*i@RWgwvIte{(lX8F__+k0U2wG>yQXxWA)#Bk)=dj z;u+b=&;c1qdLUTU=c_x}r864|dD8B~zQ)ZEd%+WC+Ub}d-cbSXh?j>0RLJd{OwZ|f RPN(Z7gd7zcsl1em{sklEGf4md literal 0 HcmV?d00001 diff --git a/e107_images/generic/dark/search_enhanced.png b/e107_images/generic/dark/search_enhanced.png new file mode 100644 index 0000000000000000000000000000000000000000..1ab4e5f4ab46072c1d4a15ce96a3aa2531f69d62 GIT binary patch literal 1206 zcmdr~`%lvc9Q>*viZyOw#;`fu5)%nx!jf(3GL1OcU_wh;aIl6#v6WFqAGTN?eL+iU z3-YD3KszWDs1w@q7y>dDYByd5%A*AVDFQxLkb*L{$$lXDtot{1$=&6W`|VC1hyCiP z|GWMOf*g&GiokpQt^auFfLDXh9V2+nCp|ni96{P`=Y16~y*ZE*naCk9ZgRNfTT~>R z!bqcj5S>L%r{bw(N-k@Z`Z!v`hs<=A?jt%(omoM)0sX5Zy41v%w zJ0D~SDyu3}RVY=;^81V6aD%j{=!Z#I-G#EUvU~llKamIn&!M^B+%#bLp2_N81r$Za zg+iW8sF{G`J0%SZ28|uM9DBs{B%w^GP{{un!|A4gR!XCzEM`_#=VN&KH%zR95Eb%D zd2_F!KqR#N4x75rV!c%BtmBCI;x1+#3zX4pA+yJ^?rQ$Wzlgf>xoGCVic; zt)*j_tK{gXp>qkkT`;)@>Jbe~lG8sl$V2O3PRD`$qOu$vcLQ6*ml!He8BTG< z0;-F`)wZ(G>`Ilg*9knmy>k)DOv}Ym$?d*u{d|*s9eNyl3YnZ%OoQ=@a=9#{J+m?8 zy7X5ML%^HcgwoPd+rkEe&*L*0sX0uIT5Vf;$zW$~)BN~(JXK9sbINtJTS;+I#y7z7 z6sER-)BV`ulo%IX`S3k3C3 zpw()JBn$Q4FOG8XSOWY{fJ98M=n!NdCORTKK4&rQ0_&NC`5|E^tso#gZ}X!-4CV~B zc}Ie+nR!emSWfrlC;|uMW0jfg^qsTEF9cts&_BL395+SmyLUQ-nj1k%eEY;%;yH1Q zc`bA+%2H(iWI14Sa4jk9h0mc7`lU8YBt5$-rRNbg_u!9GxoaRWQ2S@V{`uE_-;Sn! zx02ZvZ^Xqs5GL#$F29mgTOI!Xk&^Cd<#BgvK|n|`k=yGznT^S~weJWs^B;{}*X8;K zU&0m#M_qZC?;;V$d#FyoW3jp?zVD=RJ<;vXB_B0A3x_w62E&rcCrq-?sNKWDH3eUe zQO$gM-}k)O7aO`AcG+qzA9M8HJQ$&;T4p{IAqNm&96RZWt48h}8;Op@Mzmc`E&Las C`{Qr` literal 0 HcmV?d00001 diff --git a/e107_images/generic/dark/sticky.png b/e107_images/generic/dark/sticky.png new file mode 100644 index 0000000000000000000000000000000000000000..215b882ca86e14f14c0a4285a3712ca525c0466e GIT binary patch literal 1473 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 literal 0 HcmV?d00001 diff --git a/e107_images/generic/lite/arrow.png b/e107_images/generic/lite/arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..26cae0e5af7d15162ba71104bab2868ec8b90578 GIT binary patch literal 587 zcmV-R0<`^!P)~UXGsLU_00CA|OjJex|Nk#~=>}%)8guZY$NC6g-U)B^ z6nOavY4BQ__1o$F30v0(ZS)9t{}z1w5_Iz;dGevg`ygi25o+Wfg8c?_{}Oxu8-Mu- zYVuv3`S14r*W~v>df6gu+&hi<7JL5()|AZ|Md6$h^pr)Y}iPP z>m-8y3U>b|i~b{o_zr9IYN7h@_W#@F_(^};6l2~6ZTSFj{}+M(V66Q^k@qoz_|4n% zHgMAmU)v9L`W%4&eZBvp%=$Wn?>L0?^7Z?9l+_kg#4UW~HY^w{eQ3RA!p)u zqVe|n{>IblHeIQ*Z%*$+4NR?$u3&HvBc^WI-Q!k;jF~sB1)@jgURXc_&i~- zB~7O>QK+!H-?(D+r9>D>_X;f1H003)A zL_t(2kz-^)1B?s|d5nyV{m23tj36)>A&>|bV4MjTh+u?*1yBJ$m;mEShya5#T!e8m zSb%}S3MQ}*Dqsi`I1Uz2Luk1G5|BplZ-WgLf^nZgt>uPr-@_fo3g&-9I32|OgX}p} Z003vI4iTb%1PlNG002ovPDHLkV1gik7{&kq literal 0 HcmV?d00001 diff --git a/e107_images/generic/lite/download.png b/e107_images/generic/lite/download.png new file mode 100644 index 0000000000000000000000000000000000000000..df791432df11debf0c44be50304c9dbd76491952 GIT binary patch literal 768 zcmV+b1ONPqP)+9>v%+(`Chhd`dn$!P(zW-*e|52d-K9~O=gZ~3at1~`P-rnA|xWpYs zmu9B%mCpZuy#H;n|68X2Mw$OHjQ<>h{|Rva0!FtfI8f2i(W9oXAWffTtNe(^|8}?k zYOnuXr~gZx|2dKWC58VGc>f7%{{~zC0YSwbFjBd>x)4C3I)CL`pYdL&`&*~~QKA1k zlm9A+{}z4!3UK}hT=fJ@?g2#d064WuRAx_g$2ncI6g{L+mh@_^|6Zj3K$QO>g8vhG z{|j>d2xtEVQS1dRiY!o~G+@H0t-3u~u4SI|jlTbexBq>!|4f?y5Ow|lUHSl1`vFGo z8ZBV;_V_zkxN)WOpvwQ2!T*}X|DDJGfVKWciTfK{`U5-c7b#`=`T06gw0o)WwAcTr z%>Sv)|EkUZvC{vt)BmB!|4w)B7b0fy@$ouJv52hi$K(IH*8jWL|GU=zyx9NI?f-zC z@)sRrI6|$UxbW)v|J&~W-0%PF`~Qxl@)a9n@9*zAKdgk9<hT{k=%JtT~WcN)CCIeW9keQ45=doKKs-G0Q=Mq0Ap$Zz$se*fHin70IUE2 yS^|KZngigGY6jp{s-}Q-_(mq1YH4d|Lwm02`J;YtD+K$#Id^ceD6?!2g53|Bl1|p348c-T&zS|Dm|; zNgqGIeOJn5CoKU001;>`TjQL*;G4D6ftb~IsPcTg{(!yyg~0xh%>RhT`J{$}XWq0}|Mg-2-x#KI zL@Wsp7B{n$!T+zx-I}h&s=m;%!PB?Q-=Ltlpl3qw%w+%lSpVGxtZM=x1ON{wnu4zT z$L9K^xzV7q#=+U`xxUP^i&pd8Z2$2_`^5o}Q3enI0|gg&X_D^D?fze>Yr>C&!zl{H{7t?bApmA+ILvcG` z%e>(K+VTIRw8B$ZQoyHyr&k+#T3X86?|_P|CPl8R)c@i4|AUX6Nlj6Th>okU!qVXC z{{R2FyVDB_9uF&)mBjzz_5a@P_viHa>Gb;a{r~*`|NQ;_*xd6cDMADnaafo9g~I=d z!vBfE|BS@{i^Knp#Q&1X|B%lAFhgtt4oMC(xei0j5J%A#PuUt+;vit@C1>j>ZtgL1 z=oBJU0015U03QGVBLD#<00Jlg1S|jrEC2>D7UDup00001bW%=J06^y0W&i*H8FWQh zbW?9;ba!ELWdK2BZ(?O2No`?gWm08fWO;GPWjp`?0OmDuo=Ft9E z^iP;LY4Vh*)27du2@#kzd(PZ>^A{{!w0H?bVCk~uD^{*ry=LvY^-x1LY}~YY%hqk% bw}LnT(QiU}Wk$No00000NkvXXu0mjf^|`$C literal 0 HcmV?d00001 diff --git a/e107_images/generic/lite/email.png b/e107_images/generic/lite/email.png new file mode 100644 index 0000000000000000000000000000000000000000..ee3827ac583790e6ce4d40b60e06f33a68c19a7a GIT binary patch literal 726 zcmV;{0xA88P)8#~kdDad>HnIU(?36ZH#bkErKM@9_Wd@c;Dm|LpAlnwi)@K!7$jPoSWn_xJa6bCku#^6TvX=jQ+M@&EPp z|M&O*{r&&#?EjmZ+&DOaHa1YOu(8mi-f6PrzXn%j1wY}@l-TKAN_QJ*PzP;(Sv*+UC`SSAr`S|~Tg2<1Ln`mgIt+nB) zu-mP!+`+%(*4FOm=l9vz^})aJ>+AmQ?f?4v|IW|*MMit?@9%PQw4I&L+1vT|`2Wbn z^3Kio=ji|E=l}He|AK|dhli5z@b{pg%x-SEoS)s)*!=D9|MT_#{rvyy>ifC6^Vr<} z)&ELLf${P2`1t#roXToxxtg5a)Ytm%@c+)u_PWFQ;p_j9lht^5i2eQkot@2R zXu6o1+}7IpzQp^+(*ICVis4YA7K~j*#H0l07*qo IM6N<$f*2dI{Qv*} literal 0 HcmV?d00001 diff --git a/e107_images/generic/lite/file.png b/e107_images/generic/lite/file.png new file mode 100644 index 0000000000000000000000000000000000000000..7ea568819a90717e4e5d68f767ecb0b5469141be GIT binary patch literal 804 zcmV+<1Ka$GP)e12B z{r&xdf{~hisQP)=HegoO9^_wexXm6VxkWo3tbd!UnjucLmgpQxIS!Gn9wcX8H#ec^t3 z;DLJJO-gl!hK7rOZ;yd&ys?+-;xIVb8B}|Msx|+Is)Y zQ~$v_|I=Il)JXr>Qvc&*|LkpUS1icL%w%M@czE4jU1HLyUH|Ke|Il3j%TNE#RsY#< z|J!B%)>8l2Pygjpa#tk7#K~r5w|RKnU0q_)piBPUhX3G+``d-_%6IFyVDiv@|J#QD z$fq~&}ZE(uT$8&Ub zYint9b9a}WyS&Bsy~O*w!uhMQ@tL3Mkdx|LTY%Wu*W%*ib#!xid3s}FU`IzsnVGbp zp~94www9W|m72$VewNqQ*O8HtlarHXW@Y;N``X&tva+&*f`a7aD+r9>D>_X;f1H002};L_t(2&tqW#f_;pPjP?u=zyc!v z{AXeW(R-aC0_(m4Rcr?0UppAxK?0u{5nwI403!=SDFKPYqp5{R z$eKTNNF_NiGtSP=+t}ENh=}p=@r-b0`s9R-0)qG9)O+$H)8o`+jCydsjbF zP*Csh@122h|Lm6k({2CZasSp`q;D-XCMnm~*QlSM(Y>Gi;*51pDLXSWk$PHq-BNExt$F0r zlPBY~Yo?}*f~v5*t8D+$QNoTqacgUKPENchFos!9sKHpQxjN*yL6MxV9)ABWp#OP~ zp#R20fmt=m%F3gjo~a-pYcw>epP#UHZPue|^uk=^z+t4Nm4lnGww7$0X*a2$qv+`9 zb{rgkA|l1b#m&6Grip&0e^k1OJFa#}k8x$y(9>sFSXvbov#_xK{r#=0tFK4w!vFvP z0d!JMQvg8b*k%9#010qNS#tmY9>D+r9>D>_X;f1H003!8L_t(2kz-)U+Q@(mm>8V@ zu7@x;Yygpr42u{U8KW7NF@iw|P=H}7BNB)Q3NUmaivR_x7*PeXQTZ$kA4wPZgu*|J zF2KOT@EMtZALLSQM#j&45dIsGU%-GB%>Tv!7hnMK|9}_(nxPcET&9w600000NkvXX Hu0mjfzzBVx literal 0 HcmV?d00001 diff --git a/e107_images/generic/lite/new.png b/e107_images/generic/lite/new.png new file mode 100644 index 0000000000000000000000000000000000000000..71ebd7c0a0ed9c51aaabe7388b0fcc5885779090 GIT binary patch literal 668 zcmV;N0%QG&P);bg($ebS;_*sdujS_I`u6dqURi9&OK`!Ri11 z`hbGPRaUS0`TSFIw(sidd6URwiN|o4&~u#CZJO9YgV!;C+%SaVioEfGg2rxcyHRkp z-QVUWUA6^Ev=&{#9cRfUa??13-b0Y(N0{zDne~*-|NZ^`LP4kD;ps4G!4Fx$A8N}d zbk#3_-awD%OPcRaqW4Fo{-oFc`1krgKBiQ1w*2|@q`l#jwd0<_>Y&B$mA&j)qVGhX z`Aet%sM!Di|Nd}ry@7$mHCwE=!`#2d-M_`&y1?Af&*K02_Ghs9PpSXP=l}is`D$yq zXlS?o{{MuU&0cf4V|l!0dc9g=vO-O$?C|!b)c@u8|K8l}N=&PQg2ep%{@&p5PGGY5 z`uzX>{hp-MIY6ejx82g!>P%s>zR2WMVYF;-yW`~Y<>~Y~SFJWlr@q1Am;>@R00001 zbW%=J06^y0W&i*H32;bRa{vGy!2kdr!2!c*R8s%|0A)!;K~yM_V_-l7j9{{xk&&?o zS)i2>1j;~6Ca}OyFld3OC}cze%|L-he0_Oi_zzP6ZP8V}-dhHPa0000`Q%ysNwd3?RxO^UR`lQ$(5Z|iL4Lsu4$p3+0Xdun z9+AZi41NkA%qUhn^Bz#p#?!?yL_(7FprViig9z(^{rLedDihTn{xdf?oGWs0U6GX3 y@7ydM&yeXWl&70^8g`mhUS*RrcHj?SjsN?{hfQt?&pRogISihzelF{r5}E+l9bZaTbl*M-*3H5ys3gF-?&`lctOtn19oX_F>XPuKEU%MJL>{j;EELe)8nW&U^n?T>Y%!AZ4_>XwW}36_!GYzC zp8i$4cJ2QE(aop$RM(P|a~9rsvM%`Ywfq0qi#M(N-FNu^!X0ln9=yEm=&b{F5!=o` z*Rf3f@@ehPeP?{j9^Cr)U&VIelD6huyD$Ggr+u)$|Hb~EFMt1U?hbqZ;ZuxRuy1H* z?ScQNQq?1-|G9DJbLOOX?h!T9uKb_1?&$2Tm+x(fc(b8O!Q*08R8-gL|Np-x?s@S4 z|6SJKM;Tvy`St(4M0R$~+$FmX-F$!I#0ll7$7jyov`#o(-F{<25c~3Q>3OIAzn;zT z{!B{wicgn|8RHU)n%6w-IR0}%y3?{^m*uq~|Nln(|Nr0BW?w5X!Wv3~{DOhpfdmW| ztlsHBx4idsaSW-rm9)a0nJ3Om?9rn~lO|27i4kD*?L4(4Lo$=ijaAz&)?PPoLBrAo z1uNS8Hg0Kh-cT%I-<-9saE-&vwzh3CQ@3x8-ebgE-DIV{ykXX?1jhQ9BDY=%XR*~* z-aN|}*M*g4#;%$e!PnfoOqN;QeOvW{MU_ztXN1@`ugFnp?rscTyC}cYs9*2GtzQEC zZ8>R*^|y<3gEc2uzuNgJ*v7KLr%Pz&&NBy?D!q(y_Sk%qXA T8xI4s1OtPotDnm{r-UW|rT_n7 literal 0 HcmV?d00001 diff --git a/e107_images/generic/lite/nonew_comments.png b/e107_images/generic/lite/nonew_comments.png new file mode 100644 index 0000000000000000000000000000000000000000..7d8823cebdb3773fe998edb21674a175459f80c3 GIT binary patch literal 341 zcmeAS@N?(olHy`uVBq!ia0vp^93afW%)r3da;;7u$YDu$^mSxl*x1kgCy^D%XD{*e zb!ET8!oeeZ`TwrrU`efr$Fb2~aZX3m_sdGqE)ix!oamoHtq zw7a|eOjW)x&^?SLL4Lsu4$p3+0Xdun9+AZi41NkA%qUhn^Bz#p-P6S}L_(7FAS+V? zP-5d@myNr3U-4^s_@Ah8{Fwectf3ahI iQ-G@xTT3F>561PpEGB!irs@EVWbkzLb6Mw<&;$S{XNbuF literal 0 HcmV?d00001 diff --git a/e107_images/generic/lite/password.png b/e107_images/generic/lite/password.png new file mode 100644 index 0000000000000000000000000000000000000000..91d06135e0bf4e09db95578a2079b3d66fcb288d GIT binary patch literal 2186 zcmV;52zB>~P)8zRB85gr{`cr<7Zrj8RdhMgjiS0O-X#aUK|xTU*T4@YBxStgYCO zl+Jc|#^vhy{m206zX;N(Qf3JRrFM3csn%0duqGy(2n?7F8mbpBup&miVPUuYxd7j{ z1^?zI$COLFmzOna)lH1+TCx3Yw*H)GXon{N{^$VW$`$|R82{!)lt(Kr1wJN9&eFKJ zbrt~nr~v-<0ss6f|Km9<2T4DQ?{vcdc{et=YzF_`Iaot$tx{*07bIs_fpL=QkH`M1 zVSn~6F6{;ewhj%5Au4Zal6QsF<=NKVmjJUhHPJ~)(JwBFKU6S0#cxk&uGRg?Xll?6 z2#I8Z-iH8)M=5GTU9p9T_=13tfSqm0frCk2f~jN`R!oNf+9mR~FWQtD@y>|!(TwKR#{d5^|J+E$oO}A$ma}j&|Ncw= z|7HLFga7@T|J+*IvxQp^6t!(6-@l{ja$wEVqYLkxe`A z$X2_Od8=$Ud@(2X$}`ricipsjo@F)a*uT%TpRHa7<*Ev}n}>){Cds9Q@XnURga(9H zI?%M1-oTijdSI)Kdyi*Ml5ADGbp)qe6f1kRGynhq0d!JMQvg8b*k%9#1rJF?K~#9! zy_J7l6LlEJZ{ud{5@hb&AO^M=u)!1~2HMChu0e{h=9YNnJx z!5{*XmWg7SW`v1h3teP76)MZjeo95Z`>W@BH`$GRy?XgaJ>R>%zIXR|-{*P0KW-TI zzeKT2DwQ@iW@cs%g@haqP5L+e^XijTRaJkYXl`!)YvZ}dz@tk7*QGhNT9P0LlAL-q7_@V7yFT)M|Zfcs-up-t*N#ghc%|5A2o}ho1W~rKfY}`QsH{97jYy0EgV&Usb;(9@Jzf z0?1F#e75!TmcgFA``+w23u5rb`;U2hdk?wYsxL%9h}@|Kz(|~qi<`QAu&47t-_Xan z55Jfa=-utRKM4R0Ck4Qmp8iJ0_E&p4_x7DS+VAs$+~@UrkU_g!rwahGk4&S$HUxao zx9j)`A0Yi+WPpJ7+IR6lN^6{Bfq{k(k9kpe1cUary7&7>fk>g~i@**@>Bv!!#{+8g z{%!!;nrcNrd>R0R$f2|E@Ov=&9%zU7irbr9DiPqHhf!effp^v&1SyJcUf<@bRf%eN zUA8AEC76f(Z*{v-bNlsms(R5VVU0`C;xihJb4&RecJAtOx!r!XpjYjFEqLafCgk8O z-PY1Fv!mnXh9+Lh%bOq{Rn0572#A-dYuBg zZP@fw5FjasO=?U>!1^R^QVq^7&ClxeBE9{sf$V0MDP6`f>&2V7h5g1Fe6tgnBsOWK;qHIboO39@L z)sZCkr&RF>!$olzrliBUM{{y=N;sNQ!eta@FXKc&aE4(Xe2Ag|$eI`Un8}vHutG{Rr`<`x+W=wMl37;kvit~u@4kn!(Kafp zEZ`s=rzO()lmq}VcP+M9mgJY9d?>R4<|8Xcw3^hnlYB}G7E%yAQM|~KZOyxbWJ9-#2hv2rkk_)o*CUr(1ZtV zAtIebHO#o)pywF_SfL*jdT0q6g?P21wM0yrnlkNLO{$&`gIzX*7I$ja2nVgU)An4HR6B83+HPI2l+ZqUxn50riqP2fjv_=yX6B`>l8P1p(jVAi) zF>-+*t{flczY3oap-@bOP$(1;6O`Dc0#^7Hq1fewL>hu$7VzK1-#OefC6j(G!2kdN M07*qoM6N<$f^q{sn*aa+ literal 0 HcmV?d00001 diff --git a/e107_images/generic/lite/printer.png b/e107_images/generic/lite/printer.png new file mode 100644 index 0000000000000000000000000000000000000000..23242ffe4ac2db6c2413e6d81e2877a001b4c3aa GIT binary patch literal 820 zcmV-41Izr0P)>+;9P z&ehe}sHm%Uc6Oegp6crC!otL1VPdGLsH>~2si~@{sHvx?sHUc;r>Ci!nw(=}W7E^s z=;-Q|m6goQ%(Jw#YiekEa%z2cZhUuee0OnucW{1pZh3KNad26=_t)Isgv0E5&i_`s|3S0= zITR>guGr&%xgJ!`<}1-1WEE^sm(Os?znH zwaM-3=+x%l+uz=JczEdO=%1gTzrVhNgo)zp_|@X_(B1CL*XhR3;?C3Ks;aQQzP+xk zt(lma;^N};^z_ry(}jhJ^!NPj^Z4iO_21*|?(z3`cX{RI<&lw=_xt_v_514b_~PsI z^!fjDb9KeV#qsg+larYK|Nrs!`|0uc`2YWPb$9#z|Md9%f`Nq8)YO)io}{Fxqok*! zqo;s?g#7&c@KEI=00001bW%=J06^y0W&i*H32;bRa{vGf6951U69E94oEQKA0EJ0J zK~yM_V`M-Bj38nokYr^1$NW*i3nC!&j)7q%aIPy{m26fj1?7!3cJz_d4t^anvk8<+x^ ym@cXbUm4|rVc literal 0 HcmV?d00001 diff --git a/e107_images/generic/lite/question.png b/e107_images/generic/lite/question.png new file mode 100644 index 0000000000000000000000000000000000000000..28dbe122440464159827f790823f76640995c6f6 GIT binary patch literal 973 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLlT+~>c4 z|NZv!pI_i|m4M9*_UkTPdo^SErFWlxeg5`W+F?y*X$o`J6-Pt-ARS6(Wvnhi=lY|6*Hstz-4`&Iw1&QulxT`pY=~no7}|(73hb zOI~pWoV;-Fd&Hcdy5&!O8t%&{p8NFeZ+rjIGuPgqJ^$?blb;OEhoxgqR;~K9?$Uqb zf(Obucgm-oR|{OLn|tNx(T6PZvlv1j@j7gm_t+xuxm!DI6PwHo)u1g3Q8(Uw{Kf0P zKdJ9QR?|UQr&Yqni?82#d*u4}(1~C3XFsT@*ik;=LfYgfDv4*@D{t@y9XfLBk96$C z+C?vZ{QA4`+JB9dizn{H!p19w+;$78&th=g6q&G& z&3)HJP)J_xnR;^Dt^X`R=NJMnDaM@F^j+;yeumj`txMsdn)y!;AHJ{QvxYzE;p~l% zrX2Xi=Du6K?nm2}FPvIStLHt^4P9Tn?ECGfKg%ay^9@+e?Xy={d3t2q-QwBz?dw1H zt$wn2&)ffCkeScC3z!0Cmjw9*LqrB6$uKo+(hQ(8Z+p5phE&{2n$gN8;ou??zkXFt zH;1}UgZ6?2dr$8?-!*+ct4=_o!jywYj-1hveY~DuXu^fCGEdL>mX~cD6QdT|1}NBU z)5=aOiIDQ&zb<dI{~9qy6@zm6R6R0xeJ|^q}qR%4iWO6ShGt$3E-+jJ@Q&m-pLy$!o~UOg|bH z6NVtj(TuNB@qUl|k0D3=`ceE_1iu9p;4a}1gg13A`0=_wpD0PYT0$r!mE6rOCL*}} z!aQPZ#t*p#L_9G!zoKZGn2aES(ODNSr@7s3+AQeTV0;yx8erH23^nt>=hJwA)BkM9 z4BZBhNhOcbc64^|@5+dSH*XA^&^-rYAttiH%sRX_80KEW?=DyLFHy8P5G(_>3{{mB zyWK{ghl;!9(+|qqWX#B)BAZYLc)mfJkkALA4X9l>f2g%-`};V~U0CTay8n=>QYn>| z$@PI!bk@)^!r<|SnmKCe(&)X3d&R0^6N>Ig&*|17nfsYQAUxiDymt_57SOnu79HcW zi~yFDjjhd=NvNPv$Tbx#joP>8<1EAI#DdWS{~R1hrIPuk!s$CCv)Qb1x~+e}_>5_{ z_LylC8Y(F~Bd?>qO(YbGgaY*%Fqc?$HPzCE!<~xoo;euM4{}V9gXPRFn5t`PC~^vF zfk_XH>J&I8PNP+02Jza~+P2H3c(E$6Nm#ta)-IuR0q7b`?WD-Z=}s2IzVIbi}yoV)QgpsWff-hU_8$#J~D5&3_|72|knH zkN+MK?<8Z)}TxF5Np5kYxAZo#abz zfBxemWMVWZ`|ItwL3d2p9aUiR7eh2-{JYn7$fwS$0>?M;RL7qK*@=`c?fu}qy?5CB zkoS}H>eFq(;c=m2(#mzxce?kk9t(~RF-CkG_tz(3mTw6s1F%n}=JKj%_^k{3A!i?@ zC@RZPHcpmK>2#&?m24*UL|HV!9#?v0z+4w(C7HMh_%5URMVD2ao0t_#OGr#lB1gQ| zHZJ;dVm>%?tD7sfIY^S$4Q*p}ZEkizij#b;t-$kJumDF-$B&w<^wN@>gs~@VZHZfgcWlnRMTN^mZ{L(aIv!;@1t3bod zmOfKb&=zR;-~qWH#1sQT4BwLk)G&e!2xFzr>H0+fMYrAE?zg)gJ2mC>`iN~22!gDq zo=Hp#`lf$evnr_jVmGD-Ei9LEo`N7fx}&Q(--CH8GbxjqUUZdNN-tp`l$@e$#!l*W zdM+c4LC?8;L(e#YAR&0_xr<5Y2=GQhE|-}-&`E&E0=Ny#ZZOV*b{1H*f)}G8m0-A3 zqMiYp%_hU~CL@R~Ajc&#^Ga8jNMT-)T0!##0>c+{F0k8eq-TZnf}!jh;e}5PoXG~x zm>bOGr#Zjh#4Yvtd^{fSF}Ln#e)!RA-=soEUI{2 zRP>i?2iDHj38|rxz3!N=HMy8}xw8bVT76G04Xfx?ZrS3AB{ZQb^M-C$ZSBE7EioCi zkR7dA``P(wOG-gQCWiF!YVi|C@WOaZ88MhOaBO?yTeU`U-<|wwU^BVf7fA@Jo~BE8 zg+`ZDJUWGvoRg~gm|dZ%v^MKLA+2UlTt8Jw#%{h$OUSH84{$0QTQVZ!D?<==R1RE8 R{*@IRg;0}H62%F$s=qO&S)Tv^ literal 0 HcmV?d00001 diff --git a/e107_images/generic/lite/search_enhanced.png b/e107_images/generic/lite/search_enhanced.png new file mode 100644 index 0000000000000000000000000000000000000000..0bd5156e2a9d30c935716a83e533819acbc757fb GIT binary patch literal 1197 zcmdr~>rYb$9KGV0li{|EWtqwpY88q>2A^xOSSCz_$qlS2=#uqqudm}3c@$e#pADXDg2ucoz+^MbnrV7b zH@j)T1LfrZ^gU>gKO!a!)m2SekfM^=nkuaez;;?-g*m12Ma~}7 z0;ss3r{)ch8Fsd|HZ)(ZPkco|FE(IY?J`tyt8&D79pdQ$J+zLr-FmoUdJfDM89EDn z#JqeC06*U1t=7k%tggB#Ze1E0%8_SLS!Mn5e%!TMdbgNbUVf@T5MQPQMuLnY#p;bNIo+Ao)Opy;gCrg6fG(fC4>wBy;Cq!m3d*c}eX^s>k8 zc4v!np1uSgCgJ=6H2&PJ%DR`D4 ziT3>7J;6Rd8m zI-1f{E)a`^zch3(Wc8%6gV?yPN35bX-+AN!-SiC41e)0;ZRzE;%{BWoCjfjc8V&Ql zP+gFcO!mhA0gzo$yUP(|*Xs$f(PxXTna2v-I*OF&tN&RBIH0mp_P^Be5C2?S`$t zLT&fg-;3v%IgzP9GYxg&dB$KdCfWY@_S-8mX$U1^w9;4JEYp;RUpSGS_9u1oLJ)Nh zyAv2b@7#NoW^f$a zx=GiLJHBTrk4;TjS&?Oj%!tJPmdgHuu))VmaGv1#~1>$4gt9w3eGDP$8~ko#>U4!09=X6`1kjgn4f`VYriQK=TbG~ zH52V@QtxzH@_At6Mk>dwtkp^Y|MlYgx2NrXXV^$G&?XJZmX^PjmE%9x&QJEb`&esBq^aRz347Mx+qM^AwhN#5-ECDw?SkCg*Aw} z$ufc<39Jw^qlErZ6EfJ8+=RK@9|Ln=7vHRlpzeI$i*tDS9nRr-&nx~Ttr6hQzeYh& zl7vF|hh&HW`KBgsy&K+p%8bvUyk)Tcj ziKaknpf%7McwJY7B6y^I2nH3Oc9a25eFx5%HzmomNlG*$P{Wa1d&+Z{b9;L1Ky=gT z%MwU3ZOsTA)yFfpTL8V^j(v$lzpXnTU2?Yb_znX4XP(-13BEa|g=PHEiXg+fUz04YipiZFr)WXALV(^>f58L{L9rG-rLCQ;N)?35vMm$>0|{k}kMZo%uHUAZ31D+; zQ3gUXO*2QDw1A@3_nluU(QkdTc@(sOKbL86X44<(HT`=3(l0oUxgju_E~fwh002ov JPDHLkV1m<<;(P!A literal 0 HcmV?d00001 diff --git a/e107_images/generic/lite/user_select.png b/e107_images/generic/lite/user_select.png new file mode 100644 index 0000000000000000000000000000000000000000..68a2bdfd8a19b96caa68c20a0ce124268638bbfe GIT binary patch literal 1236 zcmds#{WIGK9LK+7TuZgRZLZTFw%)ocdV6Ts>UPG~cr4OPQR>PrAt_ZxCa0316K0;O zSGPtHn-!~gsCZaN)Wd3$2^B$@NE0Ly5l?x*l2|^={*8U^-k z2!gnTTnUJ<`SJgB$lmrnK0Fp_v)7YQS5XMk@#m)wr5amyBL&_dMW){(-Nk)NKv4Mf z1j4D1G+YuPf`G%5iDLvG1hLBuM@I!dnSuk!`1ba8Am&a0`gXFwU&P^zT3_b8gxpDh z)&4CLY?>jaZgW5ZEn)y=WAQkAks1U`^Iu(0TkmSB6T^XYvVR%MBZIxjXHT7tJ&-)M z=#7C7uX2a9~(25YaY)(@RxUf^@8$PCuX4(RXn#*dOeHvDZEky*uBP|c628VZH` z1I7JSuqw7#ETEC*a?Q{CGXeG{1)~7}X!n6J@nhv6G%OX-**pF0-@s%znBq{W)S;!` z8FpDx5)syzNljG(fnYi%!6Fll{Zg>Su7%Z(uJy{0{8{VHx}IOCqLQ}E02ZymU#_GC#>*#l@a}5xpV?b zCP1puEGTE1XTdKtydCn73-=o12@_jE!m$R6JY$sVYFH(@99*ObCT7 zs-iVBXos`c8mg5Ik4D87kn&3uaVB0b=ocA@v9uu&Qiz4hYy14%9u}*At#Mb*Q8XkA zAAY&NFbzl_e zhov&b@IuR$8AZBXB_r?a*q=AOqCW@aOz>60v}uLj>U&=uU9C=$8*HF8#btCt8@{81 zB~_UU#z550m5y}r7@1RR0LzUG?yOZ(2V3gMUxV0`MDrq@(n-Y+WN@-P4t~hMXFs_> z;0m^FTuhj2`1_-IhT{*o&zvlrbiBRbzxxVDd8&TrFCF6eV*)KVum7quiFJLR2BXdx%>;&DWt zm6scT;_aiKF*{n&x8!qe^(*yn#Srsxiq27O10COz=IR@HFK@lv`N+w^SEc5%EU(m~ zweK?PG73v@+mhRt#Exto9p&XC)e0`1JJgwVv7OjWf86cw4j1K|8$~Uv5f@h9SPXUR zGM)IOxcUQZAGXJnci#O`Vi}ea^wCrKVMo>jzlbv!b$oPXR+RU#_cHQ5;|gP|2~A}d chwl)3by*3HfT+1c^R%I2n~)5F8zyu9k&-Sw}p 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 literal 0 HcmV?d00001 diff --git a/e107_images/generic/poweredbymysql-88.png b/e107_images/generic/poweredbymysql-88.png new file mode 100644 index 0000000000000000000000000000000000000000..1acff483bc116cb55e62bbae95a12f18f9d00d05 GIT binary patch literal 1681 zcmV;C25$L@P)*@0L-HHJH_v!fN!T$N}|NZ#U z;p!f9llA%gBIc;-PY#rVV|^^!Orcy zWPGo~?7Ca+^!e(nGvk&8>b6tkog3lp@kNfQ-t6(q;OF-F{qe+Vz}eyJxKA5uiFB*N z?X*Jk)|~q4#kJAi?Zj&S`tkq%{EfWJ{q^OU!O`{ItTlzACw-bbhM|43#jViW-;x1s zrMa!m+Ge7->9J1m_xSz({{H*))$8-$NKNq0A7Rr{r>5(O84HO$lm70-s$$)n=XW-UYxU9nX;+M*~;GOO_Zrt zo3x9z$NKQuA!&>iaE-Fi+5kpw?zc(krXteg?CY^T4P%7osxU@~q2Zbm)#mFcca+p`yjlw$$KDj-{{B;+MnG_|==A#@O}Lk|27R_u7~K{r}|f^!)SR{P5ZAz;fN^ z>#NM#6J3Pp^7JHjksxrG^38vr#nb%Id@FaED0r9vJ7ns%OYOEy-Rko9^zGo74|Jln zb*8!Y&xGf$Jm{@B=deBg?9$?(3?FxyM2)6Lk*fdw{jkp12v~fY#M9yF@s+;M=I`_K z*`qRemG;}D_ui-b^x@x^6#et%EPGl8q{y~bP^7{QkjHX+lu~3z*R+_KqvRL=wwfN<< zUrc9i0000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#7fD1xR7l5T z=%W!}=<6XFY%R@a_`!%@4Os?v$*{>-+d0*FQQKgaKfB$!*6TlUR->}PJ>5QGEW4(* zB+amAq^`kkw|)67HG6twH#1Pz;2z$u-kQK7}F_KgNg=E6pB>TkAtw)_4%o1@Z|0! zw$3yNJC?6%8uh}MHObCez6HXzy!u6lY6kZ_?O$&Xb+Q`^+m+a<)H0am7K>LA)S;RD zD+|M^WiSY6eN_b0Cqid9rfCr}c%oV{E0{51TP`z75*2({4g~2IW)rx#PntAIio569 zV<{e>gxcX1VT8l@x=nNwSeeEu5xy!UiF6asmjVI;mn7UpRbB%bwYprUD$hQGq}XMA zo)R?pyLe1*Du}@#-XP+LaI)aew)4Wm%Y{w+Lsb20goTCM{enIRIdDO|dHWYLA%m|* z|E#Rs+tb6Qcds-$)pfTwDDNt6Tz68!;Q>U2(Y#tSAZ02Mf8Rw}5~@v6hmgS~z4FdC zWP2vht`0XB@r|lD0t#{7==~ap+MZk8HT=if6L3llWU!!Id^W;h!eLw@Zl@V-+p~?S zAtzSkjYmZ*$l$tYK96O>jW5K+YA@KJJfHZ?s`I+`e>xeY&*cf zJUxR?y2ngPQZiASLoT3M%xr-XClAoYSs#o@F__UfqoW}Dc8{;f?5-tX7prCPMM0#u zaJYPWw8(wotgQbE@uGkIxQI5`w)*r$FD8-RwLLvEkDg(4&anOM;}e{*StCNpz`&s9 zy+fW^vR|X_JB}$++Rg4Ns{#cL&KXK>*hI+SSGKF&+}1E9tm)|yV!Ao`?ZGdFUplU4 zTxO2&tgo+6J}%1BvqO7+vcWM`jsrattd1oEMU@Pt^3D=6*oz%lyt=Wo15+?RJHHn5 z^g3SNm6p-__VRFo05>?LaawSiCMt-f^h_`Xi@JYvHzlpCXkqH?2ZFiz#+Y(u+&p+& bLNo#Z-QZyTgp$dq00000NkvXXu0mjf>nFKC literal 0 HcmV?d00001 diff --git a/e107_images/generic/valid-xhtml11.png b/e107_images/generic/valid-xhtml11.png new file mode 100644 index 0000000000000000000000000000000000000000..d3cbba1ad1d864bf7b1e356d7eda09b6d77b03a2 GIT binary patch literal 1903 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 literal 0 HcmV?d00001 diff --git a/e107_images/generic/vcss_small.png b/e107_images/generic/vcss_small.png new file mode 100644 index 0000000000000000000000000000000000000000..85ce17e707e17fa57744494d4a48488e6e50e849 GIT binary patch literal 516 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 D1|Tic literal 0 HcmV?d00001 diff --git a/e107_images/icons/folderx.png b/e107_images/icons/folderx.png new file mode 100644 index 0000000000000000000000000000000000000000..6376568a51141ca707d2a87303cc0af87cfe1614 GIT binary patch literal 2116 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 Dyi-r3 literal 0 HcmV?d00001 diff --git a/e107_images/icons/html.png b/e107_images/icons/html.png new file mode 100644 index 0000000000000000000000000000000000000000..173274770ad9a1d7bc9a5212d92b6f0d58248de8 GIT binary patch literal 540 zcmV+%0^|LOP)$@yKWOv7=*ubye8`lA&HH_Ar?XgfeR~=3jzg{t|@p5-o_20vv>dsUI5WRLF5!% zq@=L0AVen45)sRL$=UP&6jp?Un11GyX2uMM!%45#YpE*#ld4iE6qrt@elQrk3_6`o zv)k=j5y7B{DtRuTf-#VL0ia&5+fu1?KTuWmUO+v+6USlX$h{)oQ>(y6)#BBVdylHB z6%njaew=2!ImjrL%QPERij@j`N0txcgupBVy!QmEO6okXc4w5=*NI)m-j@ld3&+Rt zG2f5RdH!q%YZO%_5D^xcGWtB>>#u#jJ?b&uKjGcm_n6Wun_DdoXE9qF%K`#br2KmgV~m;4 e=Q0|NUjG5(`~ZBEAs52{0000 zI-XJY?Q!10Y=4oPl98P^WHB;;`lqg&8j|t5w2Bz{u6~va_nPi^C2OXq=N1?3skFRZBr50gqk@i&jEqm%rf*6lePXd)EOrD1y%q>g`ubU|9pAfq zQw|6xC6YOT;0r-?IytRUlsO>aq=$#mSZDt9S-XG#oLD^P>DdL)2ha=9!(usv!f%HU zpW<*zOJA6brfe^-<$!=GHv0#_D8LxNFu;npw@oC9-^0nxePFd%AMyErC~7M>cvc{o za&?^qm;smu7zY>xSmttP4;_lO&bjuXQyw}cVX9$Ic$f)(o zN;I3Xz8)JIu%!i?o3XJGKYYNZrnRD?)%5f!n!a>G+F*F`j!E9vhvVbe-;aZXI5vhI z9oW-@qoX)KkDZ-`;o)^glOZLwF*(`65Qc|0Yihb=vO%>PTU&8t1P2BdUcE9zMn2K! zy)CPFNXyHm(yEY9{gES&GcrrATzwuGSQQp#kVfWexNDS{I0qvxF zgsH_urP<%C!EePcmQ7uIL3gLRmRMpim3vjc+=^}cCdYV_+l>c>JeIDDyqxYHDk1Yj<~dRaI3uI5?M=nZCZkNl8g? zaBx~$T1`z&f`Wo{baXyGKGoIPgoK7^X=!zJb!cd4TU%RCPfs>BHe_UEgM)*Mi;G@f zUN<*5sHmzrIXQE4b6HtgQBhGvMMWJQ9W5;_VPRo^e}9^qnr3EZPEJllL_`V-3JeSk zEG#TWMn+v-U4emtdU|?QRaP)CFhM~@o2?;4FDPv<}C@3gBJv~Q9M@&piP*6}F z9v%w|3nL>VSXfwBS6Cq-AwohzTwGjWU|>T-LmL|#ARr(Z7#Lq)Uy+fKhK7cFdwY3# zd47I=ZEbBPCMK<|t-HIsudlDBrly^pos^W6jg5_)o12G+hmw+%OiWGB&(F-v%)`UO zz`(%4!NJ7D#H_5WQc_Z-rKg^rq14pW=jZ3-@T;Naxq;^tXdTHfB?adB}u zIXbVevOGLJKtMogX>020?UZ6VJOBUy0d!JMQvg8b*k%9#010qNS#tmY9>D+r9>D>_ zX;f1H007TPL_t(26$QaDO9Ej4fZ_Lrw8X<(Di0D0!j_JPmWD!bYHl)Ga_BEK6*RT^ z8(f3_LQ_LVwFM%zj`HP64n2 literal 0 HcmV?d00001 diff --git a/e107_images/icons/icon11.png b/e107_images/icons/icon11.png new file mode 100644 index 0000000000000000000000000000000000000000..882526a847353d9464c8ebec6298fe4c1854a57d GIT binary patch literal 885 zcmV-*1B(2KP)fhhz+S=mK(AmAc$(EL=NJv$bl$PAw;Cgz7>+AIJ@b&BK@#*RA<>l<*;p*Pr z=G)ul*Vp0A&DW!&v_nHrz`(?Uf{E7F;Pv(T>FMw2=Usd!O)bHq4@ay^Yr@W=IYhd z*1WpCot~_&vclBV;mOI?#l_UXz|q0M)4jdVUtea8i;S$OsEdV(X=8CnLuD;0SZ;26 zcX@`hxysPb-oe4qy}i!D!qu&?lG5B=?bsP+5Yl6hc z+rGZig@u@#o1jK`;)TioaJK(lsQ*Tq|00e55;mm0Oc4L_CfjxhVHqHDfS84ZmZ_<) zYlhpH!S;>F|6Qj4L6`p%e*8x$XYYv$|NA}t-7m~n1yU?A&Cb*4>h)HH<#Da~YOw!B zpZ^SG;)^yf|G^^v;X(i7LjTGxszL;nj*##0_j8}{N|E|F`h_s(axlMiU*X>3qJ|^k00001bW%=J z06^y0W&i*H32;bRa{vGy!2kdr!2!c*R8s%|0CGu0K~yLe1;HV%0RRAi;s1*^QF(#Q z1x%DAQ4tkc(A~fdoIn*^zyaPZY+g`aw28h?^$TEDx&vTQZUC?<7Xa9lGXU7-1OOZy z0q{3QdjLRN06=TN>j$n{0=$QyIXou-ngRf71ON}!0D%8g1@Ngau`m!W2nOdl00000 LNkvXXu0mjf_KD*+ literal 0 HcmV?d00001 diff --git a/e107_images/icons/icon12.png b/e107_images/icons/icon12.png new file mode 100644 index 0000000000000000000000000000000000000000..4b616e24caf22c5239e3a23cf4d0fe490e96ed1b GIT binary patch literal 738 zcmV<80v-K{P)YI}cwlS)cg zO-)jzrKsuY?WU%xU0r2F@vB;Pl7J;i|02etw`xM`kQ6KU-U2zP`btqOPc@vftn1|NsB|{QvXv z|L*Pn*xT;I$J)Wg*ruw+c6OXaL~SA>Ks`N4sHm&x=(@ud1)bg@&G9UVE^xx092g+}q~u?e_Ea{qpwz+A5XuDFwvoWsM&sd;XVSu2i;jErqzk6J9; z+uxpxja)W2gDM!2j*!5xvu;XEeGm|%0Rgc90JSI;i(4$}-r}bzD$)P|=>Pz%Cl!iY zEauJ7#Bp=2BP6Z_1gZc4u`3piU@wh|jPmjI)UmXsS6G%Q9E40Pv#_&O`vL|40004W zQchCSWB`L%j3AH*WHExc zlNcc&9V*ZRWdHxo&iJ$orlJ+1;5A%;fuRA&|HE2?5CDQY#(&LFfpVa98$&fCBSavF z5e~p+Bp~>VQ$YejjL2Xi10#nuBPw7pK@(6x<1>n(@a{4&av^bFgWUn=eg``k0Awf> U*MZNc(EtDd07*qoM6N<$f=9i5LI3~& literal 0 HcmV?d00001 diff --git a/e107_images/icons/icon13.png b/e107_images/icons/icon13.png new file mode 100644 index 0000000000000000000000000000000000000000..5a6f570e142b0b88f0d50a0966f5efabe87ee1bd GIT binary patch literal 829 zcmV-D1H$}?P)Y<~aa&r$2kudlne-+KK_IvmL6=08*_5vs~m z)1LsSAO^hmRO6Tn=g-s{3nxEuB1XUe;TL)QZ-*eX_`(xaqH>#*8wJ6urzi?03@8|9EtN`zwY4?6Y09^E?{ezwSvtKQ>+9=Wy>f-s)m5t1Di{M%1jd#IfU(9B zR;%o6xB2+;Wp;LU`1HmN6sXP4qN?l-hv@W*C`4?4F%|&l0!NMZy4QEhso^93~3Lx_y?Gme|_bVx`q$7{}bYeVa*^ z!R%}q|722z8U#4!K)@MmFk#4VKmE-6%gfj(qOUMluVX|gih{vt#CR|$4JH%D`4}+< zRdCi>o`2?9=3hKbZ+DkuW`+wdzeF_*vBof&6r=}3`hx*^nv$m@PR*Ynj$^zpa8Z=- z#pk!UeyxK$OjhI=14k0PD&8x#+Ed`iBuS-HYz+d00000NkvXX Hu0mjf=@52h literal 0 HcmV?d00001 diff --git a/e107_images/icons/icon14.png b/e107_images/icons/icon14.png new file mode 100644 index 0000000000000000000000000000000000000000..59d5cde93f8e18ec152957840af2b080bd22d1b0 GIT binary patch literal 872 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 jZi#OIkdR70^P4{a8v+A)yr+XGut5Y|Ycx)7jfG zQCUQhO=sXobni!j_EM7nUz7h|g7#B&@kwanM@X1VElyL+)7RxiKEC6A-2f2crWH zo(>sQKO|@~7LFJIk^mB+5LdibgUy7O)0dvtpP18`h0carzF8Hc5&)F|6pj@iO+`|I zWD;^02!#e-yIz^rnX25Xy5qXS=EB41!@K0WtKF-b*P3L%WebW25^NqrWNEU-yaZVh zGL z>&Vyd*Xi}?^ZN7Z_UhU2+R5$6t>>megic6hXy@te*5BMVdpS~}OULZQ_y6_(|Nr^_ z_08|eT##xjP*2j>+}PsWRgzXMdn$;ti_zfI>hbLB@$A&$*O0B7GF?qhXKU>5@Uh3V zQG8q~RzovZP%~FhDo;vFXJ@Llx$5ljGl~(^00001bW%=J06^y0W&i*H32;bRa{vGy z!2kdr!2!c*R8s%|08vRqK~yM_V`N}pxXK6vN(>Av3=F5f!3DU#GB7gi2Qz^R!L&K! z2B;(hlxF#eF7Sa76=13$Ljc22f&z>T;waoZKu>TZ@n12(eFX;J7#ILlm=UcmWmbm( O000056g#jLNxc+Ax(qU_1|66P3x!2RovyCb>+bV< zfxZ+vt0ZF1Bxua$_+!k0}zZpKAG3o=~ZH_3M!d1a@-44$pAgQRgK-->ihHe`||nz zveEVmNwokuqy!d`fQ-XCbJ;I<;{s63087Nt-|_SA=;h_)_x0|JtKtAWs|!oL$Iaw4 zYt=i0?f_HL08Y!M!tDC>?D+QeI&jPYFsNH>vm8jXOONvrV%q>k#j3>V_xJTdcFq7n zveDS-88(?ec-%01>Ht;Q`}y<$JGGOb%@I4LP?Gc(Xyfeb>i|T!6y)9wERG$Aki1nDi`;)r&gs}8wl;v=j*^#f} zm$TuVwcty9)gNQinyS+eK&NG<{F%i5p~n4{y!nr~_GFdmT8raKfZt4j-AaAkLU-Fd zan>AO)Fx}=+1~9QLZDxg;;_~KqRIcA!~A%r@LP)6dY#%zec4ch;3sYHA70>Qf4v}7 zww=iStkM6Z$^V_h`(={dyUOOMyx}x&-!Oas)Y|J6Je^U5+o;R`Y?9YLga0RB*psEv z1~#8P`D z>_lFzKUb;I*6E~n>xTdU00DGTPE!Ct=GbNc000SaNLh0L03N{r03N{s!)a7g0006r zNkl&no3Xa~;x%YqndapXu;!ZwFXj5lGRbRLy;FxqcJpMOg|?nUi`Ie1UYi-qcq!EYjW?-}SPgl4f&i1q?u@ zT=UtdeIjz8r?w<-)zG*!{|meWV4TTD`laD(s3Z#&99qt44|D@ChpCc~-qPQYh0atx z%_{GKCjek7y&Z-m33R4(9cNU|0}ni)qR`a}q96Ot zq;&XBQ>@Ec^1v;0cq*F!=#KTBs1A$JTWwX{w--Hd4J?TPxJxtXcmmYiioP$l=L@TD0kn#WiZgGQ@uSob6`4@Vmnneb z-*y0^#Hz%OfGtX9eM(KQoV!Uy0g<63z=yp`qJt%BbTtp51XwYEF_BteHd|w=ku{0h z1}bXjVjx1U2!Mfgq1}uf0YJ#-ivUJ`kA1k%7XYR=dYpm)(EsT-H>{uM{MR9_XH_Bq O0000r?(%DEb&ZXlo13qys=&9m&Wehh&CStc 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 FV1j3Put)#^ literal 0 HcmV?d00001 diff --git a/e107_images/icons/icon23.png b/e107_images/icons/icon23.png new file mode 100644 index 0000000000000000000000000000000000000000..5cd43b743baef067e35e39e387465df49552546f GIT binary patch literal 1406 zcmV-^1%djBP)ln$}`0VWQ>FM$5 z>Fwp^?C9t0l((;pyJq=-k}q+1c4?X=&c!=I`(I_V)by{Qmj* z{%B}t{{H`|sj6dRWM^k+oSdEY_4;03UH||9OiWErPf+6G=|IX?C{P*_t@$%#7^0DOpZ>H8pccfXU^GTlmI)(Wxa`_BN-tOz{{rmoDrrML! z|Do9b&FA{#>-E{^^|Iakn9~1@%Kw7N|8vFvSgij>m;5(@`6zAq2}a&ZRCHx*cVMF0 zip~F&(EpLn|AfZ>biMyzvj0z`|3HoUGI{qSX7>a?-AGb%?dt1fYj#wd+I__Th{^wr z%>RMK|98OuXSe@Vs{Tot{3~(x9bWbTIowB4a$#zAMv~fXy#I#C|4g0zBxdy%RQ3Qc z+C@!qUS@PSh1glK|6;WNZMpw)y#H#r|22L0C~Wl`S@I1?@&G8=>*?xTVstHf;7q0e zTD1ROxc_0g|52&`Kau}5g8wOU{~Tfe4^969J^uhF=R!+ySzKulHgqOZj3`u#Dp-sx zTZ}DSj3iErA4iKCK#CMOiVZM|2quXJAc+7IcST8G!NJO|sHv@{sj#Z4u&k)OyTiuD z#@yW7*Vov|$;q>`wXAqd=>Px#0d!JMQvg8b*k%9#010qNS#tmY9>D+r9>D>_X;f1H z00H_*L_t(IjfIm>YZFlvM}KGXW|Gz>WK^06{;$zQF?CtNow$*T2;KPs{21N3^IH@_ zD6U+KuH6(dk*1Yeg;;BvG)-(uCeOuWCesRf-}0V&?z@ls!2ai88Kz~iawG{MfxVjA zJlC9Cvw$VtDK%87RV1k{sVGTOlj3e@@D}SzMj#=LT94jsga&VM<2{m)Bw5Kp5_3+v zF*ZysF9Cq89l4C7Jj_ji2e9%KWIO)rCu87_$we)umKOk6SBdpJoofIG+553!@!mZ2 z?aY4e`%EwY?M9O#@Z(tmxB}3YbZ`M+Z64T90;hrQj{h|~n2fGb;BXRf|VR$k#$;M1& M07*qoM6N<$f}L5%5C8xG literal 0 HcmV?d00001 diff --git a/e107_images/icons/icon24.png b/e107_images/icons/icon24.png new file mode 100644 index 0000000000000000000000000000000000000000..ab02795f05337eae042c0e6e0bd5630860c4546a GIT binary patch literal 1358 zcmV-U1+n^xP)mxaf=j^!onU=JD$A_1f(HvDfc>!N*XtiA}jwB~3bj zfP$~Kw@$e|w8#PV(RktP^~>P$)8z8e=lsFq|D?|RYOmT`ta3w=Q!`3JTe>?)!7YT- zSMT}o-01Vc+wZK<@2l1Pu-E*HveJO1&WgU^VzXl~c1crKR#?13O1Fh)%evI>;_~(T z%HHm~+48v7^t06Rn7-e8q`s2H@{7Q>RI5}aSwD7mc!-~uQK~{|h%AhWu&T}OfTg>V z!0MaL{DQxcLYzvGk(1=)=u(knyCenYgOkJD^1IyntkLs~t;CbQ;F!nqq|Wro=l{vy z@^8CtFNQ?0u(QqD*mtCfUXxLW!hX*0#rFU0l(fo`xYL}<^Qg}8!QT4f^Z&ox(_6Ju zA!R&eW@os}!*Zm8SfOBs#evQ6!TkUB>hk-Yy3wrFu|}&%g@uUV;N+{rxoxC552vxShiwQaoSUW~_D4?)OBWM6t-diOZAe`2Sg`VL7QEL8v`sd~|%Pi@E2#e7K1{tt3&pK0I_) zZmN0e{^p;_t3a+SV$4CbwzD+r9>D>_X;f1H00GuXL_t(IjkVD` zXj5Sr#_{K06R0NVBn5A2QbkZul7dU4$DxQI6h!D&U7U&q#UUUaERHRL3SC_4Wh#hZ zK}CdsgBL_ z-sN@%&(FZ0J+6VXkPeB;StYd zGTs2ZNlFIK?4xUyQ1@FI*@bs7xCOjV0hmtkF!06cCppA~gyfB$0?0-)fk-9>#UOm!4ZKRJI_iBs3vjv?EjcpT z%3OWj=NIDOn2wQ&fmH3&xpEC?uzI#~uwt7#05*NRDX9*08~{nhVAbaP-m4LK4%D8; z#&k?lY69|AzwVf`D`KYuKaYA~QP Q(*OVf07*qoM6N<$f)TvcEdT%j literal 0 HcmV?d00001 diff --git a/e107_images/icons/icon25.png b/e107_images/icons/icon25.png new file mode 100644 index 0000000000000000000000000000000000000000..ed73992acf0c5009ec26c7948245fe3c497dc1dd GIT binary patch literal 1403 zcmV->1%&#EP)Fu0^hj=zJ zWiBpgU}CYcvzK*uvnB)mb_(Tj7ls@TXA`NFP(RJyC?$x zvoZhWQ2*RlfjTt7Dg^)HP5tg(!b%{ag@~hec)}$Do^^NP9)4Hj*gLYb8~2DYGq|-YHDnPf`q51s?4mf(oik`tup_d7|&57 zgo1&EgoAy3er;`RR8&+$LPA|!T%Mkxq+Va*x0ci1t@hSk(MTbSi;R|(lB%etuCTJJ zvbdzGubG^kk&uowH8oX9Nvx!&$j;vE^u_<}V%JI@fq{XzwzR><%fr>=%i{9X>;Ks8 z|FOiiD9!$%cuIyurb*UtiI!u(GnX&(6-s-}KSy|K9cgroq`ICnv_jz{}n5#^wLg z?El*I|Bsml@&AXV zz=ec`+u7H=-v77U|FPNsuGs&$-2cVn|DeO=f`^SvN=e}1S0l|9psRg|(KFjygFxxVXF2)Yp-?`KsFgbEWBmiI{zR zc9D^i&C0~Z(eHq+`_1P6y5awg!2V->uc)P;K0iO>;MuRi?SQKJ$LRlzx%^#vyr`$8 zWo2W^%FVRG=6;~_OdwO@w%EOzi-g=bac9Z6E zk?L@cHs;FXst_b8art%#0L#PxPUaGuz|hNU@O)NTncDjRF21sA zFaeB*l|QWU#>|cb0K<2xz}Vg7gLKYpNm9gdV@<&5lXpIN0sL5t&P$TDEYvwsfLy=VApRIbcPvm3VgGOa;W_H?oZ`?#+Iz zfSwEF!z&?>DAjoli=Vo`j+Ex6`~*BH0z#%hK0Mpp2={Zz3K#_DTYd$lh82Z09ofai zYVd8M0&eo?ytlM|Dn;b&2A)o;0`?zjgOs%gSA(m;X|b1?>D$u*kTj{2FRoi3VL4@6_kukv;?{$cvaO3l z%+2A}1D|U&ix>r5V6Im6Xezn@KWhO|Zi-hE2nV288wjw#+8>N1uPySXw9^0p002ov JPDHLkV1i@#5?lZP literal 0 HcmV?d00001 diff --git a/e107_images/icons/icon26.png b/e107_images/icons/icon26.png new file mode 100644 index 0000000000000000000000000000000000000000..cfa279899283f12b03f67916945bcc8b5682a49c GIT binary patch literal 864 zcmd6k>q}Ds7{*U&5MmU4$h3kH80!WR-5@D%GesV&DBW9~( za`J05wrO{GMn=Y)n_q|4e|2;X;f{b6^{O?C5{a~~u3=?0G&`$>AUGKO8Bc8ExZM|s ziNbcKJ)*snbnaZ9?0iAdE5^4Ic7;+6 z&{qy9II6p9UD^>EyRU5L(}u5|ZzmeQmFAY@Pp4WqO#M4<3Y!Smj-267WY(tFn!1h( n?%zG$U8a8-NGm8iCiuP!_;Qp}&$72SQwabjgOxv)`{2c2qfSTX literal 0 HcmV?d00001 diff --git a/e107_images/icons/icon3.png b/e107_images/icons/icon3.png new file mode 100644 index 0000000000000000000000000000000000000000..68a6ef5e20f8d1c47fa481fb65f0cd618d2ba0a8 GIT binary patch literal 774 zcmV+h1Nr=kP)1c> zpc@yQ7!#Nk5|tAXk`WM(4-JeE4~q~Gh6@UcJ3O~8Deg%wqiv8o?9|y%7z$4-2&j1+NGOxe5u34-dFgRNFl&M#`7hKMI zFfFwW2$e}m?C9&8f0^jDCK8{_E=BH!#2%5SvU*^6~ZGyuZIYH~pfX|Ig2Lb#-H7WB;e8 z{w5`=8yU^5u=4Qqz+PYHf`9+Kz5o0BP*hYwMn?Yj_Wx~d;xRC#Pfzdc@ZiA1!a_d& zw6g!--*0twWN>i&z`*`pT(K%B)3vzr@AJZ7VdaH_|H#Sj=H~6@=Kq$K<5N+tRaWoo z@8Q3~!$Uy+z`p<2*Z+@>xHdG^v9!csVC9gE|IEz)w6)}Wc(hVe<;%|h*w+8e%)dZA z-MzraXldw|lj)zDy;)l5&(gg%HM%k}|NHlEX(WMP z>_CCv2!Tnze*Jp?^XCkh86Dq&fa%AN9}}U5euD#uK+#t?s09mvr8r44P_q)Z5$P0Az^f5 z=;-S$g*E`5Bmk%`0HrVhq%Q!JBOF>J-QD2=kr)8X9s$E00KXgnydVI;B>=4;OKDFG zgc?!rNtOI>W9>^6+a3Ve5&+W~FJd@@sfjqFKfC#=(*Lkp`APum1^~MfZ+>;4yQd|6 zHYk-i5Re`Kq7wvy6x7t$@$&VTv7i8>6DwjhMU7SkqZo>ikLm305{@Vib06vH?X}6j zH(o`Jteh97D@bQj?e6g%bv6-LB{P6aAeAtkouGe*gClq}7^5z0dUDd)+9s7dBbYZw zn^$JqZ$83MJ!MU2jC_LDio*ZFhv$zoj!bWpgFS&+y!O6Fm|s$SYU1YTzRAiZk3uhW zOuop-b(E1CM>OK&=c3vCNdN!<0d!JMQvg8b*k%9#010qNS#tmY9>D+r9>D>_X;f1H z003%9L_t(2kz-;2g7}0)1{h!h5r6*ti9-=s`s>%P$S5QMhF>5MiX`w84EzxS+kb$8 z2V4N8XE#s{ih$+8U%wCnr+_vy96JgZ(AWR__b-yQ8oz!6fgW5y0b=V>D2^6~NY z=;-Uw(bT!QyuH1^*4EnV>+i0%v^I1=HBv&4kCCpfvCz=d>FMn0>FtoIltY#-O~fn# zku4rlHFtP=tE;Wl)Yt9p@#^aCl((2hu_0&DElRyA0Fx^Knk@=oEPsE2wY9j}+1>E) z^vJ}>Q+h*O&n;ZXC|Job37IVbk}LsvERt1wmDT9NBs;aEb&Cs@kg~|#G{{R4tLlT7iimCs9e(gzU z(lK4mEfkk0v0nrKXaKc95_4*6v$M9*007Jg0&#vtg#K@X^h;yZGeEH+d58(`asdBe z0RL+Mq&*nd1_u8jA^l8F&jEDuiOa< z|3gFneSQCNasOFb?HC?wA`!NS4FA#q|JDHiy8!>50RMgfvq>4hzrw>)RQQL7|AB%3 zXlVasW%pB5hfGt|kx&2i0sq?o|Fr=BoB*3-N8R1w@a*u$eSha+VgGM$(?mptZgAq_ z=I`t7?V@`7x(5Hf0PlzintpEH-r~-enX^SksGp+ku9@0^DzK%an!71?00001bW%=J z06^y0W&i*H32;bRa{vGy!2kdr!2!c*R8s%|0C7n~K~yM_V`M-BjMxNbGBQ?v`o%DZ zk+JO4FGhxLMr1INk)amBdn6Ae81fiV0Yk!bDO7=w&kTGB?jA-4S9C3A=mMIz)sVRN zfDU7nMex5q20L8@F7O!Q7q)+#5dORWP|vYJHT;MB7R>(*VgUea9~g3}kn)270000< KMNUMnLSTa6tyd-h literal 0 HcmV?d00001 diff --git a/e107_images/icons/icon6.png b/e107_images/icons/icon6.png new file mode 100644 index 0000000000000000000000000000000000000000..f45e0a0e5f0dcd920bdef034803488d14857a92c GIT binary patch literal 755 zcmVl&kUr|+1P3`RPcX)ViaCN%5yU57PsHm;GyS}fhvQj`bv9Yx7 z?(&FtP`12P8*8y2PJts)fg)X+T48H*W@|k-L#3mpigGvd)E@o$Gh49PM4bOeqWLkH z^G#iB$jQrXVqAe-Exnc)|J)w`@+$rFB$39gZL|M*y!}e9@kU^0$;i#1ay#3r2mi|o z|K%V5>?{B9F8}i(sL`B(!T*fO|4+BtNMl!uV_W}#J^!>6|J@7!=pp~`FaPl?|MMTN z)R>3G|BTH4OtYk9a$dK~}49slw!|M^${^-ccsBBaruiN*hf(Cj*x zQmd=1=H=;pYir|uK>wB_{*n^?f(reG5C6|Q|Nn{q|Bm_gOOnd8i^%_7%Zf>GNb&LY zi)35$f;az{AOD^V{-Oi^oB{ob0R4v&{>fth`it)Meu~NFXwIrUg*(g3&##%J(S>XH zlpg=20RO1~|EB=|p8)@i0RMp#|GYWb<%wa$vQLmy$jZx%ki3(9$*FsazkgxTf=kK~yM_UC1E{gJ2kd;r9h$VX!6`?H*tk@B%BV=A|X8Wz_?i zy`5Pw3=W@u?R zIyz$=9jpKV&j0}A007ef0OJ4v?EnDP005{4222eOg@lLXZiH8nQW)Ymf<6deEn#{vTP6&1-SC_^YHTQxQ7 zWMuzoY41lzaSso<1O%o70~;V9dwhOg5)zyM0OJ7x>Hq-!1O(s?4(CBZ|7U0aZEe3( zQxGmLR3ak90s=D<5=~N5sUsx%4Gs7i8U7Fu{{aF24GsT2J^x={!cR{eEG$1WGsO`R zUMec0q^IEEJ3l{ZXln8C_3P{JqobzE z%g*NJ>SFNGO8@`>0d!JMQvg8b*k%9#010qNS#tmY9>D+r9>D>_X;f1H004DKL_t(2 zkz-_lflZ8zjFHLxj9|_RMkpxh1qsYyM1V-3KtB?nF_p1_5d{Ff~xm;W#UAYf)>{LS_Y fNq~{@A2bvI#u60QSa4-w00000NkvXXu0mjf!&Wkb literal 0 HcmV?d00001 diff --git a/e107_images/icons/icon8.png b/e107_images/icons/icon8.png new file mode 100644 index 0000000000000000000000000000000000000000..9bd2feed5c5493da5f961d2227b87df56fc4e653 GIT binary patch literal 870 zcmV-s1DX7ZP)$kVMi;InWdwqO-evgll zzP`ch>+iL-xJye-5)u*}4FE3}045Ru2m%5hA0T02W5mSBmzS9p6%|G(2C8KZ(1j1i zgCNX?9lmuHWI7281OPEHF|o0gw)`i;gcE0o;cG!=7Wt$Jfo%<-fnf%F4^t+2gR6YsZTv_@M#+r2%6+10EhDM@LG2 zQ2_p{0KKJl*x&oZ!^i3A=<@RN(9h7Msj|e#$=Red|FHnRdI1Xw36GDHDk&|eb_M^# z0N11yudT4p(b((j>b$(Xq@<(l?e6{m|INXl^{@uqn*bym3w(TlCnYMdhYR<@3c#;< zm6e&Mrm35oo1dSb#Kgqn;^P1R|LN`e)3Q(5q5v%;5qo=oGBZ4)f*t+M3BkFOx4Org znwrDI%Fxi$yu7>E*x2sx_QuKBz^!P{q!A<^7mJIJUS4HqSS$V95Z}#3!o|$T#=+3f zzreq^W_tXoik184(CbqV@tE;XdA0f=UNB{hI$j7C?y_DJ4bjikw zu&%GVxsl)Aga7?(_TDs1MJ`QERO#vLQc_q?OhD@Dsr~)F_4K^||HAU`w${|D`1iX1 z|H%ITw1s|FA|ff$($zmdMo>^k$;g}i`_cdZ?EnAp|Nrj)|K8i$uXuN5Bqc4Fn4Hqm z)>v3wDk>#yXhfi!WUs1isHJO!e^x&}F+4m$tgNqOWNAY}K|eeD+r9>D>_X;f1H003G^L_t(2kz-_FV6dLT z2nOL-fE-2!hNFxyuxJ8EU3&T`JHh#BPw9|KnsD7sQkT*I%p~w8RU_9 w&))(4B8(*P2;?~iPB{M^*tb9e3Vs0D0DiR-$)F8t8~^|S07*qoM6N<$g6hw%i2wiq literal 0 HcmV?d00001 diff --git a/e107_images/icons/icon9.png b/e107_images/icons/icon9.png new file mode 100644 index 0000000000000000000000000000000000000000..8431229a027db61b31455d11f7f66c0587816d14 GIT binary patch literal 905 zcmV;419tq0P)b#HLGy1ky7mW@#iYf(eKe@MTA0C6x1qh$xy zkO1JF0NRiMxN8A$F$<(^1EzWiz`wzxi;UTS0sqhd|K&FS=Xv_(mHpy||JqOgxC`r! z09-B-$H&Ul($$${7X07}{Ofz_y~X< z@X-MM?QZDh{NLj8dS(bx9y)T95o4uV7lnwp*B+1;&q6#wuf^X1&_ z^#9e)(7UX$=H~9@=I`3s;?vdS*xK*^%U98S0A5Z_&A7V9oCg2wRPyfo@bmoc?D3|M zl7M-7!Nttu+|2==h)!&_|TQ@l>lQ!FY)p9-`Cr?k`VvqJoxSK{r~^i%gmsLhPte;+Pc8! z;_Bez?B3-1{>gUYi2!$GUbV2ZZdDui;R*lYsp#PFyr`(;+}!Tj-saQU;_m+K+SvcS zDyLlqWnN&OW+#D655JoL{NOL<#^ZEbo^#1AO_w3>2{li@7kN}i51B^2U zU{6ZcrziZ(8`OXR@U;N{#V`KYmHFt_`Re5M=->9%ul=$~{hk5hg#hx70_kl7Xi`nF zZb1^37-|II!4#Wnh>5&xF}{$ys@)GnZ)D(0004WQchCSVYtkQ1QZ!qj(kEExTMGOfe{59Mi*ej6o4A> zUI;=LuzZ9tn4uDX(Y2Ien(+~pzlvpt6^Z}@3&SULfh!6~{Hs6#hA+qpfCB930>6N+ fVSoS@Mz&u7N^Tkv;xGau00000NkvXXu0mjfEROXX literal 0 HcmV?d00001 diff --git a/e107_images/index.html b/e107_images/index.html new file mode 100644 index 000000000..e69de29bb diff --git a/e107_images/logo.png b/e107_images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ef92a6e989a8bbbc3a2ce1045a4260e7610c7fa7 GIT binary patch literal 4100 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 V8qwf9H)H?+002ovPDHLkV1l{9o^JpE literal 0 HcmV?d00001 diff --git a/e107_images/logo_template_large.png b/e107_images/logo_template_large.png new file mode 100644 index 0000000000000000000000000000000000000000..8b573f74f1329b729a7ec208837714faa5ee556e GIT binary patch literal 7132 zcmaKRc{J2t`2Twr%!G`c#%?UhzP2!SMiSZgY^Ab>vJJ+TL}+YD8MMffknGDK31vd| zZDb$CWF7m@=llEjd%ow~<=lJj^PJ~A&+GL%_uQLkcHNNq%(*iF05BV2^vq9Z+!%cU3*U_sHe7xHULznG9J3povs;zj7;@KUxndD@SE@MsUisFCmS^+g(VA-T$d1lz|EdtbBixMlUgqSPA1@j?ZESOPNpkgH z%yTJh#&4$cgW6^c6t9!B8?k!CFfz+ZKnb_#qv#pzTdU@>YPX~nk*<|uHOWd{Kn+1{ zMg{6nFUeWAMmv1g_XK`Te0%>q*59v!r9I?#NCX;7%?R6_BJl8KlErS`zCho zUF4MxLhEz+F~*OruN0@!3rH%lO=?22I6%h6;kBdvXU9#J2vx@szwEHsI-;LwXmo=H zlrXYQ847gpsr-c88BG!h0Z#r58m$ffOP{n!Z`p45Lg!NVMtpnJ1}Br`npSqE4lsi3 zX3VgV+OX2k&DD3CWtYyENPR;}pZfeA8ZBs<&nt9r&%r^ZVs5RZgjSX9tM*-M@x=MI8<8PI~18Yuu^xBN|pv=va>-@b{{9vLkQo zqk)h(hV}5T=_xn_8*ps!wWvB2;5uX@4| zeey1Rud}xK!9bqG^SPH7X2UGyCey?3o5FB5JV7IK(?|rn7CmtWJNVb};784FAqj1v zRF(9k<{E{$gueBaN5;@!dbBkQ&7o$ddn#hd-T5Ez@9@*>$w1L*sx@587X70h3mXwP zm8Wc1F6>6k*7qMzH=#GHy)@6J0MUqil9!Xfq?6eS4l8i*2p;u3FO=)RRHkhhxRa5CEr z8Umq!!?O-+l$z;#YH}N}IZpM5*3Yu9TXdg5qGY-;0XxF9rgDp-l+?Pr)3Xn6>{ysK z{m$dtsj|8JL)mzP!@N%71Gt1gJgO%kq`&kcvy`P7c3 zZ~B#R(Mzh@`aIjAKQm9kG#K9&Ym-PwU0n|&8m&D`$lEnh-`GplygWdtR0S&;Z*dq4 zfrePg=@R5IAxK`L@9lk#WGJrHsjGQ%XJYNIexB<~d)9C{{IphnZJN4)vS5tq)W?qz z$b*d}ziqBmb72sxW{=o!25gxoeZl2?D_~h&Vq>{O?lj0$20~!bOaJ)V$PzGa##it>;Mvwer3?FebS1V3< zSAC%wG|U1Q0w9(TCl<6u?vBVd9b3sH90vsrUG@{AUNI5}q5tEUqM7D&*kJ7RkJszEgggW>tX&v20={HY=(?i7Cdu{ma_ zFQj_`AC;S=My(7ppzwwLyz8tDm~PD1X>x__KP&J>p{hA6~!K z1!1`+QoPx*!@ef@`o+b8jgr&&Sf;@fFXrT+^(MB0YH&>ukr?4?+x^B2#& zrK-))aJ6SLQZ^EI7{w+@c;hsd+NV|%fx=CFMLY$v=o9f^ttEF2IMZS4-_Vfy_Y3m& z(=G>9n4%BD79s%&R_qP-Ib-x}* ztZ(uf<|U29b8HcnembhJy-(^X1w*3Nn^UMF=7;am@##H_Cf121?kfhkvu$dnp3?lq zH_ki`@T*&MzG*gUYRQD~=-)V>r9GeQ)dg{#+L3VJd{uQ<5l~wyr zUC^yV>ul@rCz*ewJSgH0&l;tR`OQhq`vRdy7dCZ|m}`ipyy*Nn9CbeEAo-_Qj~Y4r z=EDST9+QfMiQ0!zvhiN_J84|>J#%?XysztTk#3x64}7ipl}En)@f%i)5rB|UHEo(r zF@08@EL=;d#IXo}G({2^(2a(IH-)tF0~v(ghs#{KotXaOiBm#yZhZ)*OMcB*uBmh8 z(=RBspIrg?lwsG3Yk_RRX&{hoSN;Pgjqn`#4#QyC*REwFtM5ho9%MWEf0E-f;fJO@ zh5%1-W#Vo*D&s4bDrw2$;v-9uZ^aQ@?rjT7)ydlO9#?s3SEcp$FKXjH6$;^qBwJs> zg6=LC*yT$?pwLK)+!+I5&`M0;erUe`V3x|KWP2+&UR8TeXrN^3s)A#qC0(yFqFFPed&4K#A;n`am?HQr0Q%S>skj`cGVa2na*m`_|F-aEUNA0x_^yn*8KT z%`*OsGpxAgpzk)OWY1BDDc4;W9yxDSz=WV}rGMNQ5)b5mURbUISEpUmab3O?L5~2a zti0ChPy{W*6-r+$@6ux!fphJktw{we_$@~<39G9cm%frUuDz-z& z^V~Xrx8OSu*xJ-7b?M6~ww2@`-MtfH;RYrqz;3W=kv-cBCaS?aAYJhb6C|hW;1VcC z%QD<{WH2Iw@wp|7=gWZ4AGt7bF8_d3PvVc)k_XJ5$2L7+8V{(W(_4Y@QKLkgCs>Nz zbXgJ{lKvhhL{*wi=BLOxqIsnSnnc*B8n4}j;CtYV7^L2LM9jUmvZLzs@~y$9OW6%t z&SkB=#}Xl>5)a+z(tC(S>v67&Ar|U5R;{q)BtX@Mr9jK}B5#@Z%)@w8{?&^60n)?J zZ{NDRb~hpxlG({BV1=trROgJuZV?`)A@OI&heXdl;ZT676Gprw1%5A|^_A zQ#F;dDF(6v>yg#E_(G!@`1FUkqQ8fzl?kL7Wx2}N2(XeT0+fxYIrj|G&-tC9iuW*n z(FHig*~_~jAnE(h{6M((9}kROXAHiMrmgXMyK^3NLyX z&!8JB)XxxePm#kZ#a>P{qTs*Kv0VM_7KtJU8?l**nfW(?o#Q4!VBxFULRz~Wq<^<6 z#!Ra5_rU1OTAG$c{cKvp1chG1JG}$G8q4bvSxX;v*$_W1v!U0@=hYYlL#nR)PE(2) zRIqlvdk)t{Sz+#^+}|5kR;4B$r;`VNmBO$=I(z-13Q%%j$`b&r>3+dil!FbIGkmK% z=>;Aq6}_LXbn-U)85bn(u~9Pg*NE*E@}Q=<6ZI~I^{+%*ZChbl4>2_b2sq%yb#04s zaM-Yzse8*}a1uBeG~1CSVAj@T5m+Bd`#vgl@Y0i)n_92JMu>AJhKwiyx7iaQ&}ewdiK-4PIRh-37b|!V#5Dqt@f3w5J1K=&&@LG z$NU-aJ`T(c^VwYYlCqR@Oi+pOsk=gyW1?B!G@?HB;EYZc2=#$#C7jZCm{9PuF7kqU zyb!~6w>LjgF6#VNkRf`#{FS==_7i~c?WMTyo$WncbMbWkrZIgO7&W6>TreT#7 zH&K>G2br8pZK+e2vB$6hXkL}aM9&)Oqz^wVGW}WN-n}sKQ6e)kqc6WvW1Y&`PQRJ> z1ds|5Z){Dm0UXNA5SMk!l!~6CwD#VG#B}z=t=Efd^_LjgM<_@W%J0+Tsl3pNr{#qr zr{WqH{wE(wjIXzZ7_r%2kBUU)%YLVWo1sw^4-UM4p!*7_QE^tp6`~QCU`#!)%Z4SI z#Q4p@cx3dGr0#*AFNjLUBzSNz$x3svjmGq0`*y_-^F~4P7plT?DZaYXn;>)pFpt1W z6K3x-CF%Mt9{1Z>Les#C0O>JTpZ7H z`~?^EExyjp1<5+Y+(c=jR`9~BmS#Ui4rA>E9Yf7 z)e>Ha;HrcdeFapWqvSa%Kh%a7j__LRgrT!Y9yho~$-xFd$;dLyC5r_FE0N@jFF5x& z6NW5|m4IuBqD5d3AlM)B`2QC_R|>EFy3cK&ovxP?Zst~w0bCxd9F>3x zhxE>}++>Ss6ix4di^@y0ZIR)QZAk`}C8WUL_Lat_lzVr7L2SjN6q%*0*@O&mJZ)VY zK4L17sj@$fGoY~GUmg&#Ge!meUX^$Nqz_(;Mwx%}d#as+O4L{{egW zN})9FR#SMY)f#z9N{o|IVJ#2Y0nb29+>s$GQSHtqsHE8fjHGUrr@+;xq{okd zs^bwR?8Mbfh8q3cCr02$sWt{+XnxKRhbT=trV}6b(&riwMjo#W#TBI^&ku&`=4M^9 zK4pDdpgtJ6rM(*OO^(5lPBxj*#^lOH;Z@;+R0LKJm1nE!=d)<7@C6t-M+>SFYBF?H zS4UN3Hl5K1JD62Uu?c;VWxDg>4A%ZElR_^YZCMoFqJMz%^Agx_=y?GZ)Ifw7ZyPEI z6fHx|ggzIj6N4u7k)3v_NT&)(xF4`uY7BNjiQGh0tgKi%CEtDm!e+HVu+y7SY?@r# z3FOjk#bWR2-;<3QKPCdomko8Fk?+_YmHBi3typ@x&(-?~Y6(Xaj-s@LWHfR*p@esN zKIda2y>*__Vd-1c+Z&R(SWqwv|j%f+I;>1C%9JVldkry?X~ji zqO>@?EFN(6IbTDGA*lqy(QA481Vx7iHF!&2R1J9O*}&!lyzCfRuEfc3tjXn4_hLYC zt#PGheB&L5<5#p|lK?wH0~O;rLV`jHu+DyD~Sjel8$sVJ8V& zyY=Qnv2Q2x@cdQVkr@tMWVmf>%TohVkj2qHD>NC7vG>+SBuZx6MX+I~ zmbjl@;t^|}l3tM=!wl3(R~N9MgJDW9ha&E2A#JW#0@EWWQIgf|h+TKEu zBh?v)EUn18;tr5I+HDL$#3iM?!7?bwP{gHX=H=>s zbzz#+sxsYoQ;b|Q>fm;6Fmvy{)w93HVk(&_m@`@5;I*-<*!goetu}d}KNGg3xxrX6~)XK3pXTwjtGnrqmX3K~$(A~Q5 zE9G9Srj+sF4=(o#jUX922oG>Q(~O@@UZAo8MMfhkq^R{ZGBihCnzR?o=_{*hiYB~e zO~qo0Bx<=+D#l=@lBM5(yi?HBcA4^YwScSri$AxISE&R2Su>wc@s4RYxMa%ivq;~70qJCW69!)dlK?tQLHCZ>+l+;7(l0 z6E*jC&W(5*f3V6>6>rXk&ZrVS}bo8ng6G@c!s|#F5t?3W+Iw zI#e0NykZ5>bR-c-7y(cnU4k$?oQeFXcIRzQ z3qy&~P8M*YG6liQ;aQMaSE@FP|3TGs{^v*e4+g)zW|4y2 zbce`fhTpY&(eoj5I=|S1(Zr!q_r_6e30tILhVJtZ-+w#ouMJm)7EkVs&Acm~v|nb% zj8=EsU-a3Vwp)32lzgN9Kd*w@pSJfY_!>JqjRU(Ezl>71F#mfS4?g6^J+|+A5_0p| R>0caRq<>wnT*oEm{{iqVleho? literal 0 HcmV?d00001 diff --git a/e107_images/newspost_images/index.html b/e107_images/newspost_images/index.html new file mode 100644 index 000000000..e69de29bb diff --git a/e107_images/newspost_images/welcome.png b/e107_images/newspost_images/welcome.png new file mode 100644 index 0000000000000000000000000000000000000000..f32c74e4265e46b5914fcab5a9f31b254f9e2b06 GIT binary patch literal 6612 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 literal 0 HcmV?d00001 diff --git a/e107_images/pcmag.png b/e107_images/pcmag.png new file mode 100644 index 0000000000000000000000000000000000000000..1dbb9cf4e035bdff2aabd30a0cdaddc3477da7fb GIT binary patch literal 3751 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 O0{V|kbQ-muC;lHTPz{9u literal 0 HcmV?d00001 diff --git a/e107_images/rate/box.png b/e107_images/rate/box.png new file mode 100644 index 0000000000000000000000000000000000000000..d7f28a88ff5643fa587c0ffbaf0e843314d168fa GIT binary patch literal 284 zcmeAS@N?(olHy`uVBq!ia0vp^{6NgZ!2~3Y6bd#2DVB6cUq=Rpjs4tz5?O(K_7YED zSN6-?0-{`Usk_AP0);pWJR*x37`O#Nn6W-3ej-p%r^Gd)#JMOnu_QA;Paz~THG=(cyE~#uaVKco%4+QTgfLg=bq8u1@XtOYyOmxV)X6 zzw5;fseru|PgbyL^}e|!c5Ra!KUZGF%V<0PC01K1=lb82Ip3sNF~R*`ib9ft<}=1^ WPQQ0~-_rv5pTX1B&t;ucLK6TjbzKDj literal 0 HcmV?d00001 diff --git a/e107_images/rate/box/box1.png b/e107_images/rate/box/box1.png new file mode 100644 index 0000000000000000000000000000000000000000..822d65ca881cdcf2f4df378d702945cac462eaf3 GIT binary patch literal 582 zcmV-M0=fN(P)WdKukZXhurO<{Q;GB7YTATlsIG&MRjFd!{3FfcH|2n^)_000McNliru z)dc|)E(?6l0;B){010qNS#tmY9>D+r9>D>_X;f1H000DMK}|sb0I`n?{9y$E005Iv zOjJex0RLQej$L<?YqDXxdaut+v>b1Vu!k?tgVoLa8=x zU~azroSS)=hny3Daa0tgX(+9As(b8l#-F~K2!PR@o3nGSnMnsJF^wAQu5@x$i_@%07*qoM6N<$g62#UnE(I) literal 0 HcmV?d00001 diff --git a/e107_images/rate/box/box10.png b/e107_images/rate/box/box10.png new file mode 100644 index 0000000000000000000000000000000000000000..81a9c681bc950c5d42908378e0e06c33e80c3c7b GIT binary patch literal 1068 zcmV+{1k?M8P)WdKukZXhurO<{Q;GB7YTATlsIG&wpjI3O)BFfcG|k*xLr000McNliru z)dc|)F%s4Pr1}5=010qNS#tmY9>D+r9>D>_X;f1H000DMK}|sb0I`n?{9y$E009M1 zOjJex0RPyaG}oXt-J>()t1$n`I@y>J`L;Fx>xTdAi2v+^>CJ5a=8OO0fcv;L@3A)j z)kgo-OaIwY-K-z~zBK>AJO9Q>|I1AMy+Z%LHu<+W`M5m#zDfMRO#8x9`@~!P%4FTE zOaI?&{?BjsxIO>fVgKQC|Ll?a(|!N*r2qA-|L&UOz)JtWKgAd;jNZ|Nnyj|BV0tlmGvt|NpB0|FZx8yZ`^h|Nqnf z|MCC-`~Uy{|NeIW|C;~*eE}(Hk^0PU;jg8o6_C6vvDB{)5FLj$<$OMgabV z`5gR50rn2yWRrA1fbB`jn2?K5M|AJ<(zZE{?Vk?@XG6!ix^}_awF7&=ah&0B`27qs z7(o0S)4$<){+7Gt?u0wQw(Sf1hizZtLg?iqDCoE%N|My;bxuzOLE!s+Yk-}Br@`5I zA6)Te&;<@hPcfa&MX%EXq_hG>NfMz*qA21fin$2Ks6eZ5$`oDyhHnC+)oOQ4eEdzr zFgxS|D3H^y6Y!0pm0&@7I5k>TX^k$?^btVQZ(}Y3g$}CKstlD-lWVnNyVPWbBcR{%Hw6oLU9AlO0000IqP)WdKukZXhurO<{Q;GB7YTATlsIG&VXiHy|xAFfcGF_kiyJ000McNliru z)dc|)E-2oqbJhR=010qNS#tmY9>D+r9>D>_X;f1H000DMK}|sb0I`n?{9y$E005Iv zOjJex0RLQej$L<?YqL_t(|+Rc^gQiCuMMi*EOG;Oq{RxP#=u!soM_kTJ!P^!&7 zzmm`Hum2?_YjiI&n%X_@%?H+Lb*KuG+$t%{%CHS zP)NYr;dnT@%rK$z!rCII)8kqcC?w!@zt6JFjgg(^B1x25#K{#D67aP9!!yCe%hm&h z1egcnam)l0>rJ{%Q#zbpfWdKukZXhurO<{Q;GB7YTATlsIG&VXkIUp@CFfcH`r}8xb000McNliru z)dc|)E<0KmG6(D+r9>D>_X;f1H000DMK}|sb0I`n?{9y$E005Iv zOjJex0RLQej$L<?Yqh()}oAnm)$PQGCu~k`U;UGN-g5#49W<2-2UN-;KlQ1 z2FeI9cf|dW5nep3(@mPv>GTwo5uleVU#lgJfh$Bj17!pRw=;MVs@VS{^qlAwEoea* n0T2Y?nJ5UUSb;NcLWdKukZXhurO<{Q;GB7YTATlsIG&edhI3O)BFfcH3Se!)w000McNliru z)dc|)FB5jTtFr(A010qNS#tmY9>D+r9>D>_X;f1H000DMK}|sb0I`n?{9y$E005Iv zOjJex0RLQej$L<?Yqlv17Y>j;Vn zh@Eq_`=w@xb?0a1G}ex%RzwVUy?`OoxoAZMeC9+$X~r}R@%2x4Ez0t(d@pG|!4TC) zeK{6I1ibDK`-9H}L+IQ(XLFi2?AD@)fS27a%QD{sTg?$kqSPWz&Y*~Z$L$}U2!?px z%s>$V=8m`@GQtoK>vWT*G%h^_MFi;O%GYX1J-`w13=|O%+|FQ#P{saZq4!14YC#){ o2!J36&qP5;b-lnDHxdGV083-G?WcR2C;$Ke07*qoM6N<$f@+u>-2eap literal 0 HcmV?d00001 diff --git a/e107_images/rate/box/box5.png b/e107_images/rate/box/box5.png new file mode 100644 index 0000000000000000000000000000000000000000..f0152df58f4ed31917a623b331238b6837f834b1 GIT binary patch literal 598 zcmV-c0;&CpP)WdKukZXhurO<{Q;GB7YTATlsIG&edjHy|xAFfcI2HS5s;000McNliru z)dc|)FD$^{hK>LL010qNS#tmY9>D+r9>D>_X;f1H000DMK}|sb0I`n?{9y$E005Iv zOjJex0RLQej$L<?YqCb{&nBOLeOU}G?HdagAiZ;bJwCQKgwe%^96*cPW5dc zMhJS}ANB{I353wObORoLpgqpy%x$UIc`A-OONw zAoCzR4jDm+r**nXQ#n7qgb{-Da^-8alraDi@eD=?3hrkhM5to_)5wF9ceap)5rQZP k!Yfe_N&y7VxC03K0UO`Cx?TO^2><{907*qoM6N<$g7Cr_`2YX_ literal 0 HcmV?d00001 diff --git a/e107_images/rate/box/box6.png b/e107_images/rate/box/box6.png new file mode 100644 index 0000000000000000000000000000000000000000..2ddc1d1560731c3d873d3865e56e9f0f3ade97d6 GIT binary patch literal 619 zcmV-x0+juUP)WdKukZXhurO<{Q;GB7YTATlsIG&edmG$1W7FfcIv82D8H000McNliru z)dc|)Fa$U-AnE`B010qNS#tmY9>D+r9>D>_X;f1H000DMK}|sb0I`n?{9y$E005Iv zOjJex0RLQej$L<?Yq+lnPp>P>e{8H4fO*&+P)BHK*caj41}(B49)sAw(nW z+Jg)Mq1L+8f0S;qW<(m>HKoQ`f2tXxyXzHh5#J$FGX#94L`7BgRk_7CBXXC!nmqr= zk2$Sp+@fGaKFjOI$Pn8aBAXG&5TKUCQ&&B1v0_Bl@g|O`VSFxR2$1uI9g8{5j%h?V0vQ6l z#}RJfGa@3iUk|-NdU!M1kRbp(&%Y3OK8+~^j(E6Tz%RZTzD*&C$T0u_002ovPDHLk FV1j3;AD{pL literal 0 HcmV?d00001 diff --git a/e107_images/rate/box/box7.png b/e107_images/rate/box/box7.png new file mode 100644 index 0000000000000000000000000000000000000000..3fff1ec6207c8e12fe8aaedacde9426ef0f96444 GIT binary patch literal 618 zcmV-w0+s!VP)WdKukZXhurO<{Q;GB7YTATlsIG&njjG9WE5FfcIdiI^Aw000McNliru z)dc|)Fc-XzVKe{$010qNS#tmY9>D+r9>D>_X;f1H000DMK}|sb0I`n?{9y$E005Iv zOjJex0RLQej$L<?Yqj0w8`3nPd$*x-o!`ep?{mmkYxp6BI=Km>wFtCVV$ zI|q;#5L#<1`%5JdYeA%SHBxGl4POl}`mPrUM0|xv!wdLKiJGP!rWS}VK}6CuFN(L~ zy`b}iK$L>WM|If*c>%Bc!~WoAL?E;vl4jOsDOKq2EJI$v%Wjt>iQ7F}J(Gwcr50gy z26+LG+dn)J0`V+}Y$hNtz}yk{{R{}igCMewH*ri2;?p26KrdHrt(LTVW)k59WdKukZXhurO<{Q;GB7YTATlsIG&njlG9WE5FfcHwte<57000McNliru z)dc|)Fe!cSe4hXS010qNS#tmY9>D+r9>D>_X;f1H000DMK}|sb0I`n?{9y$E005Iv zOjJex0RLQej$L<?Yq)RFpeQ~NzMNw1}93u3HbV7(u zm~#Xj0g=|a*1yyoV&f6%Os|Zp<>OcDh@tBh93o+ew2pw!jA&?@aT*Ts}AW+pg<^oV4+)_F#qhC9#E5%99#r)g^Tz)sF3;#i1f z6kk9`z~k-@PXvc}_K0jP&=H{Si2GqiIK+cTWRq-@geoQHK}UdGt<74mXb;RKA`5f` z1h*C(V&M@Hk@-2%8>OeYqzfGZ5Cn@0VX&Yzk3fqXTfh$^rN!rNKUgyW0000WdKukZXhurO<{Q;GB7YTATlsIG&njmIUp@CFfcHoZo-BD000McNliru z)dc|)F#sk;)v^Ep010qNS#tmY9>D+r9>D>_X;f1H000DMK}|sb0I`n?{9y$E0050p zOjJex0RLQej$L<3#^CqH;rVfhowd;Dw9n^t zi=x%&^wQz)+2!p_WqppR!jY@PQEGukUv`V5x`&{*i=ef{+U>j3>h%2l_V)Jr`~0rJ z(cbX?+U@<~^8To~%KiQR`1tq4*zD{5{=d%Qv9hx8^7Mw8s=3G2eSG+300001bW%=J z06^y0W&i*I1xZ9fRCwCWm0?eVFcd`}Pz&o;=Q^hjH`?MDBC!Ae^L#C1I{eo75>8(W zImu1#hb9H+dx0Y)E+M5%dI})}A}wp#i2DQR?WMX{YpW3wkpx6K&Uwe(Ilv$_#?gih8WQmp5c%8HmgPrzD)GERBC3GMxxVkp z;Qeqs9NmnN2oVq|v@yEClK!hTgSY)Y&vUmuJ24xPWt=b4>;{A9-7j7c67d=k*-l^} zACa}60TS^P5ZS1$QrJ;lhk;nG+*&PhduAij2@Il#2_zy8i15_CR(NUgt}Zh7Zb1~q hHvzK`K zy0TwomJk*+bnum#4-{e!@Ck7R(#xxCZviRBk|4ie28U-i(tsS!0*}aI1_pHj5N4c` z87K)9)G2X|C~+=IO)SaG&r=A=%uQto$tYDYGEwkNEK)EsFfdgxw6robw=y^TypgtZ?7sn8Z%gG4}j6j|)1LF!)$K^m4gQu&X%Q~loCIG)UFF^nR literal 0 HcmV?d00001 diff --git a/e107_images/rate/dark/2.png b/e107_images/rate/dark/2.png new file mode 100644 index 0000000000000000000000000000000000000000..a437a6bc1b3da0e0141b7e2f36ef67522fa4f0ff GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^EI`c9!3-q7yqMPyq;yJLBTAf$QWHxu^Yau!GILWI zLNZDfj7$`K6N?m#3=B*a3@xn;EvyWT6m$)M;KnTNBS3xZC7!;n>{pp3goU_nWiP7$ z3UL;AL>4nJs0)BF4=Lh?@;8#@rJUQj!#S7?^J| Vh`Dt3xd4?gc)I$ztaD0e0sw@GJwE^d literal 0 HcmV?d00001 diff --git a/e107_images/rate/dark/3.png b/e107_images/rate/dark/3.png new file mode 100644 index 0000000000000000000000000000000000000000..6b6f383fd60a2482d4affaec656ee81c8caa628a GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ?NMQ zuIyKtC4_|}G%sB@01CMV_=LCuX)hM0$EC)~3=H?1f|u#b;Ko8tCVC81lezOG27&9tQ*<<0ca3oNswPKgTu2M zX+REVfk$L91B1E%2s2K}43q>4>Xf)flsFfqCYEI8=P86_=B6@)WRxlxnJD-s7AY7R z7?>&;T3Q)e0Fi>O0T66(C=mhb)AV$443P*=PGn#f`!mHrSy_3)uV$y()CVkqJUsU; j6}0{*FPx!x#omoU$&}Og*wS+$Kurvuu6{1-oD!M?NMQ zuIyKtC4`04=WqGN3lwS(@Ck7R(q1e~k4ufG+6(hDFeo!H+;0m0|GsyBvg$H@nSU?) z|9|Yr;pX_bIpY7LTzLkDOGOs{Z#YOXFdR-*{C`o(f|>D9k<8BvI{&Ze0^O6M$oXoe z&Hr!d|6iBVzp{(qhM@AI_(Unj3pk~t7$ztzQTle6(^JN;dL=7tOm zoD2*XA|tASPGKww@(X5gcy=QV$l)yTh%9DcP!|AU#wnSBl0ZS764!_l=c3falFa-( zg^eLX1tS9kQw2jyD?7ft_Kz)2@(c`@iY)%$aQJ`9>i<yrP^%Kkqs`TwMF zzPZx>+nN9Wcm4l5^WW!b|G!TD|7qs`56f36$s7o>-|Awv$=P_do&GLA^Dnn2|Nnc* zkb&X$jDr9F-*YlBYz=Yv|Nl#kq{yFFckCD$-)&m6%Fr-S>dtkb#~4e3{DK)Ap4~_T zaySb-B8wRq)CEA8aY|;OBv4SN#5JPCxhOTUBr`uxAtW<5l_4afRKdtZ!8fr;!N|bC zRKd{F%Fx2f#7sfg00>shXVeAibMka?43P*=PHA8gRdtiN+$wmkq{;ZLn>|sbiVUeJ+L7a9{IGg=_L`3}RDR@|85^!~jiW@O1Ta JS?83{1OVqnvTFbU literal 0 HcmV?d00001 diff --git a/e107_images/rate/dark/6.png b/e107_images/rate/dark/6.png new file mode 100644 index 0000000000000000000000000000000000000000..84ba3b75d7c37da98a4e169573dcc774cb6bc4be GIT binary patch literal 553 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CP!3-py+uy4OQY`6?zK#qG8~eHcB(ehe>?NMQ zuIyKtC4`09_a1!R!oa{N72p%%3Y797UM z-S`-n>C60k+5i7z$Nh;GQIaebdfcD4`sZ+SeB2!I|55J$N7+BNIQ=>5`~P8{JOjg} zB8&ew9R8oO`hV5&|3&-%r!Axy7!Ic@{=X>o|A@fF@G0|8jfs|G$_1|2uhWQ?Vff!|fRb z|Np=L|L4}EFdI$=hOHqE|Nnpa^Yom*vSf{<$e&kt9_?N!!Nh3C$oOv4n)TJCz%X28 zXc!_by~O@>3p^r=85q1*DICY$}pDU@|4S?aam2jS5v)6zBXGU>2E}BC+H_RfB`X p%)`w`5?KxR6+2oee3Mt;Wym&XJD&V0eLc`%22WQ%mvv4FO#sad;c@@~ literal 0 HcmV?d00001 diff --git a/e107_images/rate/dark/7.png b/e107_images/rate/dark/7.png new file mode 100644 index 0000000000000000000000000000000000000000..25f421f182e0ef781803d69eae920495a096d390 GIT binary patch literal 629 zcmV-*0*d{KP)ZzRjlW|hECK)p002e~0oIU1|L~NiFC6~qkN@$A-;p?483cGP3-h&4|NWQl zy>)C02=TL6|Ke@`;%oS{Lj1)||KV=`<7~o#LLUGC(sDTe*g*fvI{(!{|It7H%Q*hg zMsz?Z!(}1=(Hj565dXvy|Hlpe$0Tzz7&rp~!g3t>&@BJdE&tIk|Isl2*DdbADhdDq zWFZOasXYJoXaDPT|K@i8<#hk#asTCY|L1l8@Nu6vBLCZI|Nn~r^_l+jmjCsW|MHpt z@TdRpr2q1i|MZpq@|UV29KcdPwL~_uLo=&BFS<@Q^xKpF{nG#b$=b4WkUlP#LNYM` z0Na>w|Nrm*{MwRMJP7~*wNya=|MdLj&QBv5d>It{>fGYHsTcwQJ^=ylvaGLrbprqZ zsxdKC8ylFv-LwDz00DGTPE!Ct=GbNc000SaNLh0L04ERt04ERulxa~J0000ibVXQn zLvm$dbZKvHAXI5>WdKxYbs#b{AWdO%ATls8H6SrLIx#sqF*G18FfcGMm?Cvv0001B zNkl5u>Mh~JSoS{Vd* zE(`OuPyhXw?!9#_4G3%t2=TL6|Ke@`;%oS{Lj1)||KV=`<7~o#LI?l=9{>Q-ayb9k zK>x}*|J6bN(LevoIR4Q_bU-M>Wg-938vn!)|HKmi#|{0*By%$uI0FH~avb^4EdSIk z|Isi1(J=qlE$+Z7h)WX;000UA0AwKv>Zv^c_Gka=bpPgd|K)W5|V8lET1j?1bC5nRmqId=LNt*_I57YK+n8|w|L_0&+LBg0 z2><}KR6zg#^!(+{Pa_$885I2L+~T{b7yWdKxY zbs#b{AWdO%ATls8H6SrLIx#sqGC3eEFfcGMcX|_j0001RNklS_kPqZD_96*nfdm*Qf(2q2Q2+yjAG&}ej0F>5U@(WU{xiV@ z7+AHTDo#OdQHL3D5h@@HH}V!lKo~CY1T4S_Vt(cWk?+6)Al4s{*+3cqSh){r%Ve&n P00000NkvXXu0mjf>8>4A literal 0 HcmV?d00001 diff --git a/e107_images/rate/dark/9.png b/e107_images/rate/dark/9.png new file mode 100644 index 0000000000000000000000000000000000000000..d359ffe667ea67c7cb5049e931f244a2a1a81bc8 GIT binary patch literal 701 zcmV;u0z&5u>Mh~JSoS{Vd* zE(`OuPyhXw?!9#_4G3%t2=TL6|Ke@`;%oS{Lj1)||KV=`<7~o#LI?l=9{>Q-ayb9k zK>x}*|J6bN(LevoIR4Q_bU-M>Wg-938vn!)|HKmi#|{0*By%$uI0FH~avb^4EdSIk z|Isi1(J=qlE$+Z7h)WX;000UA0AwKv>Zv^c_Gka=bpPgd|K)W5|V8lEG!TLpEn}^+iCy*ivRVQ{_~dq^^^bdng8&o|L>&#@|6GdmHzUV|M-{x|AXDK zSv(jJsv;b~Qa`msHnKxAt3EHfPB--1lmGqF|NhC^vU89=E|)?wlR`9+M>w5NJvR>w zF#rJDm~j99@BjSTl2$wk006aAK>z>r{N>J1BN==d6#VMk;=8FB0s%e&0q(M_uX}Z> zF)>sd8^Z2assI200d!JMQvg8b*k%9#010qNS#tmYClCMtClCRYX;B#f001m>MObu0 za%Ew3X>V>IRB3Hx090soATl%{O<{5%GB7YTATc>QF*!OkHy|xAFfcITDq*Jp004DK zL_t(2kz-_l0!MqsdI*aVCREGF*!crhsFIP9u?0n_1SrDTfg+R-5@PIu3dJ*`0R{$t zOd&@Y3qoxIn`I6W`p*O;4?vA))rP7%1-DThX3RynkSyHjTQDJExX=@*5GRQ9nGZz1 jg9?Gze?YbX=^qRL2TKv$%7YJK00000NkvXXu0mjf)%Yfi literal 0 HcmV?d00001 diff --git a/e107_images/rate/dark/lev1.png b/e107_images/rate/dark/lev1.png new file mode 100644 index 0000000000000000000000000000000000000000..050a5732dad2647959020e6bd6e61b6017026132 GIT binary patch literal 563 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$3?vg*uel1OSkfJR9T^xl_H+M9WCilsOFVsD z*{?E72(TEv*)E#Fz`!UQ;1l8sl;UGxa2My4<7Q@LU;vt+BgCdF#4gRqur0=LLyf(i zBqvZm7bAnOn&5$nKKYgkEDQ`ChVs82w_TX)9k0nUI%jV7T6@{r{}y|I-@(PpSVqr9CZHRg{sT+JW!=Zq5G})c>E= z_;*3$)=D)$EiN}XzCG<0zn^FQdsFlOW$pjxb^o8&{(o8X?_KrB+ll=-+KNIPo7{D7 z&xyJ*C*|7Aq*q63{(jo@>+Q;0TZ&H1NIEe$`Ow7RNL?9iZcaTRJ{_!@p!&%@FS_AM{F@uBpm0J}Y7Pq4r~I`fGm6LY_yxGhFh31~PcM`njxgN@xNAJm!REIUoc80EjUk`s0Ssol9RS3w1mc-nL!x z&weo!3_=D3?Xgq;-C+B~N&U=E{@r21i$oOw0M~^p|II1?%P9ZKC;rMSmR%(k0RVeI z4)41u|IjD@%_#oRDB7tePAUo*0RToG4!nmr`{!!@?0o;}egEfv|L1-G>3sg~d%lZ4 z#f>`g+hLDvDco8g^0NBvsoJ!1$e3cwTR7&VUfrK%$em-t zkyBYM94iY6E)otb5DYXB44Pd+_UOy!*Rf|lDkl&ONEj1KAQ?Or5hM@|B@zx42L@Im z8tBZv$Euhh4GAs=1<#$8nRIFf000XB0FpgBP$neys^0LB<+IuJk%l@56Fe@iJs!u6KfWTOEQ`9c=Ye4fq0~1=VjgJw~4Z0000P literal 0 HcmV?d00001 diff --git a/e107_images/rate/dark/lev2.png b/e107_images/rate/dark/lev2.png new file mode 100644 index 0000000000000000000000000000000000000000..f0ff12e7cb5c43093a440f2152a2a414c29755a6 GIT binary patch literal 616 zcmeAS@N?(olHy`uVBq!ia0vp^qCm{U!3-pK39x+!QY`6?zK#qG8~eHcB(ehe>?NMQ zuIyKtB?MTM+t^KKF)%P%1o(uw0;TvE7~I7<<+zy{85n>j=m@dt3b9KwGHi=6+)!h0 zC&>xa&&9~#t0s70qEEi10t*8}hoSth$88tpddF*Wm)eNj+ZOxje4U{Pj}sfq+l|5h z?E= z_;*3$)=D)$EiMU01~)mrJ?$31pJ)AhQ}h32?f>U>|DV_Xe_8YIUG=_hyQ95UA8#l2 z=V&VmacpwexjiT9#+;OEGm~B&srmb9)33KHZ*3_$F(c`8w8gU}ad+pZo|v0_Xku`r zu8cM}r=Ad>jsTB|0MD#gr*AJ#Kfk^)-A+qgfX72Z*jqu;MpRHmfLB$BPlTNZPk}Ng`25tt1Nw(GjYAWBJv@ZaL9b-w5UoeBivm0qZ4rhT! zWHAGSx&R0>PRR_E1PbbuxJHyX7o{eaWaj57gkXZG?QO5kC8Xq_Zw<+dPMYFWcViC!~a)uuL< zn?kJiKSc_@zW8#AN#=`3H>*S1yG%icC0^X+e&#Erq^|G(YSv$-6&)IK-27MfhDu*Q z;TH*^p`lMdux^^S_p0&1zssErR-Fuzmp>pJy-Azj=*hK6pv?@Pu6{1-oD!M!REIUoc80EjUk`s0Ssol9RS3w1mc-nL!x z&weo!3_=D3?Xgq;-C+B~N&U=E{@r21i$oOw0M~^p|II1?%P9ZKC;rMSmR%(k0RVeI z4)41u|IjD@%_#oRDB7tePAUo*0RToG4!nmr`{!!@?0o;}egEfv|L1-G>3sg~d%lZ4 z#f>`g+hLDvDco8g^0NBvsoJ!1$e3cwTR7&VUfrK%$em-t zkyBYM94iY6E)otb5DYXB44Pd+_UOy!*Rf|lDkl&ONEj1KAQ?Or5hM@|B@zx42L@Im z8tBZv$Euhh4GAs=1<#$8nRIFf000XB0FpgBP$ney7hy zO{-A~jrU|GQ7D9Wuc^M|{K*J#&?8MO05Wq=69Gi3G~v$Ajo%23+y8v;RtJ@>Dyq{j z&R1dc-kus@fK^phmE#=9y7yWy1do1(U{aH%K4*Xz_oP5uM5y^|00000NkvXXu0mjf DW2@n~ literal 0 HcmV?d00001 diff --git a/e107_images/rate/dark/lev4.png b/e107_images/rate/dark/lev4.png new file mode 100644 index 0000000000000000000000000000000000000000..6b76caeda51578791221ed950ee9c43fce0cb315 GIT binary patch literal 618 zcmeAS@N?(olHy`uVBq!ia0vp^>OjoH!3-p?iG_RuQY`6?zK#qG8~eHcB(ehe>?NMQ zuIyKtB?MR)gVRgu7#J8W0(?STfl_=74DRBba@@>}3=BXMbcEP+h1jJT8Meh3Zm6-h zljH>I=VD~=RTDfg(I?+hfrWvg!%+U$wf~>h{C`^G|0(rv!og8Kin z8vib6+*+yTr^O|~$lxZ&x2N6W_w%fOZ)*O(to{GI?*H@J|1WF)y{q2WZFjWS>f`Oi z{v2&ZA&yP%I=AOU-I$YdZD!J|BQ<|NZTj_g<*hA6CuSs_j<$HVB<}9~)Dv@)4^0e? z)RocZ=F}77(-Gh?5#X5>>-6o#>F3usrrT+$3-EYI2zx6?+K39O2=J;3@rkgrg(*qB zIJ58gsu>EroO*1m=jTqHS(3%Zz`)JGFv-?BKuzV_llBF`uwyI<@(X5gcy=QV$l)yT zh%5%ig#ZXMPRR_E1PbbuxJHyX7o{eaWaj57gkfLP1;sDE4i>%BI?OG1! zm%MIdEDH?{^^;Zjef0YmzYlR29Sv5W471NYApRgVbh+U=O<|zj44$rjF6*2UngB;f B+aCY` literal 0 HcmV?d00001 diff --git a/e107_images/rate/dark/lev5.png b/e107_images/rate/dark/lev5.png new file mode 100644 index 0000000000000000000000000000000000000000..fcbae98dd619943482dd927f9340d8e06939d338 GIT binary patch literal 618 zcmV-w0+s!VP)!REIUoc80EjUk`s0Ssol9RS3w1mc-nL!x z&weo!3_=D3?Xgq;-C+B~N&U=E{@r21i$oOw0M~^p|II1?%P9ZKC;rMSmR%(k0RVeI z4)41u|IjD@%_#oRDB7tePAUo*0RToG4!nmr`{!!@?0o;}egEfv|L1-G>3sg~d%lZ4 z#f>`g+hLDvDco8g^0NBvsoJ!1$e3cwTR7&VUfrK%$em-t zkyBYM94iY6E)otb5DYXB44Pd+_UOy!*Rf|lDkl&ONEj1KAQ?Or5hM@|B@zx42L@Im z8tBZv$Euhh4GAs=1<#$8nRIFf000XB0FpgBP$ney762W0IjtvMFbE{r3f$nZ`nd<%)P;@!REIUoc80EjUk`s0Ssol9RS3w1mc-nL!x z&weo!3_=D3?Xgq;-C+B~N&U=E{@r21i$oOw0M~^p|II1?%P9ZKC;rMSmR%(k0RVeI z4)41u|IjD@%_#oRDB7tePAUo*0RToG4!nmr`{!!@?0o;}egEfv|L1-G>3sg~d%lZ4 z#f>`g+hLDvDco8g^0NBvsoJ!1$e3cwTR7&VUfrK%$em-t zkyBYM94iY6E)otb5DYXB44Pd+_UOy!*Rf|lDkl&ONEj1KAQ?Or5hM@|B@zx42L@Im z8tBZv$Euhh4GAs=1<#$8nRIFf000XB0FpgBP$neyeRlvKm^OevVkfqp00000NkvXXu0mjf DB`4kD literal 0 HcmV?d00001 diff --git a/e107_images/rate/dark/lev7.png b/e107_images/rate/dark/lev7.png new file mode 100644 index 0000000000000000000000000000000000000000..76788b92e9437801a01d86e72b9e959217034ffa GIT binary patch literal 617 zcmV-v0+#)WP)!REIUoc80EjUk`s0Ssol9RS3w1mc-nL!x z&weo!3_=D3?Xgq;-C+B~N&U=E{@r21i$oOw0M~^p|II1?%P9ZKC;rMSmR%(k0RVeI z4)41u|IjD@%_#oRDB7tePAUo*0RToG4!nmr`{!!@?0o;}egEfv|L1-G>3sg~d%lZ4 z#f>`g+hLDvDco8g^0NBvsoJ!1$e3cwTR7&VUfrK%$em-t zkyBYM94iY6E)otb5DYXB44Pd+_UOy!*Rf|lDkl&ONEj1KAQ?Or5hM@|B@zx42L@Im z8tBZv$Euhh4GAs=1<#$8nRIFf000XB0FpgBP$neytZf-F+LckFXQ9w|H zhQ%N$Fx*kQRR{!{{iB|0F#??QOdBhJ%skRY0Ff$fc<{IRe}u+kJn?NMQ zuIyKtB?OpME$z%T85kHX0(?STfl_=74DRBba@@>}3=BXMbcEP+h1jJT8Meh3Zm6-h zljH>I=VD~=RTDfg(I?+hfrWvg!%+U$wf~>h{C`^G|0(rv!og8Kin z8vib6+*+yTr^O|~$lxZ&x2N6W_w%fOZ)*O(to{GI?*H@J|1WF)y{q2WZFjWS>f`Oi z{v2&ZA&yP%I=AOU-I$YdZD!J|BQ<|NZTj_g<*hA6CuSs_j<$HVB<}9~)Dv@)4^0e? z)RocZ=F}77(-Gh?5#X5>>-6o#>F3usrrT+$3-EYI2zx6?+K39O2=J;3@rkgrg(*qB zIJ58gsu>EroO*1m=jTqHS(3%Zz`)JGFv-?BKuzV_llBF`uwyI<@(X5gcy=QV$l)yT zh%9DcP!|AU#wnSBl0ZS764!_l=c3falFa-(g^eLX1tS9kQw2ja zD+41dpop#k5O8d6-VfAQ;OXKRVsU!yg@uAlfdVWS^YRQWoDK-`208?^wAnT*Jn(bd@4}%>ekkuiZXQ% zqs4tTtX{RMD3j?X|4#4sEbkq4Il@eDzFN-ygQ;0;)%8m&G;RXzX7F_Nb6Mw<&;$Ug CK-}p7 literal 0 HcmV?d00001 diff --git a/e107_images/rate/dark/lev9.png b/e107_images/rate/dark/lev9.png new file mode 100644 index 0000000000000000000000000000000000000000..5488d97fd24d106d4e6754a5e983a4c4fff9277f GIT binary patch literal 618 zcmV-w0+s!VP)!REIUoc80EjUk`s0Ssol9RS3w1mc-nL!x z&weo!3_=D3?Xgq;-C+B~N&U=E{@r21i$oOw0M~^p|II1?%P9ZKC;rMSmR%(k0RVeI z4)41u|IjD@%_#oRDB7tePAUo*0RToG4!nmr`{!!@?0o;}egEfv|L1-G>3sg~d%lZ4 z#f>`g+hLDvDco8g^0NBvsoJ!1$e3cwTR7&VUfrK%$em-t zkyBYM94iY6E)otb5DYXB44Pd+_UOy!*Rf|lDkl&ONEj1KAQ?Or5hM@|B@zx42L@Im z8tBZv$Euhh4GAs=1<#$8nRIFf000XB0FpgBP$ney&@BJdE&tIk|Isl2*DdbADu_!H3;+NM003km3F@gl|MqA9>vaF-cK_vc|KxH1 z<#qq(b^q{j|Lk71gDfl%0-rY`|J!N*|BC<}KR6zg#^!(+{Pa_$885I2L+~T{b7y|P-h(}o%e={%u0F$*9;~c0&EC2ui07*qoM6N<$f(ykL AIRF3v literal 0 HcmV?d00001 diff --git a/e107_images/rate/lite/1.png b/e107_images/rate/lite/1.png new file mode 100644 index 0000000000000000000000000000000000000000..257de3a2e343b1b48f95c4403239cd18dc6a3a0b GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^Oh7Ea!3-q1%i`LA6id3JuOkD)#(wTUiL5|Adx@v7 zEBjSu31Klsq204=fI`dxJ|V78UVZwv`RoTEm$4+sFPOpM*^M+HhqJ&VvY3HET>yj` zr(_070tIzSTq8=Hi&7IyGV}8kLNaqx8A38j6^u+2d=rZlj0_A+6$~w{jEt-dEfjPO qfWWSy=?+jIkEe@ch{WaO1O;9o&wzokI$IiKBZH@_pUXO@geCxuqB5EQ literal 0 HcmV?d00001 diff --git a/e107_images/rate/lite/2.png b/e107_images/rate/lite/2.png new file mode 100644 index 0000000000000000000000000000000000000000..df9eb7b718c2daaa3031a4350120b469f95fdf59 GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^EI=&4!3-qXGV~6D1kxRS9T^xl_H+M9WCilsOFVsD z*{?E72#Xm_W4-+dC?p!-6XN>h)u+RI54XAKZtyVqe>?L|Sm3qHaGT1H_kju+OM?7@ z862M7NCR>>3p^r=85qB4!OcwWaaSV~ToSblgQ9@E8LUN{~i7_)L0|PS` V1OM8cB8)&K44$rjF6*2UngGwUKC}P; literal 0 HcmV?d00001 diff --git a/e107_images/rate/lite/3.png b/e107_images/rate/lite/3.png new file mode 100644 index 0000000000000000000000000000000000000000..654a48639a45916edbbde54b4aa531ff7d464c43 GIT binary patch literal 311 zcmeAS@N?(olHy`uVBq!ia0vp^Y(Ol)!3-ps=KlKwq*&4&eH|GXHuiJ>Nn{1`*-Jcq zUD>ZPO9+dz-(0KL02J~L@Ck8!^6JyIGnb140#3GdJ}x!Bz4yrDwy<*%ZWoG*ukJoH zv#Gr^Ec{4`+~K{4+gx;Ct+e_7Eq#NB$^YA#|NnRW|2p$dSm3qH@C)%lXX68I-FGen z8p~J``j+Y_k9W literal 0 HcmV?d00001 diff --git a/e107_images/rate/lite/4.png b/e107_images/rate/lite/4.png new file mode 100644 index 0000000000000000000000000000000000000000..95fc0f19a8628c666bcfc9b127ad1ac3638743cd GIT binary patch literal 393 zcmeAS@N?(olHy`uVBq!ia0vp^96&6+lWm=kOO2;HiiUgn-rjrUaa-8` z_r3d*RnJAZ{d?K}|6|96qT-L6BmO_iy}J9*^$OenHyma*wI9n={eMxaGc5c_iQLZ% zI{&Ze9^QMn%|-XsN}K=R(*M6M`TwkJgNMog+nN9Wcm4l5^WW!b|G!SY6Bc+aGyFn) z(AoHa6VZOhqMR=*UiskeQ;!+3-9Wc7mIV0)GdMiEkp|>&7I;J!Gcc$NfH32f%s@$? zpiYTvM2T}zYGO%dex5=|W^O7&NJgoGk%@wDVv&N8fq|)lp{13Pv6Z2Tg02A&h&^ha z2GnQn>Eak75uTjbz$7+@r*_7bdIjfZK@NwWcm+0PqsN@hEG{jL4_h^+9Q+`z-ps7_ gm3P)hjji({oTzb#-~khKb{KGnYXX zS4vIL*4^8^#N&om|L={zV5u>Mh~JSoW+f2Na&z&sSpVW}|Ke-- zv_jRp!q<2`|JXqP$~ynmL79Sw#%U%0(Hj565dXvyiB?y{bRPN8EdSIk|Isi1(J;fk z!-hmH>Zv^c_Gka=bpPgd|K)W5Ra|Nn~r^_l+jmjCsW|MHpt@Tc5XQPyc! z&|gx`Ur@+fPR3e8^xKpF{nF5*soa@y|Nrmc-Q~zfFnbmhQ5w;M?QH zO-|r(vtIxJ00DGTPE!Ct=GbNc000SaNLh0L04ERt04ERulxa~J0000ibVXQnLvm$d zbZKvHAXI5>WdKxYbs#b{AWdO%ATls8H6SrLIx;glGC3eEFfcGM`MTw`0000#Nkl~E70000J%=P)hjji({oTzb#-~khKb{KGnYXX zS4vIL*4^8^#N&om|L={zV8vK>x}*|J6bN(LevoIGKWn#%U%0(Hj56 z5dXvy|Hlo9R#(Jy9{JEL|I{u2(J%keFvGpWhD0susXYJoXaDPT|K@i8<#hk#asTCY zut+rj+iCy*ivRVQ{_~dq^^^bdng8&o|L>&#@|4_GQPyc!&|gx`Ur@+fPR3e8^xKpF z{nG#b$=b4W(4(o`nQ{OB@BjSTms>&L-Q~zJXLpr}+T>R?X;=8GETwcqO zmhQ5wuzPi-rmW!GWdKxYbs#b{AWdO%ATls8H6SrLIx;gl zG&3MAFfcGMo29dS0000^NklP)hjji({oTzb#-~5lbFediQ{!M zmq8U*N=?w#-FstZwrMHby~N{&R{!sfzhfm%BqOl3yUotkbUiWFkVF6Ql+IX2{^^hZ z@rd7%IA$dfg*zGZwNL;3m+rlF&~kI}vsnM)ZU5qH__RX&#ZCX=ZvW$K!-7NAyTaFa zJ^$E1|H?Z5)j|K!KmW@({?SH%Of;E-hsJ3o|Ir%%#1Q|)692~y{l_GCI2?&qSHyH4 z`Oqx?)GhzfFaOan|JN<Zv^c_Gka=bpPgd|K)W5hXV{_>aHR#DbzSI}Ql&0kQ+TTaGW zL-gB||NYYc{>j?1bDvECEwM{R00001bW%=J06^y0 zW&i*H32;bRa{vG*5C8xt5CN2FQ5gUL04#JxSad^jWnpw_Z*Cw|X>DZyRA_Y|GBhAf zVR9fcFfcVBF*!OiG&(RcAT2O3Ffdz0txEs^0ANW(K~xx5h0MVTfG`k5(f>7qh|PGk z6Kk*n+pt%IAc7u}D4v|tK4uxoSv0PM!c$v56wI1cT}ykYiZJ;m!1iU#C#nEr;#DOw tlr}Bz`TvIk^p6B+RCnmouvHBJ;Re4i4lGiFq2mAm002ovPDHLkV1kdNMlJvV literal 0 HcmV?d00001 diff --git a/e107_images/rate/lite/8.png b/e107_images/rate/lite/8.png new file mode 100644 index 0000000000000000000000000000000000000000..16f78496123fa2025c0fc6f2869c76540a6499f1 GIT binary patch literal 725 zcmV;`0xJE9P)hjji({oTzb#-~5lbBpbMXa#4 z$%cvJbu*Vi6<114(AM31V`jE#DXCT}i;I!ly~N{&R{!sfzhfm%BqOl3yUotkbUiWF zkVF6Ql!;O}$j;TySVsQokN@$A-;p?GB@l%>8S}MI|NWQly>(+mLC|t@@v~U};%)!p zYxuN6{KZZG;coxqY{P;>g@A?CyTaFaJ^$E1|H?Z5)j|K!KmW@({?SH%Of=5Z+L?lf z#%U%0(Hj565dXvy|Hlpe$0T<+9By%S;^^>+R#(Jy9{JEL|I{u2(J%keF#p#r?!YRE zOcY5zLBqYnhD0susXYJoXaDPT|K@i8<#hk#asTCY|L1l8@Nxg_UbTZPut+rj+iCy* zivRVQ{_~dq^^^bdng8&o|L>&#@|6GdmHzUV|M-{x|AX9CQPyc!&|gx`Ur@+fPR3e8 z^xKpF{nG#b$=b4WpG`iqUQe!GQLAE8(4(o`nQ{OB@BjSTms>%;xxnDv<;Z7L|Nr#- z<<4(II^X2%zg}GY>fGYHsc>9g%aNAuvaGOsb)}}P;M?QHO-_JFN~a4FAOHXW0d!JM zQvg8b*k%9#010qNS#tmYClCMtClCRYX;B#f001m>MObu0a%Ew3X>V>IRB3Hx090so zATl%{O<{5%GB7YTATc>QGBi3dHXto9FfcGTWs!00F;HOjJeW>hjji({oTzb#-~5lbBpbMXa#4 z$%cvJbu*Vi6<114(AM31V`jE#DXCT}i;I!ly~N{&R{!sfzhfm%BqOl3yUotkbUiWF zkVF6Ql!;O}$j;TySVsQokN@$A-;p?GB@l%>8S}MI|NWQly>(+mLC|t@@v~U};%)!p zYxuN6{KZZG;coxqY{P;>g@A?CyTaFaJ^$E1|H?Z5)j|K!KmW@({?SH%Of=5Z+L?lf z#%U%0(Hj565dXvy|Hlpe$0T<+9By%S;^^>+R#(Jy9{JEL|I{u2(J%keF#p#r?!YRE zOcY5zLCn$E!@a|XL@ny6JpcA*|Lb)B=63((bpPaW|K)Z6=XL+^asTXIwSz20Djb%Y zpRhO+K?;Pp)23t722MXI6@2WYD9j+?jFz z|L_0&+Lv2FzPZ5Q-Q~zJXLptB&?7v=I{Oa7|yQy$oUdxe|?y{_~dv&Fz ztl-<@#Z69tNJ>$U+WdKxYbs#b{AWdO%ATls8H6SrLIx;jmGcq78FfcGM)yt}= z0001WNklU?G^QJVsOi zRP_N<=p&TL022f0c7d?|Gl8g05EHEss`f%{{02AZI0J?d16CohSprB-cnVSV9mM|1 oz`z4m237@R{e=VqBjYay0AXDeZp?9}1ONa407*qoM6N<$g0V|;b^rhX literal 0 HcmV?d00001 diff --git a/e107_images/rate/lite/lev1.png b/e107_images/rate/lite/lev1.png new file mode 100644 index 0000000000000000000000000000000000000000..70baaa915936bb0ebbb7762adc11f83af5c42e7d GIT binary patch literal 587 zcmV-R0<`^!P)hjyt*`IM{kA8a3)Z63f@z>em zu9%T~Vp+t=(A&n$-iBPdhDwZTT)Vr%&B@QIhI7rITAgW8#>~^>NaVa^^3Q&VZfW7?@7A55@3K|@-C+B~N&U=E{@r23jz_AivBI*r+KDg!%_;xO zDF4bQ{>m$yWGt_=y27)#vUo`Fyej|DC;!bT{?I7fswaJ0JfNYb;N|VNl7`BZM*HV# z{_K4J>3#p_e*fov|LJ`G?tAguVVHI`e{yTjWJ>6%XXUDL;-+x!$bkLwvij|*-nn+w zrEt}&an7A!gj!1B#>?Qy%ihMx*txsdorL%4%;?y%u7`Hey}#DR%Gb!t(aFx^=WdKxYbs#b{AWdO% zATls8H6SrIIxsLgFfbr3FfcGMx-4+)0000^NklC=US427uWBpalZz4tO{91C(w6KGP1M=?ljd Z{Q>Z94GA_sq|N{U002ovPDHLkV1g^3BsKs5 literal 0 HcmV?d00001 diff --git a/e107_images/rate/lite/lev10.png b/e107_images/rate/lite/lev10.png new file mode 100644 index 0000000000000000000000000000000000000000..8392ca931808ff7eb18d57247d12cd3c180ce9c7 GIT binary patch literal 636 zcmV-?0)zdDP)=yA{ndB?00B@?OjJeW>hjyt*`IM{kA8a3)Z63f@z>em zu9%T~Vp+t=(A&n$-iBPdhDwZTT)Vr%&B@QIhI7rITAgW8#>~^>NaVa^^3Q&VZfW7?@7A55@3K|@-C+B~N&U=E{@r23jz_AivBI*r+KDg!%_;xO zDF4bQ{>m$yWGt_=y27)#vUo`Fyej|DC;!bT{?I7fswaJ0JfNYbzpu353sg~d-2<0kyt3ijXs!mHGgtz&tyvIsb}S?a^j|N?#O`s z^0NBvsouGE)unLNt8vU*IOCyS&YfU{T1w%@%ize%-p0w;xx3h%g!k#p=-9HZhj!4t zzt+ae*Q=}1udmn0%hAcsNBQ@tKZ`S5!!q`}($DI=3As_rRWgnMr;K^5%%NlM1}G`be=A7m(+>T&CfWyA+a Whjyt*`IM{kA8a3)Z63f@z>em zu9%T~Vp+t=(A&n$-iBPdhDwZTT)Vr%&B@QIhI7rITAgW8#>~^>NaVa^^3Q&VZfW7?@7A55@3K|@-C+B~N&U=E{@r23jz_AivBI*r+KDg!%_;xO zDF4bQ{>m$yWGt_=y27)#vUo`Fyej|DC;!bT{?I7fswaJ0JfNYbzpu353sg~d-2<0kyt3ijXs!mHGgtz&tyvIsb}S?a^j|N?#O`s z^0NBvsouGE)unLNt8vU*IOCyS&YfU{T1w%@%ize%-p0w;xx3h%g!k#p=-9HZhj!4t zzt+ae*Q=}1udmn0%hAcsSWB`I3Mn=Yo49F}N5a$n&0~Up|K*Gr&4(o4Z7Go$Q0(^(k%#19bND*da&;v0T zz}z1&78B53HK>})NGzaBen2_MEJg+q45JwtAG0ug!y*hc1kCx(2DK5wVgLZK>l=6g SM|-aT0000hjyt*`IM{kA8a3)Z63f@z>em zu9%T~Vp+t=(A&n$-iBPdhDwZTT)Vr%&B@QIhI7rITAgW8#>~^>NaVa^^3Q&VZfW7?@7A55@3K|@-C+B~N&U=E{@r23jz_AivBI*r+KDg!%_;xO zDF4bQ{>m$yWGt_=y27)#vUo`Fyej|DC;!bT{?I7fswaJ0JfNYbzpu353sg~d-2<0kyt3ijXs!mHGgtz&tyvIsb}S?a^j|N?#O`s z^0NBvsouGE)unLNt8vU*IOCyS&YfU{T1w%@%ize%-p0w;xx3h%g!k#p=-9HZhj!4t zzt+ae*Q=}1udmn0%hAcs=E@wT2cdf@%0ZV;yNqaFtr{H%P5ERw*RhJ#b9~`wQ U*ovJ?nE(I)07*qoM6N<$f>aGZn*aa+ literal 0 HcmV?d00001 diff --git a/e107_images/rate/lite/lev4.png b/e107_images/rate/lite/lev4.png new file mode 100644 index 0000000000000000000000000000000000000000..17e844e74de73f9d668b9775d7083c6c74b9935e GIT binary patch literal 635 zcmV->0)+jEP)00B@?OjJeW>hjyt*`IM{kA8a3)Z63f@z>em zu9%T~Vp+t=(A&n$-iBPdhDwZTT)Vr%&B@QIhI7rITAgW8#>~^>NaVa^^3Q&VZfW7?@7A55@3K|@-C+B~N&U=E{@r23jz_AivBI*r+KDg!%_;xO zDF4bQ{>m$yWGt_=y27)#vUo`Fyej|DC;!bT{?I7fswaJ0JfNYbzpu353sg~d-2<0kyt3ijXs!mHGgtz&tyvIsb}S?a^j|N?#O`s z^0NBvsouGE)unLNt8vU*IOCyS&YfU{T1w%@%ize%-p0w;xx3h%g!k#p=-9HZhj!4t zzt+ae*Q=}1udmn0%hAcsn+aX-Pyu zR49>SWB`I3Mn=Yo41`!LAkH5k2P}%01yY&};;{ZE#9|C(M1b#jSj>zppJ<_!kwFi{ zU;uM};A1fX{iX)hcbNbS7y>__96~Hc1`(p1%E0)+jEP)hjyt*`IM{kA8a3)Z63f@z>em zu9%T~Vp+t=(A&n$-iBPdhDwZTT)Vr%&B@QIhI7rITAgW8#>~^>NaVa^^3Q&VZfW7?@7A55@3K|@-C+B~N&U=E{@r23jz_AivBI*r+KDg!%_;xO zDF4bQ{>m$yWGt_=y27)#vUo`Fyej|DC;!bT{?I7fswaJ0JfNYbzpu353sg~d-2<0kyt3ijXs!mHGgtz&tyvIsb}S?a^j|N?#O`s z^0NBvsouGE)unLNt8vU*IOCyS&YfU{T1w%@%ize%-p0w;xx3h%g!k#p=-9HZhj!4t zzt+ae*Q=}1udmn0%hAcso4?y4P1fgMA-Sre>YnK&ETiESt6(2bE}0Kb(s!{Q4pD5X?J|}o;tK*& VMwp7;$8P`t002ovPDHLkV1fZoLW%$Y literal 0 HcmV?d00001 diff --git a/e107_images/rate/lite/lev6.png b/e107_images/rate/lite/lev6.png new file mode 100644 index 0000000000000000000000000000000000000000..3890c0441625f93b5fd963fba59667c4c2ed6fcb GIT binary patch literal 636 zcmV-?0)zdDP)~MB2iH3Q00B@?OjJeW>hjyt*`IM{kA8a3)Z63f@z>em zu9%T~Vp+t=(A&n$-iBPdhDwZTT)Vr%&B@QIhI7rITAgW8#>~^>NaVa^^3Q&VZfW7?@7A55@3K|@-C+B~N&U=E{@r23jz_AivBI*r+KDg!%_;xO zDF4bQ{>m$yWGt_=y27)#vUo`Fyej|DC;!bT{?I7fswaJ0JfNYbzpu353sg~d-2<0kyt3ijXs!mHGgtz&tyvIsb}S?a^j|N?#O`s z^0NBvsouGE)unLNt8vU*IOCyS&YfU{T1w%@%ize%-p0w;xx3h%g!k#p=-9HZhj!4t zzt+ae*Q=}1udmn0%hAcspFYDq*v zR4C75WB`I3Mn=Yo4CJs_K%7574p@|A7D#(Ch{O7u92R3JBLaLUk;Tl&@@XKoGcxFb z7z|+U4^ml7!0=Opnsu2B7BJ+0Ksn^F7#T#!_BtcuV-|*Q6le!J9?bd81`QF?SPTGt WB~0)+jEP)}w8x^grC00B@?OjJeW>hjyt*`IM{kA8a3)Z63f@z>em zu9%T~Vp+t=(A&n$-iBPdhDwZTT)Vr%&B@QIhI7rITAgW8#>~^>NaVa^^3Q&VZfW7?@7A55@3K|@-C+B~N&U=E{@r23jz_AivBI*r+KDg!%_;xO zDF4bQ{>m$yWGt_=y27)#vUo`Fyej|DC;!bT{?I7fswaJ0JfNYbzpu353sg~d-2<0kyt3ijXs!mHGgtz&tyvIsb}S?a^j|N?#O`s z^0NBvsouGE)unLNt8vU*IOCyS&YfU{T1w%@%ize%-p0w;xx3h%g!k#p=-9HZhj!4t zzt+ae*Q=}1udmn0%hAcs;-?)7>JL#Zw)1?=U?N%{vS(r>Un5+c}CkFG3ND=w%7 VV_2U-ZoU8j002ovPDHLkV1gaSK287t literal 0 HcmV?d00001 diff --git a/e107_images/rate/lite/lev8.png b/e107_images/rate/lite/lev8.png new file mode 100644 index 0000000000000000000000000000000000000000..159124d0033a14a2fa8a2466068c821acd382f08 GIT binary patch literal 636 zcmV-?0)zdDP)}180|R^j00B@?OjJeW>hjyt*`IM{kA8a3)Z63f@z>em zu9%T~Vp+t=(A&n$-iBPdhDwZTT)Vr%&B@QIhI7rITAgW8#>~^>NaVa^^3Q&VZfW7?@7A55@3K|@-C+B~N&U=E{@r23jz_AivBI*r+KDg!%_;xO zDF4bQ{>m$yWGt_=y27)#vUo`Fyej|DC;!bT{?I7fswaJ0JfNYbzpu353sg~d-2<0kyt3ijXs!mHGgtz&tyvIsb}S?a^j|N?#O`s z^0NBvsouGE)unLNt8vU*IOCyS&YfU{T1w%@%ize%-p0w;xx3h%g!k#p=-9HZhj!4t zzt+ae*Q=}1udmn0%hAcs0G!LMqt$lakz`Q|elL!byszx{rO~^WqDF W@^QFzNQ1Ee0000< literal 0 HcmV?d00001 diff --git a/e107_images/rate/lite/lev9.png b/e107_images/rate/lite/lev9.png new file mode 100644 index 0000000000000000000000000000000000000000..e53165f10660e208f3fe9a0266dc29483e90e3fd GIT binary patch literal 638 zcmV-^0)hRBP)>UiEa)Ks00B@?OjJeW>hjyt*`IM{kA8a3)Z63f@z>em zu9%T~Vp+t=(A&n$-iBPdhDwZTT)Vr%&B@QIhI7rITAgW8#>~^>NaVa^^3Q&VZfW7?@7A55@3K|@-C+B~N&U=E{@r23jz_AivBI*r+KDg!%_;xO zDF4bQ{>m$yWGt_=y27)#vUo`Fyej|DC;!bT{?I7fswaJ0JfNYbzpu353sg~d-2<0kyt3ijXs!mHGgtz&tyvIsb}S?a^j|N?#O`s z^0NBvsouGE)unLNt8vU*IOCyS&YfU{T1w%@%ize%-p0w;xx3h%g!k#p=-9HZhj!4t zzt+ae*Q=}1udmn0%hAcs&2Ile`L` ztB_X#_pY8>Uf%r87S&{Z{xw{#s;IhWbrP1*^opxsA4^^`A9Qkk7wci+6q{FMc)Y;3k^DXCT}o0ypK&d%e8SO4#gzhfm)Cnd$j#pU4Oc|kPR zkVF6Ql#5e2;NalWTS)%tkN@$A-;p?HCJ}}_8S}MI|NWQly>)3xMBICL@v~U};%)!p zYxuN6{KZZG;coxqY{P;>l#Gn)%*@z$KL6N2|H?Z5)j|K!KmW@({?SH(O*Q7`=BSR2 z$7v=1(Hj565dXvy|Hlpe$0T?-9eaCw{r&xuUR=a<9{JEL|I{u2(J%keF#p#r?!YRE zOcYQ=MC9b;*v`(1M=$EBJpcA*|Lb)B=63((bpPaW|K)Z6=XL+^asTXIwSz23EFP$+ zsIp2m|J!N*|BCJaMm+iX`Nw2m{Oa7|yQz9)W80pd?y{_~e0I3C zwfXPw$WKp&OiaFXZSDX700DGTPE!Ct=GbNc000SaNLh0L03N{r03N{s!)a7g0001T zNklr&NJ)stgY zO;tTnRjN9JrE03$K~=s10CNKX%pDLweSuyF_)&dA;J2wZ0N0vo15i!10jSgo0DnzA hV66|7!hco6-Wx)S6mDc5P#XXM002ovPDHLkV1lD8ZOi}w literal 0 HcmV?d00001 diff --git a/e107_images/rate/star.png b/e107_images/rate/star.png new file mode 100644 index 0000000000000000000000000000000000000000..b7b90dbf84b29d8c70b704f8e1f995febb8b6e8d GIT binary patch literal 699 zcmV;s0!00ZP)FMc)Y;3k^DXCT}o0ypK&d%e8SO4#gzhfm)Cnd$j#pU4Oc|kPR zkVF6Ql#5e2;NalWTS)%tkN@$A-;p?HCJ}}_8S}MI|NWQly>)3xMBICL@v~U};%)!p zYxuN6{KZZG;coxqY{P;>l#Gn)%*@z$KL6N2|H?Z5)j|K!KmW@({?SH(O*Q7`=BSR2 z$7v=1(Hj565dXvy|Hlpe$0T?-9eaCw{r&xuUR=a<9{JEL|I{u2(J%keF#p#r?!YRE zOcYQ=MC9b;*v`(1M=$EBJpcA*|Lb)B=63((bpPaW|K)Z6=XL+^asTXIwSz23EFP$+ zsIp2m|J!N*|BCJaMm+iX`Nw2m{Oa7|yQz9)W80pd?y{_~e0I3C zwfXPw$WKp&OiaFXZSDX700DGTPE!Ct=GbNc000SaNLh0L03N{r03N{s!)a7g0001T zNklr&NJ)stgY zO;tTnRjN9JrE03$K~=s10CNKX%pDLweSuyF_)&dA;J2wZ0N0vo15i!10jSgo0DnzA hV66|7!hco6-Wx)S6mDc5P#XXM002ovPDHLkV1m5&ZPx$* literal 0 HcmV?d00001 diff --git a/e107_images/splash.jpg b/e107_images/splash.jpg new file mode 100644 index 0000000000000000000000000000000000000000..11f0198725b893d5bb8313e83fb243812a253470 GIT binary patch literal 24605 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 M0QlBcR*HZB*=5iElK=n! literal 0 HcmV?d00001 diff --git a/e107_images/thumb.php b/e107_images/thumb.php new file mode 100644 index 000000000..a7a10aced --- /dev/null +++ b/e107_images/thumb.php @@ -0,0 +1,63 @@ + + or + + eg + +*/ + +require_once("../class2.php"); +require_once(e_HANDLER."resize_handler.php"); + +// var 3. +// 1= newspost images/preview +// 2= + + if (e_QUERY){ + $tmp = explode("+",rawurldecode(e_QUERY)); + if(strpos($tmp[0], "/") === 0 || strpos($tmp[0], ":") >= 1){ + $source = $tmp[0]; + }else{ + $source = "../".str_replace("../","",$tmp[0]); + } + + + + + $newsize = $tmp[1]; + if(!file_exists(e_IMAGE."newspost_images/preview/preview_".basename($source))){ + + if(!resize_image($source, e_IMAGE."newspost_images/preview/preview_".basename($source), $newsize)){ + echo "Couldn't find: ".$source; + } + } + + + header("Content-type: image/jpg"); + $imagedata = file_get_contents(e_IMAGE."newspost_images/preview/preview_".basename($source)); + echo $imagedata; + exit; + + + } +?> \ No newline at end of file diff --git a/e107_images/user_icons/realname_dark.png b/e107_images/user_icons/realname_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..51e68070b45033902ab5ce393ee951edbd3bc008 GIT binary patch literal 793 zcmWksX-ty|5S_23&=$*K)CD=bcColcZ9Ooek(yFl0&GQsF&o&TSk@DxcqGPn#Y7E> zA)tu~DmEl4u5MRE0YMPfU66`^_Hg|cBo#$DOjW8a^m~3x=FQ8?yv+Q0XABwZWYU>Z zB9iHKnoOR3OCk>dv5N~CO_&Wg%U5^%w@7D}mQP%wyvpFX8*SRwes$vTj5r%1jvxrK5 zjK!-x;L^cn<9R-ug>V$WwsD|h`BhD%oCNb2!JX_C+~6vV|G?QYIY$Lt4`HuFTMot+ z;#=Hc*rpb!Wo1C!ch2Vb)G^R^6s1t>kOA4~t%$s21F-XVgUJcHDDe_>nGPktBSCEtPG z$GNL##`GQ4;8`U8p~2SKrKOh>7HO^b!=KiK{G6b>P*(oFJpx^X&M9B&cPyP6X;Clm zw<)=M)LWnNu*GUBD0*~f2R;=%soS~r_XD*L9(Vt-3=M>5@h^(^hA_f3k;rv65&c;` zR8Pt2=>)z+L}K<;ZT_LgE`GTeC0;oa@)i-~~#EY`hH7mqKxgvqpIDfdQ$p57U7zRE9pD^LzUR`60^LE8XNr>hU z?Uo6vmQDM69Nj@}8QD(*lN`C7!@j|jkw`m_y?4wCA zt=qCD6PT;lsI%lHTk?~I#mNn4!lf)uiY_SU9$RBD2F_ERHVtd~mzY%9D)VuLcx*kz zg`K+H5}ea4%}I_rf4ICv9dhxg>`i7~0F+(tqs601mUqps6Qf*zLfmI2GDn0)|F1n_ P`J#Y%Y*0#gV`7?>mEz*! z^z-xU=;-R`==1aQ|NQ&8SSJ1sKO8?ju|Iz^Z+yKY9D802T`Rf4x@c{Pd0KK;^$iF51;{gBJ0RPzr z`NdvwPEq89N&n9o|Hc65!yuEBo-Hp%%(oHEwGJySNS2hG>B$)X&;b9=4D`BdcU4@~ zW>5XdG5)py-nve{!pvr8biuM~|MF+bxol-BwENk-h$)9uX6%xhuBQ83C~HPCB5&165vRXCzkNXeg|H=NGS00001 zbW%=J06^y0W&i*H32;bRa{vGy!2kdr!2!c*R8s%|08~jtK~yNuV_-l7j6l4L5en@8 zg9X+xB7i$kU;!gC2xgqXhzeLfpbLD2&>scRReZ#$1(z8oEMX!HDkuuh16?YC#J|hH l$c-%j66hBM_{M-0007Y25vtVKPw4;v002ovPDHLkV1m*_#KZsq literal 0 HcmV?d00001 diff --git a/e107_images/user_icons/user_aim.png b/e107_images/user_icons/user_aim.png new file mode 100644 index 0000000000000000000000000000000000000000..4c26f336dfc7030c2955c25426fe7ded11fa539c GIT binary patch literal 609 zcmWkqT}TvB6uzswIJqioL5w}v?pv11PMQxQ)ow1iTkh((k_`yjpeExV&8pC1P+h3S zn?5+9!B8(Q!N#gRn2=0A56x3dlxX(QP%mAO;1X09WMjG>_|C`oalXUhWIEy(%S(@y z0szXRZLQ(~Gx)e-*7s*TUPkVrPpbAG|n6M2JAX32A5EXex0aON-%v)*R zgo2@~M2S&mra77hSeI!&PenkXfW-ij1S;_a#;9qKv`p0+tcQ2h8Uu>hwy9;=>sg$S z;k-ySu!AIwB&zd7<|yKb=%Xyn*KQ;8!8Qq#l;Vhz%)zLr>U*r!}6G2R8v|JWU5 z;?P9fRTTj5;RConeZ5s+W^F3cle%zYpg%P{KITsjj}Cz3^+~_b=nqW}`A-Lf4Su1a zIoQ}74EpPWtXib#GRtYv)=-kK^1MBF$_>Dqk96yMMQ7046-`CQcd$d>b czI(s;+wo0Yy-`0gvdHcO(MY^?CER!CKL9ffQvd(} literal 0 HcmV?d00001 diff --git a/e107_images/user_icons/user_birthday_dark.png b/e107_images/user_icons/user_birthday_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..5d4d877473bb32e57b031e8f91bb7620867d2526 GIT binary patch literal 821 zcmV-51Iqk~P)n2yQC_i!_COQ)k5C;PQD>6cDuIZcI|8TqiOrQQbh3_+K$T3lkD>qgh z93Tn^1PKQPNo$n1=Kufy|MLI;)%*Xm>Hm$-|7f%SQk(rrgWN`Ht2{+s3JC`!B`bTX z*ysHJ`2PR+)z<&Cv;WS^`1bSU{r}4B|EJmiiOm0Njy|Nr^*_WR%9 z`S|$x_xJv+to^~ky2#EN8ysR}W!UHL{Py?%%FF)1!TrO-|EZ|_&CdJ(|9^;!o1dcY z_WAVm^zrlb`1<<$`uhIp>HgW;{Nm#K`}^PM>peh1hl-2Q*V*mz^6KsH^7QuY@9^{X z_VoGr`u_j0wzv!o4Hgy^MMOn}hL5MJwZg{D+1%jf=Hm$-|7f%SQk(rrgWN`H zt35_vVqsrtYH)k1*ysHJ`2PR+)z<&Cv;WS^`1bSU{r}4B|EJmiiOm0Nj5Sx`ub^YbhFax`Tzg<{Qvg+|MvL$_}aKJq=}1^r>eEW#?9H>;O6M- z@9^^P@bUZl`S0@cc6fQn$jHmf(U+H`fq{;KgO8n_sJXep+1lLE($iX7Tl@R`+S=Zy zr?Q%wqN=K@uC1++k&&pVsA__N`v3p{0d!JMQvg8b*k%9#010qNS#tmY9>D+r9>D>_ zX;f1H005CmL_t(26$QaDD+B-lfYI+w+$MkEV!l<$U=y3jU{*H8sLLvwa%GV+Uj{N? z23G&U{R7$D<~>z!fZa+>frD53l}7+LE_VRWvj?Z;8eqJ*wTdzkw(1f!`Ip9D3Il0J9y`2mq)d-|GNWs{o){2JllVz@n;uDf1oc T!T>UY00000NkvXXu0mjf#i0H4 literal 0 HcmV?d00001 diff --git a/e107_images/user_icons/user_dark.png b/e107_images/user_icons/user_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..bebe7f331743e04b4ec140b1f8037c0a4fba6ff2 GIT binary patch literal 820 zcmV-41Izr0P)Q?{|Buf9XQ}oD4Jccb^PJE9 zsn!3o+5fub|GdoJ-BD8JGBCK7sJid}j?UVEz4oEg|9`dh2oNYteciFv`M=%!(CPo& z^#9uD>fmE!;y^#pyu{u7|G?wwxZ3%*-2Z;5|J>;K%;x_?UX1|*3RHg3(%bUX-1^e&|Ej;;z(Fy`9tEG7ub9>U zz}ElR;{S@K)&T|-0ty#Mcfx&`*3G<@$)#V%Z2B- zT!dd60RRBMkw^dKtpDP!|Kqd&;jjPRr2W~M_|=p2(1yd9NfiwOz>Y-z?8N`<%m41t z|Ln~F=DYvjr~B5I{@a$wom3A90BAuE_1v-l|MdU*@c;GV|Kqa%;HCfJm334lqiZMi zSVgQ0Yd-v@> zaPZJ!5Ss}^e20SFP=QrHfZ!EK1S;?q1em`8!Ac|n2*4rm4Gwa_0>uagbs&M%&q$yM yDDVjd00lmxfG~7{kHiR|8hV|H0om5i&lmtyySHyOsPn4;0000g}@0$phU00A{nOjJex0RK}{Qe9nJfq{WwU|_JYvEbn0 z(9qCtZ*N{+UW0>!VP9XQqNLBv&Gho~{Q3I*`}^hU>dM2zV`pbzWo4nDps%*LT%)6$ z#>cwF#mmjj!d3hCvhD)EH zO{Jw&r>9`5s&KQjcD1!YnVCamWClh?0(f{8gM&|{rBS1!Qlz9#rKMJ=sAR3JJYZl0 zKtL3Pgh`*DPNbwwqoYrwqfe)&P^P9)p`kf^d_H1gHIb1}rKM1$q*0`#PNJeuq@+E8 zfr5g9H&|FCQBf{_eoUXAM23cef`TSfQy@-Gr(n_h00001bW%=J06^y0W&i*H32;bR za{vGf5&!@T5&_cPe*6Fc04sDwSad^jWnpw_Z*Cw|X>DZyS7l@%I3Q1BbRaS?Ff$-A zGdeOeIy5jKEif=JFbAblng9R*T1iAfR2Ufr!7B;^0RTY3H((G1F>Eu~J%9%=n~j@1 zm0&V@Di5&14}w8(MpY-yl}32J*Ozkiox^K+%>m%Cy4f=g2zCIl1%M3zcMSlj1;C`5 e0iRUiSM>*v>kjrs%#bwz0000?NMQ zuI!gN__!@N<{nV~4HS|N@CkAK|NlRbXM@9=-*FucCAbM*^`81|&a vKex`%S{FZOZ9vZ5yw{SgjuT{m@?Pd%b(t}iNunnmXbpp>tDnm{r-UW|<|$(l literal 0 HcmV?d00001 diff --git a/e107_images/user_icons/user_lite.png b/e107_images/user_icons/user_lite.png new file mode 100644 index 0000000000000000000000000000000000000000..4ab7ada02f68c4c1f9c80d8db70705072d3df288 GIT binary patch literal 823 zcmV-71IYY|P)_7w~O00L4_OjJex|Nqz5+*@RbFH4auRGcqcqAp;i zFk`1HRGlYBku5%RX=-@l;^Miy%qdvDNtygyvj1kf|7ykmY{2?xy7z3!|7yPfVYdHL zr2i~v&?z)w+1c4WXvt{2|9Qs$eZv2L%m0q5*33Xovmz{mh^~Um|AEB+f5!iJ%KtNN z(QIydN{jr8%m0qZ|Ch}Fn%e)VrMu-WD(edcsBC|r-v5=%|97|lkIw&RsrFA-a$lJD zoX`EK)&H{D|GMS>yv*L+QBvkIFu0bey6^vv&f0*z_My}Nf3@{kV0dPi_p#Rbzuo)L z>HpmH|Jvv3;A3RsKtIsD#NGV=z~kz;+WEKK|9+|Eg^87rviq{o`Oe<+@%jGm`2Xzp z`qE!x!zV4=)Y|U*|NQ*_-01ks=Kol8qUh-8_W1vQsr%B~^3>e=((M1Lzumw=F~=SS zpP8?i)&IcO|JdUHkE`3Ou)gZ@|An;wewo+Jyq3wOU(caW(4j}Vj615FYIu{#XNSbK zyv*wC@Tin&_so0u(TMZWi|)*Y=fHB@s7SDgJyK6e!JlXM(uM!sp8eRG{MeZL)|L0u zk?qTc=eS&mV;`xgsN1b$|K+Uz;;#SWv;X0*|K6ni*_rs&ll0Jr!U-Q|KF$k)|dXzws z&twD`q5uE@0d!JMQvg8b*k%9#010qNS#tmY9>D+r9>D>_X;f1H003J_L_t(2kz-;2 zf_?iB96WUR$WaiR2}Jz(;qV;<_Cf{LeE+`w$19M?R*1k?5McfW0!RW7fJ5LL9Atw9 zN)ZYgKmzHXkw6Jh;3Eo1Ll^i+9RZk)A3lM=Qvj{!xpXc@!T$gN002ovPDHLkV1hWc B=%D}r literal 0 HcmV?d00001 diff --git a/e107_images/user_icons/user_location.png b/e107_images/user_icons/user_location.png new file mode 100644 index 0000000000000000000000000000000000000000..3f9394daed96037561fd0dcf2a843985c3adb66f GIT binary patch literal 563 zcmWkpUq};i9RH3c&dKyxQs&c+ijWF-+eEfrwsXTxa?H6&4FpBZOwwrcArAI123cJA zasYS7xdFhF zO2)GdZoqZS&WYZRv`xcJ@3%y=+@QGM94+N~x|J ziiUs|D;rsnWUCrMy($wx3JPT<0}RRwnxGIDv3LnVr65tzC=kjNO-&=LTI&?eSs6j5 zoKmZ*C~G*Y87{@Hv$MSU{Ib6_sd+gIMFy zDoCWL>Wo4QqP+nHS>qLxR}NXt>XZ*T!QiR}Cz%Xdx?!+74P%W_YYeeC)sz}@bkq%o z&@eFt6}z$aI{2{9{@PK>rbi(9^}{t=wA@NwEdsQ98*scoDA#TCLMd^j)PH+wqBJu< z=gZC9oPyl-1s@mk#TKT00lz=!<9Z{(zDOY8yXd#$((YJ~-FG(?kL5Z~HEq0gI~)*w zCytemm}rmZ9!=+;OIdxg+=6CqXKaj<50KmH(^|{b2wA literal 0 HcmV?d00001 diff --git a/e107_images/user_icons/user_msn.png b/e107_images/user_icons/user_msn.png new file mode 100644 index 0000000000000000000000000000000000000000..1e690e8c7791f23bf9c5bdcea51e6aa9d7129cb7 GIT binary patch literal 603 zcmWkqT}TvB6uyhU`Hv5=M9B&T8VWm`61x!YPP^m|xyiH-xe#T8sXO#Lqk%&bIv~NN zD29IMLiBT^ms|O8UxW(VE%gj=5UqJHD-DsRa2;Ks*mn@Rhd}?AW%Da zIGZY$%bhloY!rpKQ`IF&ktDgjJ*q%#A*$KPvLMEk5RNfJh$2KR%aI_KA=VLf5QR44 zyy&_f=N@COrWvY3Y{G<(U|KBtuIn?#Aw*FJD-K4yXkcd84k1)_a1K)yQyU^(w^U3N zL^yYIs-`G8SypsHH9`qxmSJHmqHRS{ZOVvS#BNd7bk4c&`<~}(nr=}>J8mTE36C3mwPvJP4g!E@v@jFs5T{i3=foiGL4?Hw8>Ja}>l^Kb;n0+xh+> z1AzM0Ed-X9r#Hp0%S;_J4_+J@HpkDM4Q0pAjDYOeL`dohB_>8gk#KllNQ%UI_s1f= zq3*CKeg64^@ZCr!6WL(lIBaj784OmJR@kt2rK&l;B(DdnGx_!1lik-evn$xr*3ehI zbN1fkySk^dkDq)6P5HZ@*B9s-ocoynd%%<`njbV4E-%LI%BfRba~GyT+r!mlzGJH8 zMd6O}<8|MR61lYD+z!0u@5eUcYb)P>ei*qKdlP;{w>OmB`^wS@<=3|_o&Ug*T|Ij< RX6%nx4y03= zA)tu~DmEl4u5MRE0YMPfU66`^_Hg|cBo#$DOjW8a^m~3x=FQ8?yv+Q0XABwZWYU>Z zB9iHKnoOR3OCk>dv5N~CO_&Wg%U5^%w@7D}mQP%wyvpFX8*SRwes$vTj5r%1jvxrK5 zjK!-x;L^cn<9R-ug>V$WwsD|h`BhD%oCNb2!JX_C+~6vV|G?QYIY$Lt4`HuFTMot+ z;#=Hc*rpb!Wo1C!ch2Vb)G^R^6s1t>kOA4~t%$s21F-XVgUJcHDDe_>nGPktBSCEtPG z$GNL##`GQ4;8`U8p~2SKrKOh>7HO^b!=KiK{G6b>P*(oFJpx^X&M9B&cPyP6X;Clm zw<)=M)LWnNu*GUBD0*~f2R;=%soS~r_XD*L9(Vt-3=M>5@h^(^hA_f3k;rv65&c;` zR8Pt2=>)z+L}K<;ZT_LgE`GTeC0;oa@)i-~~#EY`hH7mqKxgvqpIDfdQ$p57U7zRE9pD^LzUR`60^LE8XNr>hU z?Uo6vmQDM69Nj@}8QD(*lN`C7!@j|jkw`m_y?4wCA zt=qCD6PT;lsI%lHTk?~I#mNn4!lf)uiY_SU9$RBD2F_ERHVtd~mzY%9D)VuLcx*kz zg`K+H5}ea4%}I_rf4ICv9dhxg>`i7~0F+(tqs601mUqps6Qf*zLfmI2GDn0)|F1n_ P`J#Y%Y*0#gV`7?>mEz*! z^z-xU=;-R`==1aQ|NQ&8SSJ1sKO8?ju|Iz^Z+yKY9D802T`Rf4x@c{Pd0KK;^$iF51;{gBJ0RPzr z`NdvwPEq89N&n9o|Hc65!yuEBo-Hp%%(oHEwGJySNS2hG>B$)X&;b9=4D`BdcU4@~ zW>5XdG5)py-nve{!pvr8biuM~|MF+bxol-BwENk-h$)9uX6%xhuBQ83C~HPCB5&165vRXCzkNXeg|H=NGS00001 zbW%=J06^y0W&i*H32;bRa{vGy!2kdr!2!c*R8s%|08~jtK~yNuV_-l7j6l4L5en@8 zg9X+xB7i$kU;!gC2xgqXhzeLfpbLD2&>scRReZ#$1(z8oEMX!HDkuuh16?YC#J|hH l$c-%j66hBM_{M-0007Y25vtVKPw4;v002ovPDHLkV1m*_#KZsq literal 0 HcmV?d00001 diff --git a/e107_images/user_icons/user_star_dark.png b/e107_images/user_icons/user_star_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..3ca85fa2cea7a173bcc212ba7403fd6ee26520c5 GIT binary patch literal 666 zcmV;L0%iS)P)XwZF00ECsOjJbx000jF04M_h0{{RK000^U07?V` z<8?EYKNA`N0J3Ezsa7f@007^DQ~&RczhfmV0ssX707ec0){sO0@RWZ?Ev7FV{^^hZ z@rd7%I9eG5crFX`wNL;3m+rlFEe!~43kdPESpVW}|Ke--v_kyFP5&@BJdE&tIk|Isl2*DdbADu_!H3;+NM003km3F@gl|MqA9>vaF-cK_vc|KxH1 z<#qq(b^q{j|Lk71gDfl%0-rY`|J!N*|BC<}KR6zg#^!(+{Pa_$885I2L+~T{b7y|P-h(}o%e={%u0F$*9;~c0&EC2ui07*qoM6N<$g5wn! A0ssI2 literal 0 HcmV?d00001 diff --git a/e107_images/user_icons/user_star_lite.png b/e107_images/user_icons/user_star_lite.png new file mode 100644 index 0000000000000000000000000000000000000000..05d497f9656f13dcc34253034c19ce2f92edfcfc GIT binary patch literal 699 zcmV;s0!00ZP)FMc)Y;3k^DXCT}o0ypK&d%e8SO4#gzhfm)Cnd$j#pU4Oc|kPR zkVF6Ql#5e2;NalWTS)%tkN@$A-;p?HCJ}}_8S}MI|NWQly>)3xMBICL@v~U};%)!p zYxuN6{KZZG;coxqY{P;>l#Gn)%*@z$KL6N2|H?Z5)j|K!KmW@({?SH(O*Q7`=BSR2 z$7v=1(Hj565dXvy|Hlpe$0T?-9eaCw{r&xuUR=a<9{JEL|I{u2(J%keF#p#r?!YRE zOcYQ=MC9b;*v`(1M=$EBJpcA*|Lb)B=63((bpPaW|K)Z6=XL+^asTXIwSz23EFP$+ zsIp2m|J!N*|BCJaMm+iX`Nw2m{Oa7|yQz9)W80pd?y{_~e0I3C zwfXPw$WKp&OiaFXZSDX700DGTPE!Ct=GbNc000SaNLh0L03N{r03N{s!)a7g0001T zNklr&NJ)stgY zO;tTnRjN9JrE03$K~=s10CNKX%pDLweSuyF_)&dA;J2wZ0N0vo15i!10jSgo0DnzA hV66|7!hco6-Wx)S6mDc5P#XXM002ovPDHLkV1m6PZax42 literal 0 HcmV?d00001 diff --git a/e107_languages/English/English.php b/e107_languages/English/English.php new file mode 100644 index 000000000..e2632aabc --- /dev/null +++ b/e107_languages/English/English.php @@ -0,0 +1,39 @@ + \ No newline at end of file diff --git a/e107_languages/English/admin/help/administrator.php b/e107_languages/English/admin/help/administrator.php new file mode 100644 index 000000000..27c5d044e --- /dev/null +++ b/e107_languages/English/admin/help/administrator.php @@ -0,0 +1,26 @@ +
    +To create a new admin go to the user config page and update an existing user to admin status."; +$ns -> tablerender($caption, $text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/article.php b/e107_languages/English/admin/help/article.php new file mode 100644 index 000000000..d8d54546a --- /dev/null +++ b/e107_languages/English/admin/help/article.php @@ -0,0 +1,27 @@ + + For a multi-page article separate each page with the text [newpage], i.e.
    Test1 [newpage] Test2
    would create a two page article with 'Test1' on page 1 and 'Test2' on page 2. +

    +If your article contains HTML tags that you wish to preserve, enclose the code with [html] [/html]. For example, if you entered the text '<table><tr><td>Hello </td></tr></table>' in your article, a table would be shown containing the word hello. If you entered '[html]<table><tr><td>Hello </td></tr></table>[/html]' the code as you entered it would be shown and not the table that the code generates."; +$ns -> tablerender("Article Help", $text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/banlist.php b/e107_languages/English/admin/help/banlist.php new file mode 100644 index 000000000..3f2282e8c --- /dev/null +++ b/e107_languages/English/admin/help/banlist.php @@ -0,0 +1,32 @@ + +Either enter their full IP address or use a wildcard to ban a range of IP addresses. You can also enter an email address to stop a user registering as a member on your site.

    +Banning by IP address:
    +Entering the IP address 123.123.123.123 will stop the user with that address visiting your site.
    +Entering the IP address 123.123.123.* will stop anyone in that IP range from visiting your site.

    +Banning by email address
    +Entering the email address foo@bar.com will stop anyone using that email address from registering as a member on your site.
    +Entering the email address *@bar.com will stop anyone using that email domain from registering as a member on your site."; +$ns -> tablerender($caption, $text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/cache.php b/e107_languages/English/admin/help/cache.php new file mode 100644 index 000000000..fb692a7ea --- /dev/null +++ b/e107_languages/English/admin/help/cache.php @@ -0,0 +1,25 @@ +
    IMPORTANT! If you are making your own theme turn caching off as any changes you make will not be reflected."; +$ns -> tablerender($caption, $text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/chatbox.php b/e107_languages/English/admin/help/chatbox.php new file mode 100644 index 000000000..7be652163 --- /dev/null +++ b/e107_languages/English/admin/help/chatbox.php @@ -0,0 +1,25 @@ +If the replace link box is ticked, any links entered will be replaced by the text you enter in the textbox, this stops long links causing display problems. Wordwrap will auto wrap text that is longer than the length specified here."; + +$ns -> tablerender("Chatbox", $text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/content.php b/e107_languages/English/admin/help/content.php new file mode 100644 index 000000000..f3abef982 --- /dev/null +++ b/e107_languages/English/admin/help/content.php @@ -0,0 +1,25 @@ + +If you want your content page to have a caption, enter it in the Page Heading box."; +$ns -> tablerender("Content Help", $text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/cpage.php b/e107_languages/English/admin/help/cpage.php new file mode 100644 index 000000000..f42a40b52 --- /dev/null +++ b/e107_languages/English/admin/help/cpage.php @@ -0,0 +1,26 @@ +
    "; +// $text .= "Please see
    http://docs.e107.org/Using Custom Pages and Custom Menus for an explanation of all the features."; + +$ns -> tablerender(CUSLAN_18, $text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/custommenu.php b/e107_languages/English/admin/help/custommenu.php new file mode 100644 index 000000000..83bbe3e6c --- /dev/null +++ b/e107_languages/English/admin/help/custommenu.php @@ -0,0 +1,26 @@ +
    +Please see http://docs.e107.org?Custom Pages"; + +$ns -> tablerender(CUSLAN_18, $text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/db.php b/e107_languages/English/admin/help/db.php new file mode 100644 index 000000000..1b53b1fc5 --- /dev/null +++ b/e107_languages/English/admin/help/db.php @@ -0,0 +1,24 @@ + tablerender("Database Tools", $text); +?> diff --git a/e107_languages/English/admin/help/download.php b/e107_languages/English/admin/help/download.php new file mode 100644 index 000000000..639daa091 --- /dev/null +++ b/e107_languages/English/admin/help/download.php @@ -0,0 +1,26 @@ +
    +To submit a download, first create a parent, then create a category under that parent, you will then be able to make the download available."; +$ns -> tablerender("Download Help", $text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/emoticon.php b/e107_languages/English/admin/help/emoticon.php new file mode 100644 index 000000000..a09a49c5e --- /dev/null +++ b/e107_languages/English/admin/help/emoticon.php @@ -0,0 +1,26 @@ + tablerender("Emoticon Help", $text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/fileinspector.php b/e107_languages/English/admin/help/fileinspector.php new file mode 100644 index 000000000..1a018a4a5 --- /dev/null +++ b/e107_languages/English/admin/help/fileinspector.php @@ -0,0 +1,51 @@ + +".$dir." Core File

    +
    +".$dir." Known Insecurity
    +
    +".$dir." Core File (Integrity Pass)
    +
    +".$dir." Core File (Integrity Fail)
    +
    +".$dir." Core File (Incalculable)
    +
    +".$dir." Missing Core File
    +
    +".$dir." Old Core File
    +
    +".$dir." Non Core File
    "; +$ns -> tablerender("File Key", $text); + +$text = "The file inspector scans and analyses the files on your sites server. When the inspector encounters +an e107 core file, it checks it for file consistency to make sure it isn't corrupted."; + +if ($pref['developer']) { +$text .= "

    +The additional string matching tool (developer mode only) enables you to scan the files on your server for text strings +using regular expressions. The regex engine in use is PHP's PCRE +(the preg_* functions), so enter your query as #pattern#modifiers in the fields provided."; +} + +$ns -> tablerender("File Inspector Help", $text); +?> diff --git a/e107_languages/English/admin/help/filemanager.php b/e107_languages/English/admin/help/filemanager.php new file mode 100644 index 000000000..279f33674 --- /dev/null +++ b/e107_languages/English/admin/help/filemanager.php @@ -0,0 +1,24 @@ + tablerender("File Manager Help", $text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/forum.php b/e107_languages/English/admin/help/forum.php new file mode 100644 index 000000000..d88cd4e04 --- /dev/null +++ b/e107_languages/English/admin/help/forum.php @@ -0,0 +1,43 @@ +General

    +Use this screen to create or edit your forums
    +
    +Parents/Forums
    +A parent is a heading that other forums are displayed under, this makes layout simpler and makes navigating around your forums much simpler for visitors. +

    +Accessibility +
    +You can set your forums to only be accessible to certain visitors. Once you have set the 'class' of the visitors you can tick the +class to only allow those visitors access to the forum. You can set parents or individual forums up in this way. +

    +Moderators +
    +Tick the names of the listed administrators to give them moderator status on the forum. The administrator must have forum moderation permissions to be listed here. +

    +Ranks +
    +Set your user ranks from here. If the image fields are filled in, images will be used, to use rank names enter the names and make sure the corresponding rank image field is blank.
    The threshold is the number of points the user needs to gain before his level changes."; +$ns -> tablerender($caption, $text); +unset($text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/frontpage.php b/e107_languages/English/admin/help/frontpage.php new file mode 100644 index 000000000..1e8c03a41 --- /dev/null +++ b/e107_languages/English/admin/help/frontpage.php @@ -0,0 +1,25 @@ + tablerender($caption, $text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/image.php b/e107_languages/English/admin/help/image.php new file mode 100644 index 000000000..a70f2850b --- /dev/null +++ b/e107_languages/English/admin/help/image.php @@ -0,0 +1,24 @@ + tablerender("Images Help", $text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/index.html b/e107_languages/English/admin/help/index.html new file mode 100644 index 000000000..e69de29bb diff --git a/e107_languages/English/admin/help/language.php b/e107_languages/English/admin/help/language.php new file mode 100644 index 000000000..ce024f746 --- /dev/null +++ b/e107_languages/English/admin/help/language.php @@ -0,0 +1,24 @@ + tablerender("Language Help", $text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/link_category.php b/e107_languages/English/admin/help/link_category.php new file mode 100644 index 000000000..8775de69d --- /dev/null +++ b/e107_languages/English/admin/help/link_category.php @@ -0,0 +1,24 @@ +
    Any link entered under the Main category will be displayed in your main navigation menu."; +$ns -> tablerender("Link Category Help", $text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/links.php b/e107_languages/English/admin/help/links.php new file mode 100644 index 000000000..5a2c79895 --- /dev/null +++ b/e107_languages/English/admin/help/links.php @@ -0,0 +1,26 @@ + +"; +$ns -> tablerender("Links Help", $text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/list_menu_conf.php b/e107_languages/English/admin/help/list_menu_conf.php new file mode 100644 index 000000000..dbcc066b5 --- /dev/null +++ b/e107_languages/English/admin/help/list_menu_conf.php @@ -0,0 +1,30 @@ + + New Articles Menu
    +Enter a number for example '5' in the first field to show the first 5 articles, leave empty to see all, You configure what the title of the link should be to the rest of the articles in the second field, when you leave this last option empty it won't create a link, for example: 'All articles'
    + Comments/Forum Menu
    +The number of comments default to 5, the number of characters default to 10000. The postfix is for if a line is too long it will cut it off and append this postfix to the end, a good choice for this is '...', check original topics if you want to see those in the overview.
    + +"; +$ns -> tablerender("Menu Configuration Help", $text); +?> diff --git a/e107_languages/English/admin/help/mailout.php b/e107_languages/English/admin/help/mailout.php new file mode 100644 index 000000000..c070b9868 --- /dev/null +++ b/e107_languages/English/admin/help/mailout.php @@ -0,0 +1,24 @@ + tablerender("Mail Help", $text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/menus.php b/e107_languages/English/admin/help/menus.php new file mode 100644 index 000000000..ed83b3553 --- /dev/null +++ b/e107_languages/English/admin/help/menus.php @@ -0,0 +1,56 @@ + db_Select("menus","*", "menu_location='".$mc."' ORDER BY menu_order"); + $count = 1; + $sql2 = new db; + while(list($menu_id, $menu_name, $menu_location, $menu_order) = $sql-> db_Fetch()){ + $sql2 -> db_Update("menus", "menu_order='$count' WHERE menu_id='$menu_id' "); + $count++; + } + $text = "Menus reset in database

    "; + } +}else{ + unset($text); +} + +$text .= " +You can arrange where and in which order your menu items are from here. +Use the dropdown menu to move the menus up and down until you are satisfied with their positioning. +
    +
    +If you find the menus are not updating properly click on the refresh button. +
    + +
    +
    * indicates menu visibility has been modified
    +"; + +$ns -> tablerender("Menus Help", $text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/menus2.php b/e107_languages/English/admin/help/menus2.php new file mode 100644 index 000000000..05d4bec66 --- /dev/null +++ b/e107_languages/English/admin/help/menus2.php @@ -0,0 +1,28 @@ + +The menu items in the middle of the screen are de-activated; you can activate these by choosing a location to put them in. +"; + +$ns -> tablerender("Menus Help", $text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/meta.php b/e107_languages/English/admin/help/meta.php new file mode 100644 index 000000000..8e45bb3c5 --- /dev/null +++ b/e107_languages/English/admin/help/meta.php @@ -0,0 +1,25 @@ + tablerender("Meta Tags", $text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/news_category.php b/e107_languages/English/admin/help/news_category.php new file mode 100644 index 000000000..f1f81f875 --- /dev/null +++ b/e107_languages/English/admin/help/news_category.php @@ -0,0 +1,24 @@ +
    Upload your news icon images either ".e_THEME."-yourtheme-/images/ or themes/shared/newsicons/."; +$ns -> tablerender("News Category Help", $text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/newsfeed.php b/e107_languages/English/admin/help/newsfeed.php new file mode 100644 index 000000000..147adec4a --- /dev/null +++ b/e107_languages/English/admin/help/newsfeed.php @@ -0,0 +1,25 @@ +Enter the full path URL to the backend (ie http://e107.org/news.xml). You can add a path to an image if you don't like the default one, or it isn't defined. You can activate and de-activate the backend if the site goes down for instance.

    To see the headlines on your site, make sure the headlines_menu is activated from your menus page."; + +$ns -> tablerender("Headlines", $text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/newspost.php b/e107_languages/English/admin/help/newspost.php new file mode 100644 index 000000000..1f01a115a --- /dev/null +++ b/e107_languages/English/admin/help/newspost.php @@ -0,0 +1,36 @@ +General
    +Body will be displayed on the main page; extended will be readable by clicking a 'Read More' link. +
    +
    +Show title only +
    +Enable this to show the news title only on front page, with clickable link to full story. +

    +Activation +
    +If you set a start and/or end date your news item will only be displayed between these dates. +"; +$ns -> tablerender($caption, $text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/notify.php b/e107_languages/English/admin/help/notify.php new file mode 100644 index 000000000..27994d935 --- /dev/null +++ b/e107_languages/English/admin/help/notify.php @@ -0,0 +1,31 @@ +
    +For example, set 'IP banned for flooding site' to user class 'Admin' and all admins will be sent an email when your +site is being flooded.

    +You can also, as another example, set 'News item posted by admin' to user class 'Members' and all your users will be +sent news items you post to the site in an email.

    +If you would like the email notifications to be sent to an alternative email address - select the 'Email' option and +enter in the email address in the field provided."; + +$ns -> tablerender("Notify Help", $text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/phpinfo.php b/e107_languages/English/admin/help/phpinfo.php new file mode 100644 index 000000000..85ed0b0c6 --- /dev/null +++ b/e107_languages/English/admin/help/phpinfo.php @@ -0,0 +1,24 @@ + tablerender("PHP Info Help", $text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/poll.php b/e107_languages/English/admin/help/poll.php new file mode 100644 index 000000000..e8c0b4ff7 --- /dev/null +++ b/e107_languages/English/admin/help/poll.php @@ -0,0 +1,26 @@ +
    +To see the poll, go to your menus page and make sure poll_menu is activated."; + +$ns -> tablerender("Polls", $text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/prefs.php b/e107_languages/English/admin/help/prefs.php new file mode 100644 index 000000000..a9c058b92 --- /dev/null +++ b/e107_languages/English/admin/help/prefs.php @@ -0,0 +1,24 @@ + tablerender("Preferences Help", $text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/review.php b/e107_languages/English/admin/help/review.php new file mode 100644 index 000000000..a60a01517 --- /dev/null +++ b/e107_languages/English/admin/help/review.php @@ -0,0 +1,25 @@ + + For a multi-page review separate each page with the text [newpage], i.e.
    Test1 [newpage] Test2
    would create a two page review with 'Test1' on page 1 and 'Test2' on page 2."; +$ns -> tablerender("Review Help", $text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/search.php b/e107_languages/English/admin/help/search.php new file mode 100644 index 000000000..475341439 --- /dev/null +++ b/e107_languages/English/admin/help/search.php @@ -0,0 +1,27 @@ +
    +If your site includes Ideographic languages such as Chinese and Japanese you must +use the PHP sort method and switch whole word matching off."; +$ns -> tablerender("Search Help", $text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/theme.php b/e107_languages/English/admin/help/theme.php new file mode 100644 index 000000000..4c63e0602 --- /dev/null +++ b/e107_languages/English/admin/help/theme.php @@ -0,0 +1,24 @@ + tablerender("Theme Manager Help", $text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/ugflag.php b/e107_languages/English/admin/help/ugflag.php new file mode 100644 index 000000000..1cb1e03b7 --- /dev/null +++ b/e107_languages/English/admin/help/ugflag.php @@ -0,0 +1,25 @@ + tablerender("Maintenance", $text); +?> diff --git a/e107_languages/English/admin/help/updateadmin.php b/e107_languages/English/admin/help/updateadmin.php new file mode 100644 index 000000000..9bf576cd7 --- /dev/null +++ b/e107_languages/English/admin/help/updateadmin.php @@ -0,0 +1,24 @@ + tablerender("Update Settings Help", $text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/upload.php b/e107_languages/English/admin/help/upload.php new file mode 100644 index 000000000..0ec0ab8f0 --- /dev/null +++ b/e107_languages/English/admin/help/upload.php @@ -0,0 +1,24 @@ + tablerender("Public Uploads Help", $text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/userclass2.php b/e107_languages/English/admin/help/userclass2.php new file mode 100644 index 000000000..08a30bd1b --- /dev/null +++ b/e107_languages/English/admin/help/userclass2.php @@ -0,0 +1,25 @@ +This is useful for restricting users to certain parts of your site. For example, you could create a class called TEST, then create a forum which only allowed users in the TEST class to access it."; +$ns -> tablerender($caption, $text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/users.php b/e107_languages/English/admin/help/users.php new file mode 100644 index 000000000..5e3914813 --- /dev/null +++ b/e107_languages/English/admin/help/users.php @@ -0,0 +1,25 @@ + tablerender("Users Help", $text); +unset($text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/users_extended.php b/e107_languages/English/admin/help/users_extended.php new file mode 100644 index 000000000..750b0eca7 --- /dev/null +++ b/e107_languages/English/admin/help/users_extended.php @@ -0,0 +1,24 @@ + tablerender(" Extended User Fields Help", $text); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/help/wmessage.php b/e107_languages/English/admin/help/wmessage.php new file mode 100644 index 000000000..9621837ba --- /dev/null +++ b/e107_languages/English/admin/help/wmessage.php @@ -0,0 +1,24 @@ + tablerender("WMessage Help", $text); +?> diff --git a/e107_languages/English/admin/lan_admin.php b/e107_languages/English/admin/lan_admin.php new file mode 100644 index 000000000..0b3b527e3 --- /dev/null +++ b/e107_languages/English/admin/lan_admin.php @@ -0,0 +1,272 @@ +immediately. The files are related to the older 0.6xx branch of e107. Please delete the following directories and all their contents:"); +define("ADLAN_ERR_3", "There are one or more files in your public upload directories that are not in your allowed upload filetypes list. These may have been placed here by an attacker and if so should be removed immediately. You should not open these files as this may execute any malicious code the file might contain; i.e. do not open them with your browser.

    If you recognise these files as being legitimate, it is likely that due to the recent allowed filetypes changes, the filetype you allowed is no longer in the allowed filetypes list and you will need to re-add it (see admin => uploads). You should not allow the upload of .html, .txt, etc as an attacker may upload a file of this type which includes malicious javascript. You should also, of course, not allow the upload of .php files or any other type of executable script.

    Below is the list of files that could potentially be malicious:"); +define("ADLAN_ERR_4", "Deprecated plugin file(s) found"); +define("ADLAN_ERR_5", "The following files need to be renamed to"); +define("ADLAN_ERR_6", "Then, click here to re-scan your plugin folders."); + + +// Common Terms +define("LAN_EDIT","Edit"); +define("LAN_DELETE","Delete"); +define("LAN_CREATE","Create"); +define("LAN_UPDATE","Update"); +define("LAN_SAVE","Save"); +define("LAN_SAVED","Saved"); +define("LAN_SETSAVED","Your settings have been saved"); +define("LAN_CONFIRMDEL","Please confirm you wish to delete"); +define("LAN_OPTIONS","Options"); +define("LAN_PREFS","Preferences"); +define("LAN_DELETED","Successfully deleted"); +define("LAN_UPDATED","Successfully updated"); +define("LAN_CREATED","Successfully created"); +define("LAN_CREATED_FAILED","Creation Unsuccessful"); +define("LAN_DELETED_FAILED","Deletion Unsuccessful"); +define("LAN_UPDATED_FAILED","Update Unsuccessful"); +define("LAN_NO_CHANGE","Update unsuccessful as no changes were made."); +define("LAN_TRY_AGAIN","Please try again."); + +define("LAN_RESET","Reset"); +define("LAN_CLEAR","Clear"); +define("LAN_OK","OK"); + +define("LAN_PRESET","Preset"); +define("LAN_PRESET_SAVED","Preset saved successfully"); + +define("LAN_PRESET_DELETED","Preset successfully deleted"); +define("LAN_PRESET_CONFIRMDEL","Are you sure you want to delete this preset?"); +define("LAN_NOTWRITABLE"," is not writable, you need to CHMOD 777 the file or folder first."); +define("LAN_DATE","Date"); +define("LAN_TIME","Time"); +define("LAN_YES","Yes"); +define("LAN_NO","No"); +define("LAN_EMPTY","There are no entries in the database yet"); +define("LAN_EXISTING","Existing Entries"); + +define("LAN_CANCEL","Cancel"); +define("LAN_CONFDELETE","Confirm Delete"); +define("LAN_PLUGIN","Plugin"); +define("LAN_ORDER","Order"); + +define("LAN_SELECT","Select ..."); +define("LAN_ADMIN","Admin"); +define("LAN_DISPLAYOPT", "Edit Display Options"); +define("LAN_GOPAGE", "Go to page:"); +define("LAN_DATESTAMP","Date stamp"); +define("LAN_OPTIONAL", "optional"); +define("LAN_INACTIVE","Inactive"); + +define("LAN_BAN","Ban"); +define("LAN_RATING", "Rating"); + +define("LAN_UPLOAD_IMAGES","Upload Images"); +define("LAN_UPLOAD_FILES","Upload Files"); +define("LAN_UPLOAD_ADDFILE","Add Another File"); +define("LAN_UPLOAD_CONFIRM","Any unsaved changes to this page will be lost. Continue?"); +define("LAN_UPLOAD_777","Folder is missing or not writable, you need to CHMOD 777 the following folder before uploading:"); +define("LAN_UPLOAD_SERVEROFF", "This option is disabled as file uploading is not enabled on your server"); + +define("LAN_DISABLED","Disabled"); +define("LAN_ENABLED", "Enabled"); + +define("LAN_PRESET_CONFIRMSAVE","Save current form values as the default for this page?"); +define("LAN_CONFIGURE", "Configure"); + +define("LAN_BACK","Back"); + +define("LAN_CREDITS","Credits"); + +?> diff --git a/e107_languages/English/admin/lan_admin_log.php b/e107_languages/English/admin/lan_admin_log.php new file mode 100644 index 000000000..0ed7cb9c9 --- /dev/null +++ b/e107_languages/English/admin/lan_admin_log.php @@ -0,0 +1,27 @@ + \ No newline at end of file diff --git a/e107_languages/English/admin/lan_administrator.php b/e107_languages/English/admin/lan_administrator.php new file mode 100644 index 000000000..fbf57b169 --- /dev/null +++ b/e107_languages/English/admin/lan_administrator.php @@ -0,0 +1,83 @@ + \ No newline at end of file diff --git a/e107_languages/English/admin/lan_banlist.php b/e107_languages/English/admin/lan_banlist.php new file mode 100644 index 000000000..efe7b0885 --- /dev/null +++ b/e107_languages/English/admin/lan_banlist.php @@ -0,0 +1,25 @@ + \ No newline at end of file diff --git a/e107_languages/English/admin/lan_banner.php b/e107_languages/English/admin/lan_banner.php new file mode 100644 index 000000000..f2a71ad82 --- /dev/null +++ b/e107_languages/English/admin/lan_banner.php @@ -0,0 +1,73 @@ +this is only used when multiple campaigns are selected"); + +?> \ No newline at end of file diff --git a/e107_languages/English/admin/lan_cache.php b/e107_languages/English/admin/lan_cache.php new file mode 100644 index 000000000..3e6bc8286 --- /dev/null +++ b/e107_languages/English/admin/lan_cache.php @@ -0,0 +1,23 @@ + \ No newline at end of file diff --git a/e107_languages/English/admin/lan_cpage.php b/e107_languages/English/admin/lan_cpage.php new file mode 100644 index 000000000..591aab03b --- /dev/null +++ b/e107_languages/English/admin/lan_cpage.php @@ -0,0 +1,55 @@ + \ No newline at end of file diff --git a/e107_languages/English/admin/lan_credits.php b/e107_languages/English/admin/lan_credits.php new file mode 100644 index 000000000..935263889 --- /dev/null +++ b/e107_languages/English/admin/lan_credits.php @@ -0,0 +1,54 @@ +5ODM2NDU3YWI0ZjM1NGILJT
    yarrrrrr! wtf matey!\""); // jalist +define("CRELAN_23", ""); // lisa +define("CRELAN_24", ""); // McFly +define("CRELAN_25", ""); // que +define("CRELAN_26", ""); // streaky +define("CRELAN_27", "\"Wot? No tea?? 0_0\""); // SweetAs +define("CRELAN_28", ""); // MrPete + +// end dev team + +?> diff --git a/e107_languages/English/admin/lan_db.php b/e107_languages/English/admin/lan_db.php new file mode 100644 index 000000000..42bc275b7 --- /dev/null +++ b/e107_languages/English/admin/lan_db.php @@ -0,0 +1,45 @@ + diff --git a/e107_languages/English/admin/lan_db_verify.php b/e107_languages/English/admin/lan_db_verify.php new file mode 100644 index 000000000..f858e3bf2 --- /dev/null +++ b/e107_languages/English/admin/lan_db_verify.php @@ -0,0 +1,33 @@ +
    Please ensure the file core_sql.php exists in the /admin/sql directory."); +define("DBLAN_2", "Verifying all"); + +define("DBLAN_4", "Table"); +define("DBLAN_5", "Field"); +define("DBLAN_6", "Status"); +define("DBLAN_7", "Notes"); +define("DBLAN_8", "Mismatch"); +define("DBLAN_9", "Currently"); +define("DBLAN_10", "should be"); +define("DBLAN_11", "Field missing"); +define("DBLAN_12", "Extra Field!"); +define("DBLAN_13", "Table missing!"); +define("DBLAN_14", "Choose table(s) to validate"); +define("DBLAN_15", "Start Verify"); +define("DBLAN_16", "SQL Verification"); +define("DBLAN_17", "Back"); +define("DBLAN_18", "tables"); +define("DBLAN_19", "Attempt to Fix"); +define("DBLAN_20", "Attempting to fix tables"); +define("DBLAN_21", "Fix Selected Items"); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/lan_docs.php b/e107_languages/English/admin/lan_docs.php new file mode 100644 index 000000000..15c5adc7f --- /dev/null +++ b/e107_languages/English/admin/lan_docs.php @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/e107_languages/English/admin/lan_download.php b/e107_languages/English/admin/lan_download.php new file mode 100644 index 000000000..7876097b9 --- /dev/null +++ b/e107_languages/English/admin/lan_download.php @@ -0,0 +1,143 @@ + \ No newline at end of file diff --git a/e107_languages/English/admin/lan_e107_update.php b/e107_languages/English/admin/lan_e107_update.php new file mode 100644 index 000000000..d7bfb3ba6 --- /dev/null +++ b/e107_languages/English/admin/lan_e107_update.php @@ -0,0 +1,25 @@ + \ No newline at end of file diff --git a/e107_languages/English/admin/lan_emoticon.php b/e107_languages/English/admin/lan_emoticon.php new file mode 100644 index 000000000..eb546e324 --- /dev/null +++ b/e107_languages/English/admin/lan_emoticon.php @@ -0,0 +1,39 @@ + \ No newline at end of file diff --git a/e107_languages/English/admin/lan_fileinspector.php b/e107_languages/English/admin/lan_fileinspector.php new file mode 100644 index 000000000..6178be7c2 --- /dev/null +++ b/e107_languages/English/admin/lan_fileinspector.php @@ -0,0 +1,73 @@ + \ No newline at end of file diff --git a/e107_languages/English/admin/lan_filemanager.php b/e107_languages/English/admin/lan_filemanager.php new file mode 100644 index 000000000..fcdde2747 --- /dev/null +++ b/e107_languages/English/admin/lan_filemanager.php @@ -0,0 +1,67 @@ + \ No newline at end of file diff --git a/e107_languages/English/admin/lan_fla.php b/e107_languages/English/admin/lan_fla.php new file mode 100644 index 000000000..7883b46c3 --- /dev/null +++ b/e107_languages/English/admin/lan_fla.php @@ -0,0 +1,30 @@ + \ No newline at end of file diff --git a/e107_languages/English/admin/lan_footer.php b/e107_languages/English/admin/lan_footer.php new file mode 100644 index 000000000..4952516fd --- /dev/null +++ b/e107_languages/English/admin/lan_footer.php @@ -0,0 +1,30 @@ + \ No newline at end of file diff --git a/e107_languages/English/admin/lan_frontpage.php b/e107_languages/English/admin/lan_frontpage.php new file mode 100644 index 000000000..0115f865d --- /dev/null +++ b/e107_languages/English/admin/lan_frontpage.php @@ -0,0 +1,40 @@ + \ No newline at end of file diff --git a/e107_languages/English/admin/lan_header.php b/e107_languages/English/admin/lan_header.php new file mode 100644 index 000000000..0113b85d7 --- /dev/null +++ b/e107_languages/English/admin/lan_header.php @@ -0,0 +1,21 @@ + diff --git a/e107_languages/English/admin/lan_image.php b/e107_languages/English/admin/lan_image.php new file mode 100644 index 000000000..d290c5092 --- /dev/null +++ b/e107_languages/English/admin/lan_image.php @@ -0,0 +1,65 @@ + \ No newline at end of file diff --git a/e107_languages/English/admin/lan_lancheck.php b/e107_languages/English/admin/lan_lancheck.php new file mode 100644 index 000000000..71956b706 --- /dev/null +++ b/e107_languages/English/admin/lan_lancheck.php @@ -0,0 +1,35 @@ + diff --git a/e107_languages/English/admin/lan_language.php b/e107_languages/English/admin/lan_language.php new file mode 100644 index 000000000..c3c3aa6cc --- /dev/null +++ b/e107_languages/English/admin/lan_language.php @@ -0,0 +1,38 @@ + diff --git a/e107_languages/English/admin/lan_links.php b/e107_languages/English/admin/lan_links.php new file mode 100644 index 000000000..c6ff190d6 --- /dev/null +++ b/e107_languages/English/admin/lan_links.php @@ -0,0 +1,67 @@ + \ No newline at end of file diff --git a/e107_languages/English/admin/lan_mailout.php b/e107_languages/English/admin/lan_mailout.php new file mode 100644 index 000000000..04ea1574a --- /dev/null +++ b/e107_languages/English/admin/lan_mailout.php @@ -0,0 +1,103 @@ +e107.htaccess to .htaccess in"); +define("MAILAN_41", "before sending mail from this page."); +define("MAILAN_42", "Warning"); +define("MAILAN_43", "Username"); +define("MAILAN_44", "User Login"); +define("MAILAN_45", "User Email"); +define("MAILAN_46", "User-Match"); +define("MAILAN_47", "contains"); +define("MAILAN_48", "equals"); +define("MAILAN_49", "Id"); +define("MAILAN_50", "Author"); +define("MAILAN_51", "Subject"); +define("MAILAN_52", "Lastmod"); +define("MAILAN_53", "Admins"); +define("MAILAN_54", "Self"); +define("MAILAN_55", "Userclass"); +define("MAILAN_56", "Send Mail"); +define("MAILAN_57", "Keep SMTP session alive"); +define("MAILAN_58", "There is a problem with the attachment:"); +define("MAILAN_59", "Mailing Progress"); +define("MAILAN_60", "Sending..."); +define("MAILAN_61", "There are no remaining emails to be sent."); +define("MAILAN_62", "Emails sent:"); +define("MAILAN_63", "Emails failed:"); +define("MAILAN_64", "Total time elapsed:"); +define("MAILAN_65", "seconds"); +define("MAILAN_66", "Cancelled Successfully"); +define("MAILAN_67", "Use 'POP before SMTP' authentication"); + + + + + + +?> \ No newline at end of file diff --git a/e107_languages/English/admin/lan_menus.php b/e107_languages/English/admin/lan_menus.php new file mode 100644 index 000000000..6c385a305 --- /dev/null +++ b/e107_languages/English/admin/lan_menus.php @@ -0,0 +1,56 @@ +SHOWN on the following pages"); +define("MENLAN_27", "This menu will only be HIDDEN on the following pages"); +define("MENLAN_28", "Enter one page per line, enter enough of the url to distinguish it properly. If you need the ending of the url to match exactly, use a ! at the end of the page name
    For example: page.php?1!"); + +define("MENLAN_29", "Select Layout"); +define("MENLAN_30", "To see the menu areas and their positions for custom layouts, select the custom layout here:"); +define("MENLAN_31", "Default Layout"); +define("MENLAN_32", "Newsheader Layout"); +define("MENLAN_33", "Custom Layout"); +define("MENLAN_34", "Embedded"); +define("MENLAN_35", "Configure Menus"); +define("MENLAN_36", "Choose the menu(s) to activate"); +define("MENLAN_37", "and where to activate them."); +define("MENLAN_38", "Hold down CTRL to select multiple menus."); + + +?> \ No newline at end of file diff --git a/e107_languages/English/admin/lan_message.php b/e107_languages/English/admin/lan_message.php new file mode 100644 index 000000000..3adb69460 --- /dev/null +++ b/e107_languages/English/admin/lan_message.php @@ -0,0 +1,28 @@ + \ No newline at end of file diff --git a/e107_languages/English/admin/lan_meta.php b/e107_languages/English/admin/lan_meta.php new file mode 100644 index 000000000..465f8a8bc --- /dev/null +++ b/e107_languages/English/admin/lan_meta.php @@ -0,0 +1,27 @@ + \ No newline at end of file diff --git a/e107_languages/English/admin/lan_modcomment.php b/e107_languages/English/admin/lan_modcomment.php new file mode 100644 index 000000000..74a3f7ab5 --- /dev/null +++ b/e107_languages/English/admin/lan_modcomment.php @@ -0,0 +1,34 @@ + \ No newline at end of file diff --git a/e107_languages/English/admin/lan_newspost.php b/e107_languages/English/admin/lan_newspost.php new file mode 100644 index 000000000..76dcb7782 --- /dev/null +++ b/e107_languages/English/admin/lan_newspost.php @@ -0,0 +1,173 @@ + or leave blank to disable."); +define("NWSLAN_103", "re-post"); +define("NWSLAN_104", "by"); +define("NWSLAN_105", "Check box to update date stamp of news item to current time"); +define("NWSLAN_106", "Submit-News maybe accessed by:"); +define("NWSLAN_107", "Enable WYSIWYG editor on Submit-News page."); +define("NWSLAN_108", "on"); + +define("NWSLAN_111", "Show new date header"); +define("NWSLAN_112", "If this box is ticked, a box containing the date will be displayed above news items posted on a new day, useful for distinguishing posts on different days"); + +define("NWSLAN_113", "Use non-standard template for news layout"); +define("NWSLAN_114", "if the theme you're using has a news layout template, use this instead of the generic layout"); + +define("NWSLAN_115", "News posts to display in archive ?"); +define("NWSLAN_116", "First update the preferences with the changed display per page setting, then update again after setting the news archive preference. (0 is un-activated)"); +define("NWSLAN_117", "set the title for the news archive"); +// define("NWSLAN_118", "View Images"); already defined above. +define("NWSLAN_119", "Settings Saved"); +define("NWSLAN_120", "Text to show at the top of Submit News"); + +define("LAN_NEWS_5", "Error! - Was unable to update news item into database!"); +define("LAN_NEWS_6", "News entered into database."); +define("LAN_NEWS_7", "Error! - Was unable to enter news item into database!"); +define("LAN_NEWS_9", "Title only is set - only the news title will be shown"); +define("LAN_NEWS_10", "This news post is inactive (It will be not shown on front page). "); +define("LAN_NEWS_11", "This news post is active (it will be shown on front page). "); +define("LAN_NEWS_12", "Comments are turned on."); +define("LAN_NEWS_13", "Comments are turned off."); +define("LAN_NEWS_14", "
    Activation period: "); +define("LAN_NEWS_15", "Body length: "); +define("LAN_NEWS_16", "b. Extended length: "); +define("LAN_NEWS_17", "b."); +define("LAN_NEWS_18", "Info"); +define("LAN_NEWS_19", "Now"); +define("LAN_NEWS_21", "News updated in database."); + +define("LAN_NEWS_22", "Thumbnail"); +define("LAN_NEWS_23", "Choose an image for this news item"); +define("LAN_NEWS_24", "Image + Auto-Thumbnail"); +define("LAN_NEWS_25", "Auto-Thumbnail size"); +define("LAN_NEWS_26", "add new upload"); +define("LAN_NEWS_27", "Summary"); + +define("LAN_NEWS_28", "Sticky"); +define("LAN_NEWS_29", "Select if news item will be sticky"); +define("LAN_NEWS_30", "If selected, news item will appear above all others"); +define("LAN_NEWS_31", "This news post is sticky (it will be shown above all other items). "); +define("LAN_NEWS_32", "Date stamp"); +define("LAN_NEWS_33", "Set the date stamp for the current news item"); + +define("LAN_NEWS_34", "Trackback"); +define("LAN_NEWS_35", "Add trackback URLs"); +define("LAN_NEWS_36", "Pingback (send a pingback to all URLs in this post)"); +define("LAN_NEWS_37", "Trackback URLs: (one URL per line)"); +define("LAN_NEWS_38", "Insert images"); + +define("LAN_NEWS_39", "click on file to insert at cursor position"); +define("LAN_NEWS_40", "Insert download links"); + +define("LAN_NEWS_42", "Files"); +// define("LAN_NEWS_43", "(no images in /e107_images/newspost_images)"); // deprecated see lan_admin.php +define("LAN_NEWS_44", "Trackback not enabled."); + +define("LAN_NEWS_45", "ID"); + +define("LAN_NEWS_46", "News item not updated as no changes were made."); +// define("LAN_NEWS_47", "Image"); // already defined above. +define("LAN_NEWS_48", "No Image"); + +define("LAN_NEWS_49", "Render-type"); + +?> diff --git a/e107_languages/English/admin/lan_notify.php b/e107_languages/English/admin/lan_notify.php new file mode 100644 index 000000000..532b8104c --- /dev/null +++ b/e107_languages/English/admin/lan_notify.php @@ -0,0 +1,38 @@ + diff --git a/e107_languages/English/admin/lan_plugin.php b/e107_languages/English/admin/lan_plugin.php new file mode 100644 index 000000000..e33c931f8 --- /dev/null +++ b/e107_languages/English/admin/lan_plugin.php @@ -0,0 +1,88 @@ +your menus page."); + +// define("EPL_CANCEL", "Cancel"); use LAN_CANCEL instead !! +// define("EPL_EMAIL", "email"); +define("EPL_WEBSITE", "Website"); +// define("EPL_OPTIONS", "Options"); use LAN_OPTIONS instead! +define("EPL_NOINSTALL", "No install required, just activate from your menus screen. To uninstall, delete the "); +define("EPL_DIRECTORY", "directory."); +define("EPL_NOINSTALL_1", "No install required, to remove delete the "); +define("EPL_UPGRADE", "Upgrade"); + +define("EPL_ADLAN_50", "Comments successfully deleted"); + +define("EPL_ADLAN_53", "Directory not writable"); +define("EPL_ADLAN_54", "Please select the option for uninstalling the plugin:"); +define("EPL_ADLAN_55", "Uninstall plugin"); + +define("EPL_ADLAN_57", "Delete plugin tables"); +define("EPL_ADLAN_58", "If the tables are not removed, the plugin can be reinstalled with no data loss. The creation of tables during the reinstall will fail. Tables will have to be manually deleted to remove."); +define("EPL_ADLAN_59", "Delete plugin files"); +define("EPL_ADLAN_60", "e107 will attempt to remove all plugin related files."); +// define("EPL_ADLAN_61", "Confirm uninstall"); // duplicated. can be deleted. +define("EPL_ADLAN_62", "Cancel uninstall"); +define("EPL_ADLAN_63", "Uninstall:"); + +define("LAN_UPGRADE_SUCCESSFUL", "Upgrade Successful"); +define("LAN_INSTALL_SUCCESSFUL", "Installation Successful"); + + +?> \ No newline at end of file diff --git a/e107_languages/English/admin/lan_prefs.php b/e107_languages/English/admin/lan_prefs.php new file mode 100644 index 000000000..6e6d62924 --- /dev/null +++ b/e107_languages/English/admin/lan_prefs.php @@ -0,0 +1,190 @@ +you are sure you know what you are doing!"); +define("PRFLAN_76", "Enable Image-code verification during signup."); +define("PRFLAN_77", "Admin Display Options "); +define("PRFLAN_78", "Leave blank to disable"); +define("PRFLAN_80", "Click here to view"); +define("PRFLAN_81", "Enable Image-code verification during login."); +define("PRFLAN_83", "example"); +define("PRFLAN_87", "Comments"); +define("PRFLAN_88", "Turn on nested comments"); +define("PRFLAN_89", "Display new comment icon"); +define("PRFLAN_90", "Allow posters to edit their comments"); + +define("CUSTSIG_1", "Settings Saved!"); +define("CUSTSIG_2", "Real Name:"); +define("CUSTSIG_3", "Website:"); +define("CUSTSIG_4", "Birthday:"); +define("CUSTSIG_5", "Location:"); +define("CUSTSIG_6", "Signature:"); +define("CUSTSIG_7", "Avatar:"); +define("CUSTSIG_8", "Time-Zone:"); +define("CUSTSIG_12", "Hide"); +define("CUSTSIG_13", "Fields"); +define("CUSTSIG_14", "Display"); +define("CUSTSIG_15", "Required"); +define("CUSTSIG_16", "Minimum Length for Passwords"); +define("CUSTSIG_17", "Subscribe to content/mailouts"); +define("CUSTSIG_18", "Disallow usernames"); +define("CUSTSIG_19", "usernames containing the following text will be rejected, separate entries by commas"); + +define("PRFLAN_91", "If someone is attacking your site by multiple requests to your server, his IP will be automatically banned ! Don't replace a correct server config !!!"); +define("PRFLAN_92", "Secure signup verification -- hide password in email?"); +define("PRFLAN_93", "strftime function page at php.net"); +define("PRFLAN_94", "here"); +define("PRFLAN_95", "Display plugins info:"); +define("PRFLAN_96", "Will display info on all admin pages for each plugin supporting this type of feature"); +define("PRFLAN_97", "Unique 'Plugins info' menu:"); +define("PRFLAN_98", "If unchecked, each plugin will display its own info in an individual menu. If checked all info will be displayed in one menu."); +define("PRFLAN_101", "Text rendering"); +define("PRFLAN_102", "Replace clickable URLs"); +define("PRFLAN_103", "If ticked, and 'Make Clickable' (above) is also ticked, posted URLs are displayed as a hyperlink using text from the textbox below. This keeps very long URLs from breaking layout."); +define("PRFLAN_104", "URL replacement text"); +define("PRFLAN_105", "Replacement visible text for clickable URLs. Image can be used by using <img> tag, with full path to image"); +define("PRFLAN_106", "Core preferences saved to database."); +define("PRFLAN_107", "Email link replace text"); +define("PRFLAN_108", "text to replace email links with, image can be used by using <img> tag, with full path to image"); +define("PRFLAN_109", "Wrap long words in main text"); +define("PRFLAN_110", "words longer than the length entered will be wrapped onto a new line"); +define("PRFLAN_111", "Wrap long words in menu text"); +define("PRFLAN_112", "On"); +define("PRFLAN_113", "Off"); +define("PRFLAN_116", "Allow HTML posting"); +define("PRFLAN_117", "This will allow users to post HTML code anywhere on the site, select the userclass to allow this."); +define("PRFLAN_118", "Use Geshi for syntax highlighting"); +define("PRFLAN_119", "Geshi is an open source multi-language syntax highlighter, see http://qbnz.com/highlighter/ for more information"); +define("PRFLAN_120", "Default Geshi syntax language"); +define("PRFLAN_121", "if no language is specified in the code bbtag, this language will be used for highlighting"); +define("PRFLAN_122", "Enable WYSIWYG textareas"); +define("PRFLAN_123", "Will display a what-you-see-is-what-you-get editor in textareas when available. Applies only to Admins and Users that are allowed to post HTML."); +define("PRFLAN_124", "Use 'classic' nextprev look"); +define("PRFLAN_125", "Turning this on will show the nextprev pages as 1 2 3 ... 21 22 23, instead of the new look with the dropdown."); +define("PRFLAN_126", "Text to display on signup page"); +define("PRFLAN_127", "Make URLs clickable"); +define("PRFLAN_128", "Turning this on will convert posted URLs to hyperlinks"); +define("PRFLAN_129", "Disallow multiple logins"); +define("PRFLAN_130", "Activating this will prevent more than one person logging in with the same username/password (login detail sharing)"); +define("PRFLAN_131", "Activate use of [php] bbcode"); +define("PRFLAN_132", "Activating this will allow authorized users to post [php] code in certain areas"); +define("PRFLAN_133", "GD extension required, not found"); +define("PRFLAN_134", "Redirect all requests to site URL"); +define("PRFLAN_135", "for example, if your site URL above is set http://foo.com, anyone requesting http://www.foo.com will be redirected to http://foo.com"); +define("PRFLAN_136", "Maximum Signups permitted from the same IP address."); +define("PRFLAN_137", "Display Memory Usage"); +define("PRFLAN_138", "Enable Image-code verification during forgotten password."); +define("PRFLAN_139", "Display warning when main administrator password hasn't changed for at least 30 days"); +define("PRFLAN_140", "Text to display after signup form has been submitted."); +define("PRFLAN_141", "Allow registration using XML User Profiles"); +define("PRFLAN_142", "Flood Only"); +define("PRFLAN_143", "Failed Login Only"); +define("PRFLAN_144", "Flood & Failed Login"); +define("PRFLAN_145", "Links in new window"); +define("PRFLAN_146", "Tick here to make all links open in a new window (this will apply sitewide). "); +define("PRFLAN_147", "Developer Mode"); +define("PRFLAN_148", "Activate developer functions. This is for developers only. Do not use on production sites for security reasons."); +define("PRFLAN_149", "Advanced Features"); +define("PRFLAN_150", "Select e107 authentication method"); +define("PRFLAN_151", "e107 - No alternate authentication methods installed"); + +define("PRFLAN_31", "Email Verification"); +define("PRFLAN_152", "No Verification"); +define("PRFLAN_153", "Admin Approval"); +define("PRFLAN_154", "New user verification method
    If 'Admin Approval' is selected, it is recommended that you enable email notification on user signup here."); + +define("PRFLAN_155", "Display Name available to"); +define("PRFLAN_156", "Reset ALL Display Names"); +define("PRFLAN_157", "All Display Names have been reset to the Login Name"); +define("PRFLAN_158", "Display Name maximum length"); +define("PRFLAN_159", "viewing this page with"); + +define("PRFLAN_160", "Check remote servers when validating email addresses."); +define("PRFLAN_161", "Disable all comments on the site"); + +define("PRFLAN_162", "Site Contact Information"); +define("PRFLAN_163", "e.g. Company Name, Address, Phone, etc."); + +define("PRFLAN_164", "Allow users to email copy of contact email to self"); +define("PRFLAN_165", "Possible opening for allowing spam, use with caution"); +define("PRFLAN_166", "Show emoticon images on comment form?"); + +define("PRFLAN_167", "Make entering an email addresses optional"); // subject to change. +define("PRFLAN_168", "Site Contact Person(s)"); +define("PRFLAN_169", "If the chosen group contains more than one person, the user will be asked to select a person from the group."); + +define("PRFLAN_170", "Use reverse DNS to allow host banning"); +define("PRFLAN_171", "Turning this option on will allow you to ban users by hostname, rather then just IP or email address.
    NOTE: This may affect pageload times on some hosts"); + + +?> \ No newline at end of file diff --git a/e107_languages/English/admin/lan_search.php b/e107_languages/English/admin/lan_search.php new file mode 100644 index 000000000..c5a33feaa --- /dev/null +++ b/e107_languages/English/admin/lan_search.php @@ -0,0 +1,63 @@ + diff --git a/e107_languages/English/admin/lan_theme.php b/e107_languages/English/admin/lan_theme.php new file mode 100644 index 000000000..5eb5f3e36 --- /dev/null +++ b/e107_languages/English/admin/lan_theme.php @@ -0,0 +1,62 @@ +'".PREVIEWTHEMENAME."' theme. It has not been set as the main theme for your site, it has been activated to provide a preview of how the theme looks.
    To set this theme as your site theme, return to your theme manager and select 'Set As Site Theme'.
    To preview more themes please click here"); +define("TPVLAN_2", "Theme Preview"); +define("TPVLAN_3", "Main site theme set to"); +define("TPVLAN_4", "Author"); +define("TPVLAN_5", "Website"); +define("TPVLAN_6", "Release date"); +define("TPVLAN_7", "Information"); +define("TPVLAN_8", "Options"); +define("TPVLAN_9", "Preview Theme"); +define("TPVLAN_10", "Set As Site Theme"); +define("TPVLAN_11", "Version"); +define("TPVLAN_12", "No preview available"); + +define("TPVLAN_13", "Upload theme (.zip or .tar.gz format)"); +define("TPVLAN_14", "Upload Theme"); +define("TPVLAN_15", "The file could not be uploaded as the ".e_THEME." folder does not have the correct permissions - please CHMOD to 777 and re-upload the file."); +define("TPVLAN_16", "Admin Message"); +define("TPVLAN_17", "That file does not appear to be a valid .zip or .tar archive."); +define("TPVLAN_18", "An error has occurred, unable to un-archive the file"); +define("TPVLAN_19", "Your theme has been uploaded and unzipped, please scroll down to see your theme in the list."); +define("TPVLAN_20", "Auto theme upload and extraction is disabled as your themes folder does not have the correct permissions - please CHMOD your e107_themes folder to 777."); + +define("TPVLAN_21", "This is the currently selected site theme"); + +define("TPVLAN_22", "This theme has multiple stylesheets"); +define("TPVLAN_23", "default stylesheet"); +define("TPVLAN_24", "no information"); +define("TPVLAN_25", "To choose which stylesheet to use, please go to preferences and click on 'Theme'."); + +define("TPVLAN_26", "Theme Manager"); +define("TPVLAN_27", "Please select stylesheet to use"); +define("TPVLAN_28", "on"); +define("TPVLAN_29", "off"); +define("TPVLAN_30", "Preload Theme Images:"); + +define("TPVLAN_31", "This is the currently selected admin theme"); +define("TPVLAN_32", "Set As Admin Theme"); + +define("TPVLAN_33", "Current Site Theme"); +define("TPVLAN_34", "Current Admin Theme"); +define("TPVLAN_35", "Save options"); +define("TPVLAN_36", "Admin Message"); +define("TPVLAN_37", "Theme options saved"); +define("TPVLAN_38", "Upload Theme"); +define("TPVLAN_39", "Available Themes"); +define("TPVLAN_40", "Admin theme set to"); + +define("TPVLAN_41", "Please select admin layout style to use"); +define("TPVLAN_42", "Save admin options"); +define("TPVLAN_43", "Admin options saved"); +?> \ No newline at end of file diff --git a/e107_languages/English/admin/lan_ugflag.php b/e107_languages/English/admin/lan_ugflag.php new file mode 100644 index 000000000..6341b1b4b --- /dev/null +++ b/e107_languages/English/admin/lan_ugflag.php @@ -0,0 +1,20 @@ + \ No newline at end of file diff --git a/e107_languages/English/admin/lan_updateadmin.php b/e107_languages/English/admin/lan_updateadmin.php new file mode 100644 index 000000000..2d850d15f --- /dev/null +++ b/e107_languages/English/admin/lan_updateadmin.php @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/e107_languages/English/admin/lan_upload.php b/e107_languages/English/admin/lan_upload.php new file mode 100644 index 000000000..ac9462007 --- /dev/null +++ b/e107_languages/English/admin/lan_upload.php @@ -0,0 +1,72 @@ +Note binary is only suitable for smaller files under approximately 500kb"); +define("UPLLAN_31", "Flatfile"); +define("UPLLAN_32", "Binary"); +define("UPLLAN_33", "Maximum file size"); +define("UPLLAN_34", "Maximum upload size in bytes - leave blank to conform to php.ini setting ( php.ini setting is"); +define("UPLLAN_35", "Allowed file types"); +define("UPLLAN_36", "Please enter one type per line"); +define("UPLLAN_37", "Permission"); +define("UPLLAN_38", "Select to allow only certain users to upload"); +define("UPLLAN_39", "Submit"); + +define("UPLLAN_41", "Please note - file uploads are disabled from your php.ini, it will not be possible to upload files until you set it to On."); + +define("UPLLAN_42", "Actions"); +define("UPLLAN_43", "Uploads"); +define("UPLLAN_44", "Upload"); + +define("UPLLAN_45", "Are you sure you want to delete the following file..."); + +define("UPLAN_COPYTODLM", "copy to download manager"); +define("UPLAN_IS", "is "); +define("UPLAN_ARE", "are "); +define("UPLAN_COPYTODLS", "Copy to Downloads"); + +define("UPLLAN_48", "For security reasons allowed file types has been moved out of the database into a +flatfile located in your admin directory. To use, rename the file e107_admin/filetypes_.php to e107_admin/filetypes.php +and add a comma delimited list of file type extensions to it. You should not allow the upload of .html, .txt, etc., as an attacker may upload a file of this type which includes malicious javascript. You should also, of course, not allow +the upload of .php files or any other type of executable script."); + + +?> \ No newline at end of file diff --git a/e107_languages/English/admin/lan_userclass.php b/e107_languages/English/admin/lan_userclass.php new file mode 100644 index 000000000..275ff849d --- /dev/null +++ b/e107_languages/English/admin/lan_userclass.php @@ -0,0 +1,24 @@ + \ No newline at end of file diff --git a/e107_languages/English/admin/lan_userclass2.php b/e107_languages/English/admin/lan_userclass2.php new file mode 100644 index 000000000..b0ddffbc4 --- /dev/null +++ b/e107_languages/English/admin/lan_userclass2.php @@ -0,0 +1,41 @@ + \ No newline at end of file diff --git a/e107_languages/English/admin/lan_userinfo.php b/e107_languages/English/admin/lan_userinfo.php new file mode 100644 index 000000000..a95172381 --- /dev/null +++ b/e107_languages/English/admin/lan_userinfo.php @@ -0,0 +1,20 @@ + \ No newline at end of file diff --git a/e107_languages/English/admin/lan_users.php b/e107_languages/English/admin/lan_users.php new file mode 100644 index 000000000..47e6ba449 --- /dev/null +++ b/e107_languages/English/admin/lan_users.php @@ -0,0 +1,192 @@ +This option is ignored if user signups are admin moderated"); +define("USRLAN_95", "minutes"); + + +define("USRLAN_112", "Resend Email"); +define("USRLAN_113", "Registration details for"); +define("USRLAN_114", "Dear"); +define("USRLAN_115", "Thanks for your registration."); +define("USRLAN_116", "Please confirm that you wish to resend a confirmation email to:"); +define("USRLAN_117", "Click the button below to test the following email:"); +define("USRLAN_118", "Test Email"); + +define("USRLAN_120", "Set Classes"); +define("USRLAN_121", "Mailing"); +define("USRLAN_122", "Welcome to"); +define("USRLAN_123", "Your registration has been received and created."); +define("USRLAN_124", "Your account is currently marked as being inactive, to activate your account please go to the following link"); +define("USRLAN_125", "From"); + +define("USRLAN_126", "Allow users to rate users"); +define("USRLAN_127", "Allow comments in user profile"); + +define("USRLAN_128", "Login name"); + +define("USRLAN_130", "Enable online user tracking"); +define("USRLAN_131", "You must enable this option to use online user tracking options, like online.php, forum online info and online menus"); +define("USRLAN_132", "Enable"); + +define("USRLAN_133", "Force user to update settings"); +define("USRLAN_134", "Enabling this option will automatically send the user to their user-settings if a required user field is not filled."); + +define("USRLAN_135", "No IP address found in user's info; IP not banned"); +define("USRLAN_136", "Multiple users found with IP address of {IP}; IP not banned."); +define("USRLAN_137", "Users IP address of {IP} banned."); + +define("LAN_MAINADMIN","Main Admin"); +define("LAN_ADMIN","Admin"); +define("LAN_NOTVERIFIED","Not Verified"); +define("LAN_BANNED","Banned"); + +define("DUSRLAN_1", "ID"); +define("DUSRLAN_2", "Display Name"); +define("DUSRLAN_3", "Username"); +define("DUSRLAN_4", "Custom Title"); +define("DUSRLAN_5", "Password"); +define("DUSRLAN_6", "Session"); +define("DUSRLAN_7", "Email"); +define("DUSRLAN_8", "Website"); +define("DUSRLAN_9", "ICQ"); +define("DUSRLAN_10", "AIM"); +define("DUSRLAN_11", "MSN"); +define("DUSRLAN_12", "Location"); +define("DUSRLAN_13", "Birthday"); +define("DUSRLAN_14", "Signature"); +define("DUSRLAN_15", "Image"); +define("DUSRLAN_16", "Timezone"); +define("DUSRLAN_17", "Hide Email"); +define("DUSRLAN_18", "Join Date"); +define("DUSRLAN_19", "Last Visit"); +define("DUSRLAN_20", "Current Visit"); +define("DUSRLAN_21", "Last Post"); +define("DUSRLAN_22", "Chatbox Posts"); +define("DUSRLAN_23", "Comments"); +define("DUSRLAN_24", "Forum Posts"); +define("DUSRLAN_25", "IP"); +define("DUSRLAN_26", "Ban"); +define("DUSRLAN_27", "Prefs"); +define("DUSRLAN_28", "New"); +define("DUSRLAN_29", "Viewed"); +define("DUSRLAN_30", "Visits"); +define("DUSRLAN_31", "Admin"); +define("DUSRLAN_32", "Real Name"); +define("DUSRLAN_33", "User Class"); +define("DUSRLAN_34", "Perms"); +define("DUSRLAN_35", "Picture"); +define("DUSRLAN_36", "Password Change"); +define("DUSRLAN_37", "XUP"); + +define("USRLAN_138", "Unverified users"); +define("USRLAN_139", "Your account has been activated.\n\nYou can visit {SITEURL} and log into the site using the login information you provided."); + +define("USRLAN_140", "Email Re-sent to"); +define("USRLAN_141", "Failed to Re-send email to"); +define("USRLAN_142", "with the following activation link"); + +define("LAN_BOUNCED","Bounced"); +define("USRLAN_143", "Check For Bounces"); +define("USRLAN_144", "Resend Confirmation Email to All"); +define("USRLAN_145", "Bounced users"); +define("USRLAN_146", "Member information is available to"); + +?> diff --git a/e107_languages/English/admin/lan_users_extended.php b/e107_languages/English/admin/lan_users_extended.php new file mode 100755 index 000000000..e73c9c0dc --- /dev/null +++ b/e107_languages/English/admin/lan_users_extended.php @@ -0,0 +1,107 @@ + For DB table see help."); +define("EXTLAN_18", "Required"); +define("EXTLAN_19", "Users will be required to enter a value in this field when updating their settings."); +define("EXTLAN_20", "Determines which users this field will apply to."); +define("EXTLAN_21", "This will determine who will see this field in their usersettings."); +define("EXTLAN_22", "This will determine who can see the value in the user page
    NOTE: Setting this to 'Read Only' will make it visible to Admin and the member only."); +define("EXTLAN_23", "Add Extended Field"); +define("EXTLAN_24", "Update Extended Field"); +define("EXTLAN_25", "move down"); +define("EXTLAN_26", "move up"); +define("EXTLAN_27", "Confirm Delete"); +define("EXTLAN_28", "No extended fields defined"); +define("EXTLAN_29", "Extended user fields saved."); +define("EXTLAN_30", "Extended field deleted"); +// define("EXTLAN_31", "Extended Field Menu"); +// define("EXTLAN_32", "Extended front page"); +define("EXTLAN_33", "Cancel Edit"); +define("EXTLAN_34", "Extended Fields"); +define("EXTLAN_35", "Categories"); +define("EXTLAN_36", "No assigned Category"); +define("EXTLAN_37", "No categories defined"); +define("EXTLAN_38", "Category name"); +define("EXTLAN_39", "Add category"); +define("EXTLAN_40", "Category created"); +define("EXTLAN_41", "Category deleted"); +define("EXTLAN_42", "Update Category"); +define("EXTLAN_43", "Category Updated"); +define("EXTLAN_44", "Category"); +define("EXTLAN_45", "Add New Field"); +define("EXTLAN_46", "Help"); +define("EXTLAN_47", "Add new parameter"); +define("EXTLAN_48", "Add new value"); +define("EXTLAN_49", "Allow user to hide"); +define("EXTLAN_50", "Setting this to yes will allow the user to hide this value from non-admins"); +define("EXTLAN_51", "Any valid w3c parameter may be entered here
    ie class='tbox' size='40' maxlength='80'"); +define("EXTLAN_52", "regex validation code"); +define("EXTLAN_53", "Enter the regex code that will need to be matched to make it a valid entry
    **regex delimiters are required**"); +define("EXTLAN_54", "regex failure text"); +define("EXTLAN_55", "Enter the error message that will be shown if the regex validation fails."); +define("EXTLAN_56", "Predefined Fields"); +define("EXTLAN_57", "Activated"); +define("EXTLAN_58", "Not Activated"); +define("EXTLAN_59", "Activate"); +define("EXTLAN_60", "Deactivate"); +define("EXTLAN_61", "None"); + +define("EXTLAN_62", "Table"); +define("EXTLAN_63", "Field Id"); +define("EXTLAN_64", "Display Value"); + +define("EXTLAN_65", "No - Will not show on signup page"); +define("EXTLAN_66", "Yes - Will show on signup page"); +define("EXTLAN_67", "No - Show on signup page"); + +define("EXTLAN_68", "Field:"); +define("EXTLAN_69", "has been activated"); +define("EXTLAN_70", "ERROR!! Field:"); +define("EXTLAN_71", "was not activated!"); +define("EXTLAN_72", "has been deactivated"); +define("EXTLAN_73", "was not deactivated!"); +define("EXTLAN_74", "is a reserved field name and can not be used."); + + +//textbox +define("EXTLAN_HELP_1", "Parameters:
    size - size of field
    maxlength - max length of field

    class - css class of field
    style - css style string

    regex - regex validation code
    regexfail - validation fail text"); +//radio buttons +define("EXTLAN_HELP_2", "This will be the radio buttons help text"); +//dropdown +define("EXTLAN_HELP_3", "This will be the dropdown help text"); +//db field +define("EXTLAN_HELP_4", "Values:
    There should be three values given ALWAYS:
    1. dbtable
    2. field containing id
    3. field containing value

    "); +//textarea +define("EXTLAN_HELP_5", "This will be the Textarea help text"); +//integer +define("EXTLAN_HELP_6", "This will be the Integer help text"); +//date +define("EXTLAN_HELP_7", "This will be the date help text"); + +?> \ No newline at end of file diff --git a/e107_languages/English/admin/lan_wmessage.php b/e107_languages/English/admin/lan_wmessage.php new file mode 100644 index 000000000..613fbf6f6 --- /dev/null +++ b/e107_languages/English/admin/lan_wmessage.php @@ -0,0 +1,34 @@ + \ No newline at end of file diff --git a/e107_languages/English/lan_banner.php b/e107_languages/English/lan_banner.php new file mode 100644 index 000000000..9f6ecd465 --- /dev/null +++ b/e107_languages/English/lan_banner.php @@ -0,0 +1,38 @@ + \ No newline at end of file diff --git a/e107_languages/English/lan_comment.php b/e107_languages/English/lan_comment.php new file mode 100644 index 000000000..242913733 --- /dev/null +++ b/e107_languages/English/lan_comment.php @@ -0,0 +1,77 @@ + \ No newline at end of file diff --git a/e107_languages/English/lan_contact.php b/e107_languages/English/lan_contact.php new file mode 100644 index 000000000..9b66acd76 --- /dev/null +++ b/e107_languages/English/lan_contact.php @@ -0,0 +1,35 @@ + \ No newline at end of file diff --git a/e107_languages/English/lan_date.php b/e107_languages/English/lan_date.php new file mode 100644 index 000000000..455a8acaf --- /dev/null +++ b/e107_languages/English/lan_date.php @@ -0,0 +1,35 @@ + \ No newline at end of file diff --git a/e107_languages/English/lan_download.php b/e107_languages/English/lan_download.php new file mode 100644 index 000000000..962d9fa6f --- /dev/null +++ b/e107_languages/English/lan_download.php @@ -0,0 +1,100 @@ +Thank you."); +define("LAN_dl_49", "Click here to return to download"); +define("LAN_dl_50", "Report broken download to an administrator"); +define("LAN_dl_51", "Reporting download: "); +define("LAN_dl_52", "Guest"); +define("LAN_dl_53", "Click to view download"); +define("LAN_dl_54", "An administrator will be made aware of this download, please leave a message if you feel it necessary."); +define("LAN_dl_55", "Do not use this form to contact the admin for any other reason."); +// define("LAN_dl_56", "Report broken download"); already defined above. +define("LAN_dl_57", "reported by"); +define("LAN_dl_58", "The following download has been reported as broken from site"); +define("LAN_dl_59", "Reported by: "); +define("LAN_dl_60", "Broken download report from"); + +define("LAN_dl_61", "Download Error"); +define("LAN_dl_62", "You have been prevented from downloading this file; you have exceeded your download quota"); +define("LAN_dl_63", "You do not have the correct permissions to download this file."); +define("LAN_dl_64", "Back"); +define("LAN_dl_65", "File Not Found"); + +define("LAN_dl_66", "Select download mirror"); + +define("LAN_dl_67", "Please select mirror to use ..."); +define("LAN_dl_68", "Mirror Host"); +// define("LAN_dl_69", "Download"); // duplicate +define("LAN_dl_70", "Location"); +define("LAN_dl_71", "About"); + +define("LAN_dl_72", "Requesting file: "); +define("LAN_dl_73", "Downloads from this mirror: "); +define("LAN_dl_74", "Total downloads from this mirror: "); + +define("LAN_dl_75", "no image available "); +define("LAN_dl_76", "Go to page"); + +?> diff --git a/e107_languages/English/lan_email.php b/e107_languages/English/lan_email.php new file mode 100644 index 000000000..205626c73 --- /dev/null +++ b/e107_languages/English/lan_email.php @@ -0,0 +1,37 @@ + \ No newline at end of file diff --git a/e107_languages/English/lan_equery_secure.php b/e107_languages/English/lan_equery_secure.php new file mode 100644 index 000000000..21c1dfc16 --- /dev/null +++ b/e107_languages/English/lan_equery_secure.php @@ -0,0 +1,19 @@ + \ No newline at end of file diff --git a/e107_languages/English/lan_error.php b/e107_languages/English/lan_error.php new file mode 100644 index 000000000..621a87c5f --- /dev/null +++ b/e107_languages/English/lan_error.php @@ -0,0 +1,49 @@ +Reset_Core utility to rebuild your core settings.
    After rebuilding your core please save a backup from the admin/sql screen."); +define("LAN_ERROR_29", "[5]: Field(s) have been left blank. Please resubmit the form and fill in the required fields."); +define("LAN_ERROR_30", "[6]: Unable to form a valid connection to mySQL. Please check that your e107_config.php contains the correct information."); +define("LAN_ERROR_31", "[7]: mySQL is running but database ({$mySQLdefaultdb}) couldn't be connected to.
    Please check it exists and that your e107_config.php contains the correct information."); +define("LAN_ERROR_32", "To complete the upgrade, copy the following text into your e107_config.php file:"); + + +?> diff --git a/e107_languages/English/lan_fpw.php b/e107_languages/English/lan_fpw.php new file mode 100644 index 000000000..04ede40b2 --- /dev/null +++ b/e107_languages/English/lan_fpw.php @@ -0,0 +1,48 @@ +Please contact the site administrator for more details."); +define("LAN_FPW8","The password for username"); +define("LAN_FPW9","has been successfully changed.

    The new password is:"); +define("LAN_FPW10","Please"); +define("LAN_FPW11","log in now"); +define("LAN_FPW12","and immediately change your password, for security purposes."); + +define("LAN_FPW13", "please follow the instructions in the email to validate your password."); +define("LAN_FPW14", "has been submitted by someone with the IP of"); +define("LAN_FPW15", "This does not mean your password has yet been reset. You must navigate to the link shown below to complete the reset process."); +define("LAN_FPW16", "If you did not request to have your password reset and you do NOT want it reset, you may simply ignore this email"); +define("LAN_FPW17", "The link below will be valid for 48 hours."); + +?> \ No newline at end of file diff --git a/e107_languages/English/lan_installer.php b/e107_languages/English/lan_installer.php new file mode 100644 index 000000000..486367834 --- /dev/null +++ b/e107_languages/English/lan_installer.php @@ -0,0 +1,124 @@ += 3.23 to function correctly."); +define("LANINS_014", "File Permissions"); +define("LANINS_015", "PHP Version"); +define("LANINS_016", "MySQL"); +define("LANINS_017", "PASS"); +define("LANINS_018", "Ensure all the listed files exist and are writable by the server. This normally involves CHMODing them 777, but environments vary - contact your host if you have any problems."); +define("LANINS_019", "The version of PHP installed on your server isn't capable of running e107. e107 requires a PHP version of at least 4.3.0 to run correctly. Either upgrade your PHP version, or contact your host for an upgrade."); +define("LANINS_020", "Continue Installation"); +define("LANINS_021", "2"); +define("LANINS_022", "MySQL Server Details"); +define("LANINS_023", "Please enter your MySQL settings here. + +If you have root permissions you can create a new database by ticking the box, if not you must create a database or use a pre-existing one. + +If you have only one database use a prefix so that other scripts can share the same database. +If you do not know your MySQL details contact your web host."); +define("LANINS_024", "MySQL Server:"); +define("LANINS_025", "MySQL Username:"); +define("LANINS_026", "MySQL Password:"); +define("LANINS_027", "MySQL Database:"); +define("LANINS_028", "Create Database?"); +define("LANINS_029", "Table prefix:"); +define("LANINS_030", "The MySQL server you would like e107 to use. It can also include a port number. e.g. \"hostname:port\" or a path to a local socket e.g. \":/path/to/socket\" for the localhost."); +define("LANINS_031", "The username you wish e107 to use for connecting to your MySQL server"); +define("LANINS_032", "The Password for the user you just entered"); +define("LANINS_033", "The MySQL database you wish e107 to reside in, sometimes referred to as a schema. If the user has database create permissions you can opt to create the database automatically if it doesn't already exist."); +define("LANINS_034", "The prefix you wish e107 to use when creating the e107 tables. Useful for multiple installs of e107 in one database schema."); +define("LANINS_035", "Continue"); +define("LANINS_036", "3"); +define("LANINS_037", "MySQL Connection Verification"); +define("LANINS_038", " and Database Creation"); +define("LANINS_039", "Please make sure you fill in all fields, most importantly, MySQL Server, MySQL Username and MySQL Database (These are always required by the MySQL Server)"); +define("LANINS_040", "Errors"); +define("LANINS_041", "e107 was unable to establish a connection to the MySQL server using the information you entered. Please return to the last page and ensure the information is correct."); +define("LANINS_042", "Connection to the MySQL server established and verified."); +define("LANINS_043", "Unable to create database, please ensure you have the correct permissions to create databases on your server."); +define("LANINS_044", "Successfully created database."); +define("LANINS_045", "Please click on the button to proceed to next stage."); +define("LANINS_046", "5"); +define("LANINS_047", "Administrator Details"); +define("LANINS_048", "Go Back To Last Step"); +define("LANINS_049", "The two passwords you entered are not the same. Please go back and try again."); +define("LANINS_050", "XML Extension"); +define("LANINS_051", "Installed"); +define("LANINS_052", "Not Installed"); +define("LANINS_053", "e107 .700 requires the PHP XML Extension to be installed. Please contact your host or read the information at "); +define("LANINS_054", " before continuing"); +define("LANINS_055", "Install Confirmation"); +define("LANINS_056", "6"); +define("LANINS_057", " e107 now has all the information it needs to complete the installation. + +Please click the button to create the database tables and save all your settings. + +"); +define("LANINS_058", "7"); +define("LANINS_060", "Unable to read the sql datafile + +Please ensure the file core_sql.php exists in the /e107_admin/sql directory."); +define("LANINS_061", "e107 was unable to create all of the required database tables. +Please clear the database and rectify any problems before trying again."); + +define("LANINS_062", "[b]Welcome to your new website![/b] +e107 has installed successfully and is now ready to accept content.
    Your administration section is [link=e107_admin/admin.php]located here[/link], click to go there now. You will have to login using the name and password you entered during the installation process. + +[b]Support[/b] +e107 Homepage: [link=http://e107.org]http://e107.org[/link], you will find the FAQ and documentation here. +Forums: [link=http://e107.org/e107_plugins/forum/forum.php]http://e107.org/e107_plugins/forum/forum.php[/link] + +[b]Downloads[/b] +Plugins: [link=http://e107coders.org]http://e107coders.org[/link] +Themes: [link=http://e107themes.org]http://e107themes.org[/link] + +Thank you for trying e107, we hope it fulfils your website needs. +(You can delete this message from your admin section.)"); + +define("LANINS_063", "Welcome to e107"); + +define("LANINS_069", "e107 has been successfully installed! + +For security reasons you should now set the file permissions on the e107_config.php file back to 644. + +Also please delete install.php from your server after you have clicked the button below. +"); +define("LANINS_070", "e107 was unable to save the main config file to your server. + +Please ensure the e107_config.php file has the correct permissions"); +define("LANINS_071", "Finalising Installation"); + +define("LANINS_072", "Admin Username"); +define("LANINS_073", "This is the name you will use to login into the site. If you wish to use this as your display name also"); +define("LANINS_074", "Admin Display Name"); +define("LANINS_075", "This is the name that you wish your users to see displayed in your profile, forums and other areas. If you wish to use the same as your login name then leave this blank."); +define("LANINS_076", "Admin Password"); +define("LANINS_077", "Please type the admin password you wish to use here"); +define("LANINS_078", "Admin Password Confirmation"); +define("LANINS_079", "Please type the admin password again for confirmation"); +define("LANINS_080", "Admin Email"); +define("LANINS_081", "Enter your email address"); + +define("LANINS_082", "user@yoursite.com"); + +// Better table creation error reporting +define("LANINS_083", "MySQL Reported Error:"); +define("LANINS_084", "The installer could not establish a connection to the database"); +define("LANINS_085", "The installer could not select database:"); + +define("LANINS_086", "Admin Username, Admin Password and Admin Email are required fields. Please return to the last page and ensure the information is correctly entered."); diff --git a/e107_languages/English/lan_links.php b/e107_languages/English/lan_links.php new file mode 100644 index 000000000..abb2aed5b --- /dev/null +++ b/e107_languages/English/lan_links.php @@ -0,0 +1,50 @@ + \ No newline at end of file diff --git a/e107_languages/English/lan_login.php b/e107_languages/English/lan_login.php new file mode 100644 index 000000000..31e6c4123 --- /dev/null +++ b/e107_languages/English/lan_login.php @@ -0,0 +1,38 @@ +here."); +define("LAN_303", "Incorrect code entered."); +define("LAN_304", "That username/password combination is already in use."); +define("LAN_LOGIN_1", "User name"); +define("LAN_LOGIN_2", "User password"); +define("LAN_LOGIN_3", "Protected server"); +define("LAN_LOGIN_4", "Please enter your details to gain access."); +define("LAN_LOGIN_5", "Click here to Sign-Up"); +define("LAN_LOGIN_6", "Not accepting new members at this time"); +define("LAN_LOGIN_7", "Enter visible code"); +define("LAN_LOGIN_8", "Remember Me"); +define("LAN_LOGIN_9", "Log In"); +define("LAN_LOGIN_10", "Click to login"); +define("LAN_LOGIN_11", "Register as a New User"); +define("LAN_LOGIN_12", "Forgot Password"); +define("LAN_LOGIN_13", "Please enter text in image"); + +define("LAN_LOGIN_14", "User attempted to login with unrecognised user name"); +define("LAN_LOGIN_15", "User attempted to login with incorrect password"); +define("LAN_LOGIN_16", "User attempted to login with username/password combination that was already in use"); +define("LAN_LOGIN_17", "User password (hashed)"); +define("LAN_LOGIN_18", "Auto-ban: More than 10 failed login attempts"); +define("LAN_LOGIN_19", "> 10 failed login attempts"); + +?> \ No newline at end of file diff --git a/e107_languages/English/lan_mail_handler.php b/e107_languages/English/lan_mail_handler.php new file mode 100644 index 000000000..44184d9de --- /dev/null +++ b/e107_languages/English/lan_mail_handler.php @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/e107_languages/English/lan_membersonly.php b/e107_languages/English/lan_membersonly.php new file mode 100644 index 000000000..aa9f13290 --- /dev/null +++ b/e107_languages/English/lan_membersonly.php @@ -0,0 +1,21 @@ +log in"); +define("LAN_MEMBERS_3","or register as a member"); +define("LAN_MEMBERS_4","Click here to return to front page"); + + +?> \ No newline at end of file diff --git a/e107_languages/English/lan_news.php b/e107_languages/English/lan_news.php new file mode 100644 index 000000000..6c41f8ab6 --- /dev/null +++ b/e107_languages/English/lan_news.php @@ -0,0 +1,48 @@ +only the news title will be shown
    "); +define("LAN_NEWS_10", "This news post is inactive (It will be not shown on front page). "); +define("LAN_NEWS_11", "This news post is active (it will be shown on front page). "); +define("LAN_NEWS_12", "Comments are turned on. "); +define("LAN_NEWS_13", "Comments are turned off. "); +define("LAN_NEWS_14", "
    Activation period: "); +define("LAN_NEWS_15", "Body length: "); +define("LAN_NEWS_16", "b. Extended length: "); +define("LAN_NEWS_17", "b."); +define("LAN_NEWS_18", "Info:"); +define("LAN_NEWS_19", "Now"); +define("LAN_NEWS_20", "News updated in database for the following language: "); +define("LAN_NEWS_21", "News updated in database."); +// define("LAN_NEWS_22", "Go to page: "); +define("LAN_NEWS_23", "News Categories"); +define("LAN_NEWS_24", "create pdf of this news item"); + +define("LAN_NEWS_82", "News - Category"); +define("LAN_NEWS_83", "No news items at the moment - please check back soon."); +define("LAN_NEWS_84", "News Items"); +define("LAN_NEWS_99", "Comments"); +define("LAN_NEWS_100", "On"); +define("LAN_NEWS_307", "Total posts in this category: "); +define("LAN_NEWS_462", "No news items for specified month"); + +?> \ No newline at end of file diff --git a/e107_languages/English/lan_newspost.php b/e107_languages/English/lan_newspost.php new file mode 100644 index 000000000..1c6b64545 --- /dev/null +++ b/e107_languages/English/lan_newspost.php @@ -0,0 +1,44 @@ + \ No newline at end of file diff --git a/e107_languages/English/lan_notify.php b/e107_languages/English/lan_notify.php new file mode 100644 index 000000000..0d1d412bd --- /dev/null +++ b/e107_languages/English/lan_notify.php @@ -0,0 +1,36 @@ + \ No newline at end of file diff --git a/e107_languages/English/lan_np.php b/e107_languages/English/lan_np.php new file mode 100644 index 000000000..9ac7e50d4 --- /dev/null +++ b/e107_languages/English/lan_np.php @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/e107_languages/English/lan_online.php b/e107_languages/English/lan_online.php new file mode 100644 index 000000000..194455a99 --- /dev/null +++ b/e107_languages/English/lan_online.php @@ -0,0 +1,64 @@ + \ No newline at end of file diff --git a/e107_languages/English/lan_page.php b/e107_languages/English/lan_page.php new file mode 100644 index 000000000..8fbff5e3b --- /dev/null +++ b/e107_languages/English/lan_page.php @@ -0,0 +1,27 @@ + \ No newline at end of file diff --git a/e107_languages/English/lan_parser_functions.php b/e107_languages/English/lan_parser_functions.php new file mode 100644 index 000000000..5e8502b43 --- /dev/null +++ b/e107_languages/English/lan_parser_functions.php @@ -0,0 +1,16 @@ + diff --git a/e107_languages/English/lan_prefs.php b/e107_languages/English/lan_prefs.php new file mode 100644 index 000000000..a5bcf24f1 --- /dev/null +++ b/e107_languages/English/lan_prefs.php @@ -0,0 +1,19 @@ +e107, which is released under the terms of the GNU GPL License."); +define("LAN_PREF_4", "censored"); +define("LAN_PREF_5", "Forums"); + +?> \ No newline at end of file diff --git a/e107_languages/English/lan_print.php b/e107_languages/English/lan_print.php new file mode 100644 index 000000000..2523fd626 --- /dev/null +++ b/e107_languages/English/lan_print.php @@ -0,0 +1,27 @@ + \ No newline at end of file diff --git a/e107_languages/English/lan_rate.php b/e107_languages/English/lan_rate.php new file mode 100644 index 000000000..e503293e4 --- /dev/null +++ b/e107_languages/English/lan_rate.php @@ -0,0 +1,20 @@ + \ No newline at end of file diff --git a/e107_languages/English/lan_ren_help.php b/e107_languages/English/lan_ren_help.php new file mode 100644 index 000000000..03e185ac9 --- /dev/null +++ b/e107_languages/English/lan_ren_help.php @@ -0,0 +1,66 @@ + \ No newline at end of file diff --git a/e107_languages/English/lan_search.php b/e107_languages/English/lan_search.php new file mode 100644 index 000000000..43c6ca61f --- /dev/null +++ b/e107_languages/English/lan_search.php @@ -0,0 +1,119 @@ + \ No newline at end of file diff --git a/e107_languages/English/lan_signup.php b/e107_languages/English/lan_signup.php new file mode 100644 index 000000000..1c169e385 --- /dev/null +++ b/e107_languages/English/lan_signup.php @@ -0,0 +1,119 @@ +case-sensitive."); +define("LAN_401", "Your account has now been activated, please"); +define("LAN_402", "Registration activated"); +define("LAN_403", "Welcome to"); +define("LAN_404", "Registration details for"); +define("LAN_405", "This stage of registration is complete. You will receive a confirmation email containing your login details. Please follow the link in the email to complete the signup process and activate your account."); +define("LAN_406", "Thank you!"); +define("LAN_407", "Please keep this email for your own information. Your password has been encrypted and cannot be retrieved if you misplace or forget it. You can however request a new password if this happens.\n\nThanks for your registration.\n\nFrom"); +define("LAN_408", "A user with that email address already exists. Please use the 'forgot password' screen to retrieve your password."); +define("LAN_SIGNUP_1", "Min."); +define("LAN_SIGNUP_2", "chars."); +define("LAN_SIGNUP_3", "Code verification failed."); +define("LAN_SIGNUP_4", "Your password must be at least "); +define("LAN_SIGNUP_5", " characters long."); +define("LAN_SIGNUP_6", "Your "); +define("LAN_SIGNUP_7", " is required"); +define("LAN_SIGNUP_8", "Thank you!"); +define("LAN_SIGNUP_9", "Unable to proceed."); +define("LAN_SIGNUP_10", "Yes"); +define("LAN_SIGNUP_11", "."); + +define("LAN_409", "Invalid characters in username"); +define("LAN_410", "Enter code visible in the image"); +define("LAN_411", "That display name already exists in the database, please choose a different display name"); + + +define("LAN_SIGNUP_12", "please keep your username and password written down in a safe place as if lost they cannot be retrieved."); +define("LAN_SIGNUP_13", "You can now log in from the Login box, or from here."); +define("LAN_SIGNUP_14", "here"); +define("LAN_SIGNUP_15", "Please contact the main site admin"); +define("LAN_SIGNUP_16", "if you require assistance."); +define("LAN_SIGNUP_17", "Please certify you are 13 or over the age of 13."); +define("LAN_SIGNUP_18", "Your registration has been received and created with the following login information ..."); +define("LAN_SIGNUP_19", "Username:"); +define("LAN_SIGNUP_20", "Password:"); +define("LAN_SIGNUP_21", "Your account is currently marked as being inactive, to activate your account please go to the following link ..."); +define("LAN_SIGNUP_22", "click here"); +define("LAN_SIGNUP_23", "to login."); +define("LAN_SIGNUP_24", "Thank you for registering at"); +define("LAN_SIGNUP_25", "Upload your avatar"); +define("LAN_SIGNUP_26", "Upload your photograph"); +define("LAN_SIGNUP_27", "Show"); +define("LAN_SIGNUP_28", "choice of Content/Mail-lists"); +define("LAN_SIGNUP_29", "A verification email will be sent to the email address you enter here so it must be valid."); +define("LAN_SIGNUP_30", "If you do not wish to display your email address on this site, please tick the 'hide email address' box."); + +define("LAN_SIGNUP_31", "URL to your XUP file"); +define("LAN_SIGNUP_32", "What's an XUP file?"); +define("LAN_SIGNUP_33", "Type path or choose avatar"); +define("LAN_SIGNUP_34", "Please note: Any image uploaded to this server that is deemed inappropriate by the administrators will be deleted immediately."); +define("LAN_SIGNUP_35", "Click here to register using an XUP file"); +define("LAN_SIGNUP_36", "An error has occurred creating your user information, please contact the site admin"); + +define("LAN_LOGINNAME", "Login Name"); +define("LAN_PASSWORD", "Password"); +define("LAN_USERNAME", "Display Name"); +define("LAN_EMAIL_01", "Dear"); +define("LAN_EMAIL_04", "Please keep this email for your own information."); +define("LAN_EMAIL_05", "Your password has been encrypted and cannot be retrieved if you misplace or forget it. You can however request a new password if this happens."); +define("LAN_EMAIL_06", "Thanks for your registration."); + +define("LAN_SIGNUP_37", "This stage of registration is complete. The site admin will need to approve your membership. Once this has been done you will receive a confirmation email alerting you that your membership has been approved."); +define("LAN_SIGNUP_38", "You entered two different email addresses. Please enter a valid email address in the two fields provided"); +define("LAN_SIGNUP_39", "Re-type Email Address:"); + +// 0.7.6 +define("LAN_SIGNUP_40", "Activation not necessary"); +define("LAN_SIGNUP_41", "Your account is already activated."); +define("LAN_SIGNUP_42", "There was a problem, the registration mail was not sent, please contact the website administrator."); +define("LAN_SIGNUP_43", "Email Sent"); +define("LAN_SIGNUP_44", "Activation email sent to:"); +define("LAN_SIGNUP_45", "Please check your inbox."); +define("LAN_SIGNUP_47", "Resend Activation Email"); +define("LAN_SIGNUP_48", "Username or Email"); +define("LAN_SIGNUP_49", "If you registered with the wrong email address, type a new one and your password here:"); +define("LAN_SIGNUP_50", "New Email"); +define("LAN_SIGNUP_51", "Old Password"); +define("LAN_SIGNUP_52", "Incorrect Password"); +define("LAN_SIGNUP_53", "field failed validation test"); + + + +?> diff --git a/e107_languages/English/lan_sitedown.php b/e107_languages/English/lan_sitedown.php new file mode 100644 index 000000000..ff0ea3daa --- /dev/null +++ b/e107_languages/English/lan_sitedown.php @@ -0,0 +1,15 @@ + diff --git a/e107_languages/English/lan_sitelinks.php b/e107_languages/English/lan_sitelinks.php new file mode 100644 index 000000000..bfe5bbfec --- /dev/null +++ b/e107_languages/English/lan_sitelinks.php @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/e107_languages/English/lan_submitnews.php b/e107_languages/English/lan_submitnews.php new file mode 100644 index 000000000..ffed21f25 --- /dev/null +++ b/e107_languages/English/lan_submitnews.php @@ -0,0 +1,32 @@ + \ No newline at end of file diff --git a/e107_languages/English/lan_top.php b/e107_languages/English/lan_top.php new file mode 100644 index 000000000..d07584415 --- /dev/null +++ b/e107_languages/English/lan_top.php @@ -0,0 +1,32 @@ + \ No newline at end of file diff --git a/e107_languages/English/lan_upload.php b/e107_languages/English/lan_upload.php new file mode 100644 index 000000000..74cbd2f34 --- /dev/null +++ b/e107_languages/English/lan_upload.php @@ -0,0 +1,41 @@ + \ No newline at end of file diff --git a/e107_languages/English/lan_upload_handler.php b/e107_languages/English/lan_upload_handler.php new file mode 100644 index 000000000..9d4801bbf --- /dev/null +++ b/e107_languages/English/lan_upload_handler.php @@ -0,0 +1,25 @@ + \ No newline at end of file diff --git a/e107_languages/English/lan_user.php b/e107_languages/English/lan_user.php new file mode 100644 index 000000000..cad87c5d3 --- /dev/null +++ b/e107_languages/English/lan_user.php @@ -0,0 +1,67 @@ + \ No newline at end of file diff --git a/e107_languages/English/lan_user_extended.php b/e107_languages/English/lan_user_extended.php new file mode 100644 index 000000000..2a2393180 --- /dev/null +++ b/e107_languages/English/lan_user_extended.php @@ -0,0 +1,46 @@ + \ No newline at end of file diff --git a/e107_languages/English/lan_user_select.php b/e107_languages/English/lan_user_select.php new file mode 100644 index 000000000..5d2d5005e --- /dev/null +++ b/e107_languages/English/lan_user_select.php @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/e107_languages/English/lan_userclass.php b/e107_languages/English/lan_userclass.php new file mode 100644 index 000000000..5f5bf6cee --- /dev/null +++ b/e107_languages/English/lan_userclass.php @@ -0,0 +1,19 @@ + \ No newline at end of file diff --git a/e107_languages/English/lan_userposts.php b/e107_languages/English/lan_userposts.php new file mode 100644 index 000000000..b5f7423c4 --- /dev/null +++ b/e107_languages/English/lan_userposts.php @@ -0,0 +1,31 @@ + \ No newline at end of file diff --git a/e107_languages/English/lan_usersettings.php b/e107_languages/English/lan_usersettings.php new file mode 100644 index 000000000..5216dd57e --- /dev/null +++ b/e107_languages/English/lan_usersettings.php @@ -0,0 +1,110 @@ + \ No newline at end of file diff --git a/e107_languages/index.html b/e107_languages/index.html new file mode 100644 index 000000000..e69de29bb diff --git a/e107_plugins/admin_menu/admin_menu.php b/e107_plugins/admin_menu/admin_menu.php new file mode 100644 index 000000000..2b9b2d70c --- /dev/null +++ b/e107_plugins/admin_menu/admin_menu.php @@ -0,0 +1,61 @@ +db_Select("plugin", "*", "plugin_installflag=1")) { + while ($row = $sql->db_Fetch()) { + include(e_PLUGIN.$row['plugin_path']."/plugin.php"); + if ($eplug_conffile) { + $array_functions[] = array(e_PLUGIN.$row['plugin_path']."/".$eplug_conffile, $tp->toHtml($eplug_name,"","defs,emotes_off, no_make_clickable"), "P".$row['plugin_id']); + } + unset($eplug_conffile, $eplug_name, $eplug_caption, $eplug_icon_small); + } + } + + $array_functions = asortbyindex($array_functions, 1); + + $amtext = "
    + +
    "; + $ns->tablerender(LAN_ADMIN, $amtext, 'admin_menu'); +} + +function render_admin_links($link, $title, $perms) { + if (getperms($perms)) { + return ""; + } +} +?> diff --git a/e107_plugins/alt_auth/alt_auth_adminmenu.php b/e107_plugins/alt_auth/alt_auth_adminmenu.php new file mode 100755 index 000000000..5773cdcd9 --- /dev/null +++ b/e107_plugins/alt_auth/alt_auth_adminmenu.php @@ -0,0 +1,42 @@ + \ No newline at end of file diff --git a/e107_plugins/alt_auth/alt_auth_conf.php b/e107_plugins/alt_auth/alt_auth_conf.php new file mode 100755 index 000000000..a1c563fdf --- /dev/null +++ b/e107_plugins/alt_auth/alt_auth_conf.php @@ -0,0 +1,115 @@ +\n"; +foreach($authlist as $a) +{ + $s = ($pref['auth_method'] == $a) ? "selected='selected'" : ""; + $auth_dropdown .= "\n"; +} +$auth_dropdown .= "\n"; + +if(isset($message)) +{ + $ns -> tablerender("", "
    ".$message."
    "); +} + +$text = " +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    ".LAN_ALT_1.": ". +$auth_dropdown." +
    ".LAN_ALT_6.":
    +
    ".LAN_ALT_7."
    +
    + +
    ".LAN_ALT_8.":
    +
    ".LAN_ALT_9."
    +
    + +
    +
    + +
    +
    +
    "; + +$ns -> tablerender("
    ".LAN_ALT_3."
    ", $text); + + +require_once(e_ADMIN."footer.php"); + +function alt_auth_conf_adminmenu() +{ + alt_auth_adminmenu(); +} + + +?> \ No newline at end of file diff --git a/e107_plugins/alt_auth/alt_auth_login_class.php b/e107_plugins/alt_auth/alt_auth_login_class.php new file mode 100755 index 000000000..36a7bb8d3 --- /dev/null +++ b/e107_plugins/alt_auth/alt_auth_login_class.php @@ -0,0 +1,80 @@ +Available === FALSE) + { + return false; + } + + $login_result = $_login -> login($username, $userpass, $newvals); + + if($login_result === AUTH_SUCCESS ) + { + $sql = new db; + if(!$sql -> db_Select("user","*","user_loginname='{$username}' ")) + { + // User not found in e107 database - add it now. + $qry = "INSERT INTO #user (user_id, user_loginname, user_name, user_join) VALUES ('0','{$username}','{$username}',".time().")"; + $sql -> db_Select_gen($qry); + } + // Set password and any other applicable fields + $qry="user_password='".md5($userpass)."'"; + foreach($newvals as $key => $val) + { + $qry .= " ,user_{$key}='{$val}' "; + } + $qry.=" WHERE user_loginname='{$username}' "; + $sql -> db_Update("user", $qry); + } + else + { + switch($login_result) + { + case AUTH_NOUSER: + if(!isset($pref['auth_nouser']) || !$pref['auth_nouser']) + { + $username=md5("xx_nouser_xx"); + } + break; + case AUTH_NOCONNECT: + if(!isset($pref['auth_noconn']) || !$pref['auth_noconn']) + { + $username=md5("xx_noconn_xx"); + } + break; + case AUTH_BADPASSWORD: + $userpass=md5("xx_badpassword_xx"); + break; + } + } + } +} +?> \ No newline at end of file diff --git a/e107_plugins/alt_auth/alt_auth_readme.txt b/e107_plugins/alt_auth/alt_auth_readme.txt new file mode 100755 index 000000000..810d1fde2 --- /dev/null +++ b/e107_plugins/alt_auth/alt_auth_readme.txt @@ -0,0 +1,52 @@ +/* +| Copyright (C) 2003 Thom Michelbrink +| +| Author: Thom Michelbrink mcfly@e107.org +| +*/ + +Purpose: + + This is a plugin for the E107 CMS system (e107.org). + This plugin will enable Alternate authorization functionality to your site. + +Requirements: + + This plugin requires e107 Verion 0.600+ + +############## INSTALLATION ####################### + +1) Upload all files to your e107_plugins directory on your server, retaining directory structure. +2) Go to the admin section of the website, go the to plugin manager and install the Alt auth. +3) Go to the admin section of the website and configure the Alternate Authorization setting. + +Until this is integrated into the e107 core. the following lines need to be added to the e107_handlers\login.php file. They need to be inserted into the userlogin() function, just after the 'global $pref;' line: + + if($pref['auth_method'] && $pref['auth_method'] != "e107"){ + $auth_file=e_PLUGIN."alt_auth/".$pref['auth_method']."_auth.php"; + if(file_exists($auth_file)){ + require_once(e_PLUGIN."alt_auth/alt_auth_login_class.php"); + $result = new alt_login($pref['auth_method'],$username, $userpass); + } + } + + +--- AUTHORIZATION TYPES -- +This version currently supports Active Directory and LDAP authorization types. Others could easily +be added though. + +The requirements to add a new auth type are: + +xxx_auth.php - Actual file the performs the authorization based on user input of uname / passwd. +xxx_conf.php - The file used to edit any configuration option for your auth type. + +The xxx_auth.php must contain a class named auth_login(), the class must contain a function named login($uname,$passwd). The login() function must return values of: +AUTH_SUCCESS - valid login +AUTH_NOUSER - User not found +AUTH_BADPASSWORD - Password is incorrect +----------------------------------------------------------------------------- + +Version history: + +11/11/2003 - Initial beta release + diff --git a/e107_plugins/alt_auth/alt_login_class.php b/e107_plugins/alt_auth/alt_login_class.php new file mode 100644 index 000000000..9fc06249d --- /dev/null +++ b/e107_plugins/alt_auth/alt_login_class.php @@ -0,0 +1,56 @@ + login($username,$userpass,$newvals); + + if($login_result === AUTH_SUCCESS ){ + $sql = new db; + if(!$sql -> db_Select("user","*","user_loginname='{$username}' ")){ + // User not found in e107 database - add it now. + $qry = "INSERT INTO ".MPREFIX."user (user_id, user_loginname, user_name, user_join) VALUES ('0', '{$username}', '{$username}', ".time().")"; + $sql -> db_Select_gen($qry); + } + // Set password and any other applicable fields + $qry="user_password='".md5($userpass)."'"; + foreach($newvals as $key => $val){ + $qry .= " ,user_{$key}='{$val}' "; + } + $qry.=" WHERE user_loginname='{$username}' "; + $sql -> db_Update("user",$qry); + } else { + switch($login_result){ + case AUTH_NOUSER: + $username=md5("xx_nouser_xx"); + break; + case AUTH_BADPASSWORD: + $userpass=md5("xx_badpassword_xx"); + break; + } + } + } +} +?> \ No newline at end of file diff --git a/e107_plugins/alt_auth/images/icon_ldap.png b/e107_plugins/alt_auth/images/icon_ldap.png new file mode 100755 index 0000000000000000000000000000000000000000..b3781e45c85e9c89e5895d08f3c11db160b75a1d GIT binary patch literal 1948 zcmV;N2V?k&P)U|{{6?#p1pkd>ecfJ&z?Qmfy*p_03yi&piubv^Cv$$J4dOz zyJt~+d_1SPxEM%`frEpSK}AJ{K}}7K!O6*i`^%T_8V3%X*0_HCIupQSr-0US6RmA|lG%*47Rz_Wu1RkkgkdP1q(1+ltfTay4CPpxR@Zc50-Mi0$ z;!MC$VFfwsA2`9_0005RLWIw)BqgOLL`KG$nwwjK6Xb^vpOIAjXJBS#0!G7MhDVQH zGQ4{A5f}unP@Mnx z@tfiF>FYqBzXAH1oq>&w1#CG4Gl6{%q6q>;^brl z$1fl@%#7er0AWID03d*f$OVjG!$IKs^@l(ozh+QSkYZ3$k^=jXg@qMv zG0aj>`T)s+*o2}0Ab^;NDSZC?`3LqnJ3A|bfB-KrXZ!<~0U!%NDION@u&fBfkSM_K z0Du5uBDUxS#XUPa8!+yF0kh&?paZ~l0W`>&;J$~kK{O~T2m}BFKmaijwwwX%b5M%@ z`t=9cQV<_f2r)n{W`MFGSrZllpzKNr00a=hGyn>IkncS_%z=sV3&Xp2pMaMC2S)*{ z9DrF0q9JTVC=hZ4KmZYy2!H?n2hMh&;1&}T1p6N32t*AFvz!6ydkD?S%1qF7fB<44 zCJ}=2Jt*P*{{07RF{CX3lSf1W%n`6c2^fJuJ~#{EObGx1L_}Ti4_x{&Gqb@PB%lz0 z)dLU<8KI#75#`|E0Op!+3|qHu1=bC~d<5bi2n}f|@$hgnJbd_=VcD`JKeudIbL9Q|SF3=MPjHzJ5I_VS0E%~helBqB25NXf zLW2>UD?p(GDQNzK3nXS{7KTHIjxsD-H0Rmr(?@py{{3S;Q1T!Uf52rvKmf52E{fUM zq@=_^G&orQ`~g-%|Cqp*gQ5ZyB_PNB`0GlV1t950~i9ofkFO|VZ(;CU$<>r zd+fu9Hy~ec2jU0B6mkFo#7L-BEGQ_f#K_1Jr>?H)Wn^Tk;o|7T%dYyDK~7$d;qN^@ zhFyF20&B&?e|GNNu6t1q;B87gV$hy z03zrBFE1~K@87?}irD|>&Yk=G`Q!V~GK$LQ^(`D2m>9Vk{+>Sf|JPrz<^MD_H5qht zbip}>jg1vraN!030YuONe0+Ssa_&DPq;bK(U}kCkpP%{HKPUdz^3qplGW-SR2+PkW zSoZP$61>AM&ZerW3aqrgFasM>;Oq&c@wSQq0*Igk6cv?r%gMltKwR-jHjX*_p&}hT}00BhM z0h*fH=Aofc+&_N&fCvDy-oLvy7}yR1bDN?!&_%)w44;lMs4INplM77NVFVUj4FCUu z>j+RGwtxRY51=kkX?PZ!`2Yb#&;d`MzF^wB_b{XY0!1<#I|IwZCk&RaKQM5;1)BSl zn}OlieTG+$-!Yutf0}`X?Ju}&hK2yJ@cPUJ4kjD`Ab7q5nhb5u-(6Z?-8hTh0A<^ z03uip01XiY#=kD8l7l8D5N6V0WY84mWYGP~$iT$}Y@6Ku!SMPi1H);c+zXV(1TcI+ iSr}-~3vA{C1Q-Ae^1W|ub(v290000 diff --git a/e107_plugins/alt_auth/languages/English/lan_ldap_auth.php b/e107_plugins/alt_auth/languages/English/lan_ldap_auth.php new file mode 100755 index 000000000..89b96b931 --- /dev/null +++ b/e107_plugins/alt_auth/languages/English/lan_ldap_auth.php @@ -0,0 +1,15 @@ +If LDAP - Enter BaseDN
    If AD - Enter domain"); +define("LDAPLAN_3", "LDAP Browsing user
    Full context of the user who is able to search the directory."); +define("LDAPLAN_4", "LDAP Browsing password
    Password for the LDAP Browsing user."); +define("LDAPLAN_5", "LDAP Version"); +define("LDAPLAN_6", "Configure LDAP auth"); +define("LDAPLAN_7", "eDirectory search filter:"); +define("LDAPLAN_8", "This will be used to ensure the username is in the correct tree,
    ie '(objectclass=inetOrgPerson)'"); +define("LDAPLAN_9", "Current search filter will be:"); +define("LDAPLAN_10", "Settings Updated"); +define("LDAPLAN_11", "WARNING: It appears as if the ldap module is not currently available, setting your auth method to LDAP will probably not work!"); +define("LDAPLAN_12", "Server Type"); +define("LDAPLAN_13", "Update settings"); +?> diff --git a/e107_plugins/alt_auth/languages/English/lan_otherdb_auth.php b/e107_plugins/alt_auth/languages/English/lan_otherdb_auth.php new file mode 100644 index 000000000..8a381ed3a --- /dev/null +++ b/e107_plugins/alt_auth/languages/English/lan_otherdb_auth.php @@ -0,0 +1,14 @@ + diff --git a/e107_plugins/alt_auth/ldap_auth.php b/e107_plugins/alt_auth/ldap_auth.php new file mode 100755 index 000000000..649631219 --- /dev/null +++ b/e107_plugins/alt_auth/ldap_auth.php @@ -0,0 +1,186 @@ + db_Select("alt_auth", "*", "auth_type = 'ldap' "); + while($row = $sql -> db_Fetch()) + { + $ldap[$row['auth_parmname']]=$row['auth_parmval']; + } + + $this->server = explode(",", $ldap['ldap_server']); + $this->serverType = $ldap['ldap_servertype']; + $this->dn = $ldap['ldap_basedn']; + $this->usr = $ldap['ldap_user']; + $this->pwd = $ldap['ldap_passwd']; + $this->ldapVersion = $ldap['ldap_version']; + $this->filter = (isset($ldap['ldap_edirfilter']) ? $ldap['ldap_edirfilter'] : ""); + + if(!function_exists('ldap_connect')) + { + $this->Available = FALSE; + return false; + } + + if(!$this -> connect()) + { + return AUTH_NOCONNECT; + } + } + + function connect() + { + foreach ($this->server as $key => $host) + { + $this->connection = ldap_connect($host); + if ( $this->connection) { + if($this -> ldapVersion == 3 || $this->serverType == "ActiveDirectory") + { + @ldap_set_option( $this -> connection, LDAP_OPT_PROTOCOL_VERSION, 3 ); + } + return true; + } + } + + $this->ldapErrorCode = -1; + $this->ldapErrorText = "Unable to connect to any server"; + return false; + } + + function close() + { + if ( !@ldap_close( $this->connection)) + { + $this->ldapErrorCode = ldap_errno( $this->connection); + $this->ldapErrorText = ldap_error( $this->connection); + return false; + } + else + { + return true; + } + } + + function login($uname, $pass) + { + /* Construct the full DN, eg:- + ** "uid=username, ou=People, dc=orgname,dc=com" + */ + if ($this->serverType == "ActiveDirectory") + { + $checkDn = "$uname@$this->dn"; + } + else + { + if ($this -> usr != '' && $this -> pwd != '') + { + $this -> result = ldap_bind($this -> connection, $this -> usr, $this -> pwd); + } + else + { + $this -> result = ldap_bind($this -> connection); + } + +// In ldap_auth.php, should look like this instead for eDirectory +// $query = ldap_search($this -> connection, $this -> dn, "cn=".$uname); + + if($this->serverType == "eDirectory") + { + $_filter = (isset($ldap['ldap_edirfilter']) ? $ldap['ldap_edirfilter'] : ""); + $current_filter = "(&(cn={$uname})".$this->filter.")"; + $query = ldap_search($this->connection, $this->dn, $current_filter); + } + else + { + $query = ldap_search($this->connection, $this->dn, "uid=".$uname); + } + + if ($query == false) + { +// Could not perform query to LDAP directory + return AUTH_NOCONNECT; + } + else + { + $query_result = ldap_get_entries($this -> connection, $query); + + if ($query_result["count"] != 1) + { + return AUTH_NOUSER; + } + else + { + $checkDn = $query_result[0]["dn"]; + $this -> close(); + $this -> connect(); + } + } + } + // Try and connect... + $this->result = ldap_bind($this -> connection, $checkDn, $pass); + if ( $this->result) + { + // Connected OK - login credentials are fine! + return AUTH_SUCCESS; + } + else + { + /* Login failed. Return false, together with the error code and text from + ** the LDAP server. The common error codes and reasons are listed below : + ** (for iPlanet, other servers may differ) + ** 19 - Account locked out (too many invalid login attempts) + ** 32 - User does not exist + ** 49 - Wrong password + ** 53 - Account inactive (manually locked out by administrator) + */ + $this->ldapErrorCode = ldap_errno( $this->connection); + $this->ldapErrorText = ldap_error( $this->connection); + + if($this -> ldapErrorCode == 32) + { + return AUTH_NOUSER; + } + if($this -> ldapErrorCode == 49) + { + return AUTH_BADPASSWORD; + } + // return error code as if it never connected, maybe change that in the future + return AUTH_NOCONNECT; + } + } +} +?> diff --git a/e107_plugins/alt_auth/ldap_conf.php b/e107_plugins/alt_auth/ldap_conf.php new file mode 100755 index 000000000..ab98ea0d5 --- /dev/null +++ b/e107_plugins/alt_auth/ldap_conf.php @@ -0,0 +1,133 @@ + $v) + { + if(preg_match("/ldap_/", $k)) + { + if($sql -> db_Select("alt_auth", "*", "auth_type='ldap' AND auth_parmname='{$k}' ")) + { + $sql -> db_Update("alt_auth", "auth_parmval='{$v}' WHERE auth_type='ldap' AND auth_parmname='{$k}' "); + } + else + { + $sql -> db_Insert("alt_auth", "'ldap','{$k}','{$v}' "); + } + } + } + $message = LDAPLAN_10; +} + +if(!function_exists('ldap_connect')) +{ + $message = "
    ".LDAPLAN_11."
    "; +} + +if($message) +{ + $ns->tablerender("","
    ".$message."
    "); +} + +$ldap['ldap_edirfilter'] == ""; +$sql -> db_Select("alt_auth", "*", "auth_type = 'ldap' "); +while($row = $sql->db_Fetch()) +{ + $ldap[$row['auth_parmname']] = $row['auth_parmval']; +} + +$current_filter = "(&(cn=[USERNAME]){$ldap['ldap_edirfilter']})"; + +$frm = new form; +$text = $frm -> form_open("POST",e_SELF); +$text .= ""; +$text .= ""; + +$text .= ""; + +$text .= ""; + +$text .= ""; + +$text .= ""; + +$text .= ""; + +$text .= ""; + +$text .= ""; + +$text .= "
    ".LDAPLAN_12.""; +$text .= $frm -> form_select_open("ldap_servertype"); +foreach($server_types as $v) +{ + $sel = ($ldap['ldap_servertype'] == $v) ? " Selected" : ""; + $text .= $frm -> form_option($v, $sel, $v); +} +$text .= $frm -> form_select_close(); +$text .= "
    ".LDAPLAN_1.""; +$text .= $frm -> form_text("ldap_server", 35, $ldap['ldap_server'], 120); +$text .= "
    ".LDAPLAN_2.""; +$text .= $frm -> form_text("ldap_basedn", 35, $ldap['ldap_basedn'], 120); +$text .= "
    ".LDAPLAN_3.""; +$text .= $frm -> form_text("ldap_user", 35, $ldap['ldap_user'], 120); +$text .= "
    ".LDAPLAN_4.""; +$text .= $frm -> form_text("ldap_passwd", 35, $ldap['ldap_passwd'], 120); +$text .= "
    ".LDAPLAN_5.""; +$text .= $frm -> form_select_open("ldap_version"); + +foreach($ldap_ver as $v) +{ + $sel = ($ldap['ldap_version'] == $v) ? " Selected" : ""; + $text .= $frm -> form_option($v, $sel, $v); +} + +$text .= $frm -> form_select_close(); +$text .= "
    ".LDAPLAN_7."
    ".LDAPLAN_8."
    "; +$text .= $frm -> form_text("ldap_edirfilter", 35, $ldap['ldap_edirfilter'], 120); +$text .= "
    ".LDAPLAN_9."
    {$current_filter}
    "; +$text .= $frm -> form_button("submit", "update", LDAPLAN_13); +$text .= "
    "; +$text .= $frm -> form_close(); + +$ns -> tablerender(LDAPLAN_6,$text); +require_once(e_ADMIN."footer.php"); + +function ldap_conf_adminmenu() +{ + alt_auth_adminmenu(); +} + +?> diff --git a/e107_plugins/alt_auth/otherdb_auth.php b/e107_plugins/alt_auth/otherdb_auth.php new file mode 100644 index 000000000..8ba070507 --- /dev/null +++ b/e107_plugins/alt_auth/otherdb_auth.php @@ -0,0 +1,147 @@ + db_Select("alt_auth", "*", "auth_type = 'otherdb' "); + while($row = $sql -> db_Fetch()) + { + $otherdb_conf[$row['auth_parmname']] = base64_decode(base64_decode($row['auth_parmval'])); + } + $class_name = "otherdb_".$otherdb_conf['otherdb_dbtype']."_class"; + + if($otherdb_conf['otherdb_dbtype'] == 'e107') + { + $class_name = "otherdb_mysql_class"; + } + + if(class_exists($class_name)) + { + $this->od = new $class_name; + } + else + { + return AUTH_NOCONNECT; + } + } + + function login($uname, $pword, &$newvals) + { + global $mySQLserver, $mySQLuser, $mySQLpassword, $mySQLdefaultdb, $sql; + $ret = $this->od->login($uname, $pword, $newvals); + $sql->db_Connect($mySQLserver, $mySQLuser, $mySQLpassword, $mySQLdefaultdb); + return $ret; + } + +} + +class otherdb_mysql_class +{ + + var $conf; + + function otherdb_mysql_class() + { + global $otherdb_conf; + $this->conf = $otherdb_conf; + } + + function login($uname, $pword, &$newvals) + { + + //Attempt to open connection to sql database + if(!$res = mysql_connect($this->conf['otherdb_server'], $this->conf['otherdb_username'], $this->conf['otherdb_password'])) + { + return AUTH_NOCONNECT; + } + + //Select correct db + if(!mysql_select_db($this->conf['otherdb_database'], $res)) + { + mysql_close($res); + return AUTH_NOCONNECT; + } + + if($this->conf['otherdb_dbtype'] == 'mysql') + { + $sel_fields = $this->conf['otherdb_password_field']; + $user_field = $this->conf['otherdb_user_field']; + } + else + { + $sel_fields = 'user_password, user_email, user_join'; + $user_field = "user_loginname"; + } + + + //Get record containing supplied login name + $qry = "SELECT {$sel_fields} FROM {$this->conf['otherdb_table']} WHERE {$user_field} = '{$uname}'"; + if(!$r1 = mysql_query($qry)) + { + mysql_close($res); + return AUTH_NOCONNECT; + } + if(!$row = mysql_fetch_array($r1)) + { + mysql_close($res); + return AUTH_NOUSER; + } + + //Compare password in db to supplied password + if($this->conf['otherdb_password_method'] == 'md5' || $this->conf['otherdb_dbtype'] == 'e107') + { + $goodpw = md5($pword) == $row[0]; + } + else + { + $goodpw = $pword == $row[0]; + } + if($goodpw) + { + //Close newly opened mysql connection + mysql_close($res); + if($this->conf['otherdb_dbtype'] == 'e107') + { + $newvals['email'] = $row[1]; + $newvals['join'] = $row[2]; + } + return AUTH_SUCCESS; + } + + mysql_close($res); + return AUTH_BADPASSWORD; + } +} + +?> \ No newline at end of file diff --git a/e107_plugins/alt_auth/otherdb_conf.php b/e107_plugins/alt_auth/otherdb_conf.php new file mode 100644 index 000000000..b1ea52094 --- /dev/null +++ b/e107_plugins/alt_auth/otherdb_conf.php @@ -0,0 +1,143 @@ +tablerender("","
    ".$message."
    "); +} + + +show_otherdb_form(); + +function show_otherdb_form() +{ + global $sql, $tp, $ns; + + $password_methods = array("md5", "plaintext"); + $db_types = array("e107" => "mysql - e107 database", "mysql" => "mysql - generic database"); + + $sql -> db_Select("alt_auth", "*", "auth_type = 'otherdb' "); + $parm = array(); + while($row = $sql->db_Fetch()) + { + $parm[$row['auth_parmname']] = base64_decode(base64_decode($row['auth_parmval'])); + } + + $frm = new form; + $text = $frm -> form_open("POST", e_SELF); + $text .= ""; + + $text .= ""; + + $text .= ""; + + $text .= ""; + + $text .= ""; + + $text .= ""; + + $text .= ""; + + $text .= ""; + + $text .= ""; + + $text .= ""; + + $text .= ""; + + $text .= ""; + + $text .= "
    ".OTHERDB_LAN_1.""; + $text .= $frm -> form_select_open("otherdb_dbtype"); + foreach($db_types as $k => $v) + { + $sel = ($parm['otherdb_dbtype'] == $k) ? " Selected" : ""; + $text .= $frm -> form_option($v, $sel, $k); + } + $text .= $frm -> form_select_close(); + $text .= "
    ".OTHERDB_LAN_2.""; + $text .= $frm -> form_text("otherdb_server", 35, $parm['otherdb_server'], 120); + $text .= "
    ".OTHERDB_LAN_3.""; + $text .= $frm -> form_text("otherdb_username", 35, $parm['otherdb_username'], 120); + $text .= "
    ".OTHERDB_LAN_4.""; + $text .= $frm -> form_text("otherdb_password", 35, $parm['otherdb_password'], 120); + $text .= "
    ".OTHERDB_LAN_5.""; + $text .= $frm -> form_text("otherdb_database", 35, $parm['otherdb_database'], 120); + $text .= "
    ".OTHERDB_LAN_6.""; + $text .= $frm -> form_text("otherdb_table", 35, $parm['otherdb_table'], 120); + $text .= "
    ".OTHERDB_LAN_11."
    ".OTHERDB_LAN_7.""; + $text .= $frm -> form_text("otherdb_user_field", 35, $parm['otherdb_user_field'], 120); + $text .= "
    ".OTHERDB_LAN_8.""; + $text .= $frm -> form_text("otherdb_password_field", 35, $parm['otherdb_password_field'], 120); + $text .= "
    ".OTHERDB_LAN_9.""; + $text .= $frm -> form_select_open("otherdb_password_method"); + foreach($password_methods as $v) + { + $sel = ($parm['otherdb_password_method'] == $v) ? " Selected" : ""; + $text .= $frm -> form_option($v, $sel, $v); + } + $text .= $frm -> form_select_close(); + $text .= "
    "; + $text .= $frm -> form_button("submit", "update", "Update settings"); + $text .= "
    "; + $text .= $frm -> form_close(); + + $ns -> tablerender(OTHERDB_LAN_10, $text); +} + +require_once(e_ADMIN."footer.php"); + + +function update_otherdb_prefs() +{ + global $sql; + foreach($_POST as $k => $v) + { + $v = base64_encode(base64_encode($v)); + + if(preg_match("/otherdb_/", $k)) + { + if($sql -> db_Select("alt_auth", "*", "auth_type='otherdb' AND auth_parmname='{$k}' ")) + { + $sql -> db_Update("alt_auth", "auth_parmval='{$v}' WHERE auth_type='otherdb' AND auth_parmname='{$k}' "); + } + else + { + $sql -> db_Insert("alt_auth", "'otherdb','{$k}','{$v}' "); + } + } + } + return "Settings Updated"; +} + +function otherdb_conf_adminmenu() +{ + alt_auth_adminmenu(); +} + +?> diff --git a/e107_plugins/alt_auth/plugin.php b/e107_plugins/alt_auth/plugin.php new file mode 100755 index 000000000..baae5399a --- /dev/null +++ b/e107_plugins/alt_auth/plugin.php @@ -0,0 +1,74 @@ + diff --git a/e107_plugins/alt_news/alt_news.php b/e107_plugins/alt_news/alt_news.php new file mode 100644 index 000000000..44399b77f --- /dev/null +++ b/e107_plugins/alt_news/alt_news.php @@ -0,0 +1,118 @@ +db_Select("news_category", "*", "category_id='".intval($category)."'"); + list($category_id, $category_name, $category_icon) = $sql->db_Fetch(); + $category_name = $aj->tpa($category_name); + if (strstr($category_icon, "../")) { + $category_icon = str_replace("../", "", e_BASE.$category_icon); + } else { + $category_icon = THEME.$category_icon; + } + + if ($count = $sql->db_Select("news", "*", "news_category='".intval($category)."' ORDER BY news_datestamp DESC")) { + while ($row = $sql->db_Fetch()) { + extract($row); + if ($news_title == "") { + $news_title = "Untitled"; + } + $datestamp = $gen->convert_date($news_datestamp, "short"); + $news_body = strip_tags(substr($news_body, 0, 100))." ..."; + $comment_total = $sql2->db_Count("comments", "(*)", "WHERE comment_item_id='".intval($news_id)."' AND comment_type='0' "); + $text .= "
    + bullet "; + + if ($news_allow_comments) { + $text .= "".$news_title.""; + } else { + $text .= "".$news_title.""; + } + $text .= "
    + ".LAN_NEWS_100." ".$datestamp." (".LAN_NEWS_99.": "; + if ($news_allow_comments) { + $text .= COMMENTOFFSTRING.")"; + } else { + $text .= $comment_total.")"; + } + $text .= "
    + ".$news_body." +

    \n"; + } + $text = "
    ". LAN_NEWS_307.$count." +

    ".$text; + $ns->tablerender(LAN_NEWS_82." '".$category_name."'", $text, 'alt_news'); + } + } + return TRUE; + } + + if ($sql->db_Select("news", "*", "news_class<255 AND (news_start=0 || news_start < ".time().") AND (news_end=0 || news_end>".time().") AND news_category='".intval($news_category)."' ORDER BY news_datestamp DESC LIMIT 0,".ITEMVIEW)) { + $sql2 = new db; + while (list($news['news_id'], $news['news_title'], $news['data'], $news['news_extended'], $news['news_datestamp'], $news['admin_id'], $news_category, $news['news_allow_comments'], $news['news_start'], $news['news_end'], $news['news_class']) = $sql->db_Fetch()) { + + if (check_class($news['news_class']) || !$news['news_class']) { + + if ($news['admin_id'] == 1 && $pref['siteadmin']) { + $news['admin_name'] = $pref['siteadmin']; + } + else if(!$news['admin_name'] = getcachedvars($news['admin_id'])) { + $sql2->db_Select("user", "user_name", "user_id='".intval($news['admin_id'])."' "); + list($news['admin_name']) = $sql2->db_Fetch(); + cachevars($news['admin_id'], $news['admin_name']); + } + + $sql2->db_Select("news_category", "*", "category_id='".intval($news_category)."' "); + + list($news['category_id'], $news['category_name'], $news['category_icon']) = $sql2->db_Fetch(); + $news['comment_total'] = $sql2->db_Count("comments", "(*)", "WHERE comment_item_id='".intval($news['news_id'])."' AND comment_type='0' "); + $ix->render_newsitem($news); + } else { + if ($pref['subnews_hide_news'] == 1) { + if ($news['admin_id'] == 1 && $pref['siteadmin']) { + $news['admin_name'] = $pref['siteadmin']; + } + else if(!$news['admin_name'] = getcachedvars($news['admin_id'])) { + $sql2->db_Select("user", "user_name", "user_id='".intval($news['admin_id'])."' "); + list($news['admin_name']) = $sql2->db_Fetch(); + cachevars($news['admin_id'], $news['admin_name']); + } + + $sql2->db_Select("news_category", "*", "category_id='".intval($news_category)."' "); + + list($news['category_id'], $news['category_name'], $news['category_icon']) = $sql2->db_Fetch(); + $ix->render_newsitem($news, "", "userclass"); + } + } + } + } +} + +?> \ No newline at end of file diff --git a/e107_plugins/banner_menu/banner_menu.php b/e107_plugins/banner_menu/banner_menu.php new file mode 100644 index 000000000..5f016ddf0 --- /dev/null +++ b/e107_plugins/banner_menu/banner_menu.php @@ -0,0 +1,89 @@ + banners and create a campaign, then add your banner to it +2. Add this line to this file ... + + $campaign = NAME_OF_YOUR_CAMPAIGN + +3. Save file +*/ + + +global $THEMES_DIRECTORY; +if (file_exists(THEME."banner_template.php")) { + require_once(THEME."banner_template.php"); +} else { + require_once(e_BASE.$THEMES_DIRECTORY."templates/banner_template.php"); +} + +if(isset($campaign)){ + $parm = (isset($campaign) ? $campaign : ""); + $bannersccode = file_get_contents(e_FILE."shortcode/banner.sc"); + $BANNER = eval($bannersccode); + $txt = $BANNER_MENU_START; + $txt .= preg_replace("/\{(.*?)\}/e", '$\1', $BANNER_MENU); + $txt .= $BANNER_MENU_END; + +}else{ + if (isset($menu_pref['banner_campaign']) && $menu_pref['banner_campaign']) + { + if(strstr($menu_pref['banner_campaign'], "|")) + { + $campaignlist = explode("|", $menu_pref['banner_campaign']); + $amount = ($menu_pref['banner_amount']<1 ? '1' : $menu_pref['banner_amount']); + $amount = ($amount > count($campaignlist) ? count($campaignlist) : $amount); + $keys = array_rand($campaignlist, $amount); + $parms = array(); + foreach($keys as $k=>$v){ + $parms[] = $campaignlist[$v]; + } + } + else + { + $parms[] = $menu_pref['banner_campaign']; + } + } + + $txt = $BANNER_MENU_START; + foreach($parms as $parm){ + $bannersccode = file_get_contents(e_FILE."shortcode/banner.sc"); + $BANNER = eval($bannersccode); + $txt .= preg_replace("/\{(.*?)\}/e", '$\1', $BANNER_MENU); + } + $txt .= $BANNER_MENU_END; +} + +$text = $txt; + +if (isset($menu_pref['banner_rendertype']) && $menu_pref['banner_rendertype'] == 2) +{ + $ns->tablerender($menu_pref['banner_caption'], $text); +} +else +{ + echo $text; +} + +?> \ No newline at end of file diff --git a/e107_plugins/banner_menu/config.php b/e107_plugins/banner_menu/config.php new file mode 100644 index 000000000..0dbcd7d22 --- /dev/null +++ b/e107_plugins/banner_menu/config.php @@ -0,0 +1,259 @@ + $v) { + if (strpos($k, "banner_") === 0) { + $menu_pref[$k] = $v; + } + } + + if (isset($_POST['catid'])) { + $array_cat = explode("-", $_POST['catid']); + for($i = 0; $i < count($array_cat); $i++) { + $cat .= $array_cat[$i]."|"; + } + $cat = substr($cat, 0, -1); + $menu_pref['banner_campaign'] = $cat; + } + + $sysprefs->setArray('menu_pref'); + $ns->tablerender("", "
    ".BANNER_MENU_L2."
    "); +} + +if (!$menu_pref['banner_caption']) { + $menu_pref['banner2_caption'] = BANNER_MENU_L1; +} + +$text = "
    +
    + + + + + + "; + +$array_cat_in = explode("|", $menu_pref['banner_campaign']); + +$c = 0; + $d = 0; +$sql2 = new db; +$category_total = $sql2->db_Select("banner", "DISTINCT(SUBSTRING_INDEX(banner_campaign, '^', 1)) as banner_campaign", "ORDER BY banner_campaign", "mode=no_where"); +while ($row = $sql2->db_Fetch()) { + extract($row); + if (in_array($banner_campaign, $array_cat_in)) { + $in_catname[$c] = $banner_campaign; + $c++; + } else { + $out_catname[$d] = $banner_campaign; + $d++; + } +} + +$text .= " + + + + + + + + + + + + + + + + + + + +
    ".BANNER_MENU_L3.": + +
    ".BANNER_MENU_L6." + + + + + + +
    ".BANNER_MENU_L7."
    + +
    ".BANNER_MENU_L8."
    +

    + + +
    + +
    ".BANNER_MENU_L10." +
    ".BANNER_MENU_L15."
    ".BANNER_MENU_L16."
    +
    +
    +
    "; + +$ns->tablerender(BANNER_MENU_L5, $text); + + +require_once(e_ADMIN."footer.php"); + +function headerjs() { + + $script_js = "\n"; + return $script_js; +} + +?> \ No newline at end of file diff --git a/e107_plugins/banner_menu/languages/English.php b/e107_plugins/banner_menu/languages/English.php new file mode 100644 index 000000000..ed82f1fb8 --- /dev/null +++ b/e107_plugins/banner_menu/languages/English.php @@ -0,0 +1,34 @@ +if less banners are present the maximum available amount will be used."); +define("BANNER_MENU_L17", "set amount ..."); +define("BANNER_MENU_L18", "Update Menu Settings"); + +?> \ No newline at end of file diff --git a/e107_plugins/blogcalendar_menu/archive.php b/e107_plugins/blogcalendar_menu/archive.php new file mode 100644 index 000000000..45242e4e0 --- /dev/null +++ b/e107_plugins/blogcalendar_menu/archive.php @@ -0,0 +1,134 @@ +db_Select_gen("SELECT news_id, news_datestamp from ".MPREFIX."news ORDER BY news_datestamp LIMIT 0,1"); +$first_post = $sql->db_Fetch(); +$start_year = date("Y", $first_post['news_datestamp']); +$end_year = $cur_year; + + +// ---------------------- +// build the yearselector +// ---------------------- +$year_selector = "
    "; +$year_selector .= "".BLOGCAL_ARCHIV1.": "; + + +// -------------------------- +// create the archive display +// -------------------------- +$newline = 0; +$archive = "
    "; +$archive .= ""; +for($i = 1; $i <= 12; $i++) { + if (++$newline == $months_per_row+1) { + $archive .= ""; + $newline = 1; + } + $archive .= "\n"; +} +$archive .= "
    $year_selector
    "; + $archive .= "
    "; + + // href the current month regardless of newsposts or any month with news + if (($req_year == $cur_year && $i == $cur_month) || $day_links[$i]) { + $archive .= "".$marray[$i-1].""; + } else { + $archive .= $marray[$i-1]; + } + + $archive .= "
    "; + if (($req_year == $cur_year) && ($i == $cur_month)) { + $req_day = $cur_day; + } else { + $req_day = ""; + } + $archive .= "
    ".calendar($req_day, $i, $req_year, $day_links[$i], $pref['blogcal_ws'])."
    "; +$ns->tablerender(BLOGCAL_L2 ." $req_year", $archive); + +require_once(FOOTERF); +?> \ No newline at end of file diff --git a/e107_plugins/blogcalendar_menu/blogcalendar_menu.php b/e107_plugins/blogcalendar_menu/blogcalendar_menu.php new file mode 100644 index 000000000..69e51752e --- /dev/null +++ b/e107_plugins/blogcalendar_menu/blogcalendar_menu.php @@ -0,0 +1,131 @@ +"; +$month_selector .= "
    "; + + +// ------------------------ +// create and show calendar +// ------------------------ +$menu = "
    "; +$menu .= ""; +$menu .= "
    $month_selector"; +$menu .= "
    ".calendar($req_day, $req_month, $req_year, $day_links, $pref['blogcal_ws'])."
    "; +$menu .= "
    "; +$ns->tablerender(BLOGCAL_L1." ".$req_year, $menu, 'blog_calender'); +?> \ No newline at end of file diff --git a/e107_plugins/blogcalendar_menu/calendar.php b/e107_plugins/blogcalendar_menu/calendar.php new file mode 100644 index 000000000..11f4a0e87 --- /dev/null +++ b/e107_plugins/blogcalendar_menu/calendar.php @@ -0,0 +1,102 @@ +"; + $calendar .= ''; + foreach($darray as $dheader) { + $calendar .= "$dheader"; + } + $calendar .= ""; + $calendar .= ''; + + $day_of_month = 1; + $tablerow = 1; + + // take care of the first "empty" days of the month + if ($day_of_week-$ws > 0) { + $calendar .= " "; + } + + // print the days of the month (take the $ws into account) + while ($day_of_month <= $last_day) { + if ($day_of_week-$ws == 7) { + #start a new week + $calendar .= ""; + $day_of_week = 0+$ws; + $tablerow++; + } + if ($day_of_month == $req_day) { + $day_style = isset($links[$day_of_month]) ? "indent" : "forumheader3"; + } else { + $day_style = isset($links[$day_of_month]) ? "indent" : "forumheader3"; + } + $calendar .= ""; + $calendar .= isset($links[$day_of_month]) ? "":""; + $calendar .= $day_of_month; + $calendar .= isset($links[$day_of_month]) ? "" : ""; + $calendar .= ""; + $day_of_month++; + $day_of_week++; + } + if ($day_of_week-$ws != 7) { + $calendar .= ' '; + } + $calendar .= ""; + if ($tablerow != 6) { + $calendar .= " "; + } + + $calendar .= ""; + return $calendar; +} +?> \ No newline at end of file diff --git a/e107_plugins/blogcalendar_menu/config.php b/e107_plugins/blogcalendar_menu/config.php new file mode 100644 index 000000000..2b005c56c --- /dev/null +++ b/e107_plugins/blogcalendar_menu/config.php @@ -0,0 +1,91 @@ +tablerender("", "
    ".BLOGCAL_CONF5."
    "); +} + +$text = "
    +
    + + + + + + +
    ".BLOGCAL_CONF1.": + + +
    +
    +
    "; +$ns->tablerender(BLOGCAL_CONF4, $text); + +require_once(e_ADMIN."footer.php"); +?> \ No newline at end of file diff --git a/e107_plugins/blogcalendar_menu/functions.php b/e107_plugins/blogcalendar_menu/functions.php new file mode 100644 index 000000000..670e883dd --- /dev/null +++ b/e107_plugins/blogcalendar_menu/functions.php @@ -0,0 +1,31 @@ + \ No newline at end of file diff --git a/e107_plugins/blogcalendar_menu/languages/English.php b/e107_plugins/blogcalendar_menu/languages/English.php new file mode 100644 index 000000000..4c6f4324e --- /dev/null +++ b/e107_plugins/blogcalendar_menu/languages/English.php @@ -0,0 +1,49 @@ + \ No newline at end of file diff --git a/e107_plugins/blogcalendar_menu/styles.php b/e107_plugins/blogcalendar_menu/styles.php new file mode 100644 index 000000000..c9f5632bd --- /dev/null +++ b/e107_plugins/blogcalendar_menu/styles.php @@ -0,0 +1,50 @@ + \ No newline at end of file diff --git a/e107_plugins/calendar_menu/admin_config.php b/e107_plugins/calendar_menu/admin_config.php new file mode 100644 index 000000000..fa8040fd8 --- /dev/null +++ b/e107_plugins/calendar_menu/admin_config.php @@ -0,0 +1,830 @@ +clear('nq_event_cal'); // Clear cache as well, in case displays changed + $message = EC_LAN_75; // "Calendar settings updated."; +} + +// ****************** FORTHCOMING EVENTS ****************** +if (isset($_POST['updateforthcoming'])) +{ + $pref['eventpost_menuheading'] = $_POST['eventpost_fe_menuheading']; + $pref['eventpost_daysforward'] = $_POST['eventpost_fe_daysforward']; + $pref['eventpost_numevents'] = $_POST['eventpost_fe_numevents']; + $pref['eventpost_checkrecur'] = $_POST['eventpost_fe_checkrecur']; + $pref['eventpost_linkheader'] = $_POST['eventpost_fe_linkheader']; + $pref['eventpost_fe_set'] = implode(",", $_POST['fe_eventclass']); + $pref['eventpost_showcaticon'] = $_POST['eventpost_showcaticon']; + $pref['eventpost_namelink'] = $_POST['eventpost_namelink']; + save_prefs(); + $e107cache->clear('nq_event_cal'); // Clear cache as well, in case displays changed + $message = EC_ADLAN_A109; // "Forthcoming Events settings updated."; +} + +if (e_QUERY) +{ + $qs = explode(".", e_QUERY); +} + +require_once('ecal_class.php'); +$ecal_class = new ecal_class; + + +// ****************** MAINTENANCE ****************** +if (isset($_POST['deleteold']) && isset($_POST['eventpost_deleteoldmonths'])) +{ + $back_count = $_POST['eventpost_deleteoldmonths']; + if (($back_count >= 1) && ($back_count <= 12)) + { + $old_date = intval(mktime(0,0,0,$ecal_class->now_date['mon']-$back_count,1,$ecal_class->now_date['year'])); + $old_string = strftime("%d %B %Y",$old_date); +// $message = "Back delete {$back_count} months. Oldest date = {$old_string}"; + $qs[0] = "confdel"; + $qs[1] = $old_date; + } + else + $message = EC_ADLAN_A148; +} + + +if (isset($_POST['cache_clear'])) +{ + $qs[0] = "confcache"; +} + +require_once(e_ADMIN."auth.php"); + + + + +// Actually delete back events +if (isset($_POST['confirmdeleteold']) && isset($qs[0]) && ($qs[0] == "backdel")) +{ + $old_date = $qs[1]; + $old_string = strftime("%d %B %Y",$old_date); + // Check both start and end dates to avoid problems with events originally entered under 0.617 + $qry = "event_start < {$old_date} AND event_end < {$old_date} AND event_recurring = 0"; +// $message = "Back delete {$back_count} months. Oldest date = {$old_string} Query = {$qry}"; + if ($sql -> db_Delete("event",$qry)) + { + // Add in a log event + $ecal_class->cal_log(4,'db_Delete - earlier than {$old_string} (past {$back_count} months)',$qry); + $message = EC_ADLAN_A146.$old_string.EC_ADLAN_A147; + } + else + { + $message = EC_ADLAN_A149." : ".$sql->mySQLresult; + } + + $qs[0] = "maint"; +} + + +// Actually empty cache +if (isset($_POST['confirmdelcache']) && isset($qs[0]) &&($qs[0] == "cachedel")) +{ + $e107cache->clear('nq_event_cal'); + $message = EC_ADLAN_A163; + $qs[0] = "maint"; // Re-display maintenance menu +} + + +// Prompt to delete back events +if(isset($qs[0]) && ($qs[0] == "confdel")) +{ + $old_string = strftime("%d %B %Y",$qs[1]); + $text = "
    +
    + + + + + +
    ".EC_ADLAN_A150.$old_string."
    "; + + $ns->tablerender("
    ".EC_LAN_50."
    ", $text); +} + + +// Prompt to clear cache +if (isset($qs[0]) && ($qs[0] == "confcache")) +{ + $text = "
    +
    + + + + + +
    ".EC_ADLAN_A162."
    "; + + $ns->tablerender("
    ".EC_LAN_50."
    ", $text); +} + + +if (isset($message)) +{ + $ns->tablerender("", "
    $message
    "); +} + + + +//category +if(isset($qs[0]) && $qs[0] == "cat") +{ + $calendarmenu_db = new DB; + $calendarmenu_action = ''; + if (isset($_POST['calendarmenu_action'])) $calendarmenu_action = $_POST['calendarmenu_action']; + $calendarmenu_edit = FALSE; + // * If we are updating then update or insert the record + if ($calendarmenu_action == 'update') + { + $calendarmenu_id = $_POST['calendarmenu_id']; + if ($calendarmenu_id == 0) + { + // New record so add it + // Enumerate fields so it doesn't matter if they're in the wrong order. + // db_Insert can take an array of key => value pairs + $calendarmenu_args = array ( + 'event_cat_id' => 0, + 'event_cat_name' => $_POST['event_cat_name'], + 'event_cat_description' => $_POST['event_cat_description'], + 'event_cat_icon' => $_POST['ne_new_category_icon'], + 'event_cat_class' => intval($_POST['event_cat_class']), + 'event_cat_subs' => intval($_POST['event_cat_subs']), + 'event_cat_force_class' => intval($_POST['event_cat_force_class']), + 'event_cat_ahead' => intval($_POST['event_cat_ahead']), + 'event_cat_msg1' => $_POST['event_cat_msg1'], + 'event_cat_msg2' => $_POST['event_cat_msg2'], + 'event_cat_notify' => intval($_POST['event_cat_notify']), + 'event_cat_lastupdate' => intval(time()), + 'event_cat_addclass' => intval($_POST['event_cat_addclass']) + ); + + if ($calendarmenu_db->db_Insert("event_cat", $calendarmenu_args)) + { + $calendarmenu_msg .= "".EC_ADLAN_A26.""; + } + else + { + $calendarmenu_msg .= "".EC_ADLAN_A27.""; + } + } + else + { + // Update existing + $calendarmenu_args = " + event_cat_name='".$_POST['event_cat_name']."', + event_cat_description='".$_POST['event_cat_description']."', + event_cat_class='".intval($_POST['event_cat_class'])."', + event_cat_icon='".$_POST['ne_new_category_icon']."', + event_cat_subs='".intval($_POST['event_cat_subs'])."', + event_cat_force_class='".intval($_POST['event_cat_force_class'])."', + event_cat_ahead='".intval($_POST['event_cat_ahead'])."', + event_cat_msg1='".$_POST['event_cat_msg1']."', + event_cat_msg2='".$_POST['event_cat_msg2']."', + event_cat_notify='".intval($_POST['event_cat_notify'])."', + event_cat_addclass='".intval($_POST['event_cat_addclass'])."', + event_cat_lastupdate='".time()."' + where event_cat_id='$calendarmenu_id'"; + if ($calendarmenu_db->db_Update("event_cat", $calendarmenu_args)){ + // Changes saved + $calendarmenu_msg .= "".EC_ADLAN_A28.""; + }else{ + $calendarmenu_msg .= "".EC_ADLAN_A29.""; + } + } + } + // We are creating, editing or deleting a record + if ($calendarmenu_action == 'dothings') + { + $calendarmenu_id = $_POST['calendarmenu_selcat']; + $calendarmenu_do = $_POST['calendarmenu_recdel']; + $calendarmenu_dodel = false; + + switch ($calendarmenu_do) + { + case '1': // Edit existing record + { + // We edit the record + $calendarmenu_db->db_Select("event_cat", "*", "event_cat_id='$calendarmenu_id'"); + $calendarmenu_row = $calendarmenu_db->db_Fetch() ; + extract($calendarmenu_row); + $calendarmenu_cap1 = EC_ADLAN_A24; + $calendarmenu_edit = TRUE; + break; + } + case '2': // New category + { + // Create new record + $calendarmenu_id = 0; + // set all fields to zero/blank + $calendar_category_name = ""; + $calendar_category_description = ""; + $calendarmenu_cap1 = EC_ADLAN_A23; + $calendarmenu_edit = TRUE; + break; + } + case '3': + { + // delete the record + if ($_POST['calendarmenu_okdel'] == '1'){ + if ($calendarmenu_db->db_Select("event", "event_id", " where event_category='$calendarmenu_id'", "nowhere")){ + $calendarmenu_msg .= "".EC_ADLAN_A59.""; + }else{ + if ($calendarmenu_db->db_Delete("event_cat", " event_cat_id='$calendarmenu_id'")){ + $calendarmenu_msg .= "".EC_ADLAN_A30.""; + }else{ + $calendarmenu_msg .= "".EC_ADLAN_A32.""; + } + } + }else{ + $calendarmenu_msg .= "".EC_ADLAN_A31.""; + } + $calendarmenu_dodel = TRUE; + $calendarmenu_edit = FALSE; + } + } + + if (!$calendarmenu_dodel) + { + require_once(e_HANDLER."file_class.php"); + + + $calendarmenu_text .= " +
    + + + + + {$calendarmenu_msg} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {$calendarmenu_cap1} + + +
    ".EC_ADLAN_A21."
    ".EC_ADLAN_A121."
    ".EC_ADLAN_A80."".r_userclass("event_cat_class", $event_cat_class, "off", 'public, nobody, member, admin, classes')."
    ".EC_ADLAN_A94."".r_userclass("event_cat_addclass", $event_cat_addclass, "off", 'public, nobody, member, admin, classes')."
    ".EC_LAN_55." + + + +
    ".EC_ADLAN_A81." 0?"checked='checked'":"")." />
    ".EC_ADLAN_A86." +
    ".EC_ADLAN_A82."".r_userclass("event_cat_force_class", $event_cat_force_class, "off", 'nobody, member, admin, classes')."
    ".EC_ADLAN_A83."
    ".EC_ADLAN_A84."
    ".EC_ADLAN_A117."
    +
    "; + } + } + if (!$calendarmenu_edit) + { + // Get the category names to display in combo box then display actions available + $calendarmenu2_db = new DB; + $calendarmenu_catopt = ''; + if (!isset($calendarmenu_id)) $calendarmenu_id = -1; + if ($calendarmenu2_db->db_Select("event_cat", "event_cat_id,event_cat_name", " order by event_cat_name", "nowhere")) + { + while ($row = $calendarmenu2_db->db_Fetch()){ + //extract($calendarmenu_row); + $calendarmenu_catopt .= ""; + } + } + else + { + $calendarmenu_catopt .= ""; + } + + $calendarmenu_text .= " +
    + + + + + + {$calendarmenu_msg} + + + + + + + + + + + +
    ".EC_ADLAN_A11."
    ".EC_ADLAN_A11."
    ".EC_ADLAN_A18." + ".EC_ADLAN_A13."
    + ".EC_ADLAN_A14."
    + ".EC_ADLAN_A15." + ".EC_ADLAN_A16." +
    +
    "; + } + if(isset($calendarmenu_text)) + { + $ns->tablerender(EC_ADLAN_A19, $calendarmenu_text); + } +} + +// ==================================================== +// FORTHCOMING EVENTS OPTIONS +// ==================================================== + +if((isset($qs[0]) && $qs[0] == "forthcoming")) +{ + +if (!isset($pref['eventpost_menuheading'])) $pref['eventpost_menuheading'] = EC_ADLAN_A100; +if (!isset($pref['eventpost_daysforward'])) $pref['eventpost_daysforward'] = 30; +if (!isset($pref['eventpost_numevents'])) $pref['eventpost_numevents'] = 3; +if (!isset($pref['eventpost_checkrecur'])) $pref['eventpost_checkrecur'] = '1'; +if (!isset($pref['eventpost_linkheader'])) $pref['eventpost_linkheader'] = '0'; +if (!isset($pref['eventpost_namelink'])) $pref['eventpost_namelink'] = '1'; + + $text = "
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ".EC_ADLAN_A100."
    ".EC_ADLAN_A108." +
    ".EC_ADLAN_A101." +
    ".EC_ADLAN_A102." +
    ".EC_ADLAN_A103."
    ".EC_ADLAN_A107."
    ".EC_ADLAN_A130."
    + +
    ".EC_ADLAN_A104." +
    ".EC_ADLAN_A120." +
    ".EC_ADLAN_A118.""; + +// Now display all the current categories as checkboxes + $cal_fe_prefs = array(); + if (isset($pref['eventpost_fe_set'])) $cal_fe_prefs = array_flip(explode(",",$pref['eventpost_fe_set'])); + if (!is_object($calendarmenu2_db)) $calendarmenu2_db = new DB; // Possible notice here + if ($calendarmenu2_db->db_Select("event_cat", "event_cat_id,event_cat_name", " order by event_cat_name", "nowhere")) + { + while ($row = $calendarmenu2_db->db_Fetch()) + { + $selected = isset($cal_fe_prefs[$row['event_cat_id']]); + $text .= "".$row['event_cat_name']."
    "; + } + } + else + { + $text .= EC_ADLAN_A119; // No categories, or error + } + + $text .= "
    +
    +
    "; + + $ns->tablerender("
    ".EC_ADLAN_A100."
    ", $text); +} // End of Forthcoming Events Menu Options + + +// ==================================================== +// MAINTENANCE OPTIONS +// ==================================================== + +if((isset($qs[0]) && $qs[0] == "maint")) +{ + $text = "
    +
    + + + + + + + +
    ".EC_ADLAN_A144."
    ".EC_ADLAN_A142." + + ".EC_ADLAN_A143." +


    "; + + $ns->tablerender("
    ".EC_ADLAN_A144."
    ", $text); + + $text = "
    +
    + + + +
    ".EC_ADLAN_A160."
    "; + + $ns->tablerender("
    ".EC_ADLAN_A159."
    ", $text); + +} + +// ======================================================== +// MAIN OPTIONS MENU +// ======================================================== + + +if(!isset($qs[0]) || (isset($qs[0]) && $qs[0] == "config")){ + $text = "
    +
    + + + + + + + "; +$text .= " + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ".EC_LAN_78."
    ".EC_LAN_76." ". r_userclass("eventpost_admin", $pref['eventpost_admin'], "off", 'public, nobody, member, admin, classes')." +
    ".EC_LAN_104." ". r_userclass("eventpost_super", $pref['eventpost_super'], "off", 'public, nobody, member, admin, classes')." +
    ".EC_ADLAN_A134." + + ".EC_ADLAN_A137." +
    ".EC_ADLAN_A165." + +
    ".EC_ADLAN_A140."
    ".EC_LAN_102."
    ".EC_ADLAN_A171." + ".EC_ADLAN_A172." +
    ".EC_LAN_114." + +
    ".EC_LAN_117."
    + +
    ".EC_LAN_118."
    + +
    ".EC_ADLAN_A133."
    + +
    ".EC_ADLAN_A138."  ".EC_ADLAN_A139." +
    ".EC_ADLAN_A122."
    + ".EC_ADLAN_A124."".$ecal_class->time_string($ecal_class->time_now)."
    + ".EC_ADLAN_A125."".$ecal_class->time_string($ecal_class->site_timedate)."
    + ".EC_ADLAN_A126."".$ecal_class->time_string($ecal_class->user_timedate)." +
    +
    ".EC_ADLAN_A129." +
    ".EC_ADLAN_A123."
    + ".EC_ADLAN_A127." +
    + + +
    ".EC_ADLAN_A128." +
    ".EC_ADLAN_A166."
    + ".EC_ADLAN_A169." +
    + + +
    ".EC_ADLAN_A168." +
    ".EC_ADLAN_A167."
    + ".EC_ADLAN_A170." +
    + + +
    ".EC_ADLAN_A168." +
    ".EC_ADLAN_A95."  ".EC_ADLAN_A96." +
    ".EC_ADLAN_A92." +
    ".EC_ADLAN_A91." +
    ".EC_ADLAN_A93." +
    ".EC_ADLAN_A114."
    + +
    +
    +
    "; + + $ns->tablerender("
    ".EC_LAN_78."
    ", $text); +} + + +function admin_config_adminmenu() +{ + if (e_QUERY) { + $tmp = explode(".", e_QUERY); + $action = $tmp[0]; + } + if (!isset($action) || ($action == "")) + { + $action = "config"; + } + $var['config']['text'] = EC_ADLAN_A10; + $var['config']['link'] = "admin_config.php"; + + $var['cat']['text'] = EC_ADLAN_A11; + $var['cat']['link'] ="admin_config.php?cat"; + + $var['forthcoming']['text'] = EC_ADLAN_A100; + $var['forthcoming']['link'] ="admin_config.php?forthcoming"; + + $var['maint']['text'] = EC_ADLAN_A141; + $var['maint']['link'] ="admin_config.php?maint"; + + show_admin_menu(EC_ADLAN_A12, $action, $var); +} + + +require_once(e_ADMIN."footer.php"); + +?> \ No newline at end of file diff --git a/e107_plugins/calendar_menu/calendar.php b/e107_plugins/calendar_menu/calendar.php new file mode 100644 index 000000000..d2d006e4a --- /dev/null +++ b/e107_plugins/calendar_menu/calendar.php @@ -0,0 +1,319 @@ +cal_date; +} +else +{ // Get date from query + $datearray = getdate($qs[0]); +} + $month = $datearray['mon']; + $year = $datearray['year']; + + +// set up arrays for calender display ------------------------------------------------------------------ +if($pref['eventpost_weekstart'] == 'sun') { + $week = Array(EC_LAN_25, EC_LAN_19, EC_LAN_20, EC_LAN_21, EC_LAN_22, EC_LAN_23, EC_LAN_24); + } else { + $week = Array(EC_LAN_19, EC_LAN_20, EC_LAN_21, EC_LAN_22, EC_LAN_23, EC_LAN_24, EC_LAN_25); +} +$months = Array(EC_LAN_0, EC_LAN_1, EC_LAN_2, EC_LAN_3, EC_LAN_4, EC_LAN_5, EC_LAN_6, EC_LAN_7, EC_LAN_8, EC_LAN_9, EC_LAN_10, EC_LAN_11); +$monthabb = Array(EC_LAN_JAN, EC_LAN_FEB, EC_LAN_MAR, EC_LAN_APR, EC_LAN_MAY, EC_LAN_JUN, EC_LAN_JUL, EC_LAN_AUG, EC_LAN_SEP, EC_LAN_OCT, EC_LAN_NOV, EC_LAN_DEC); + +$days = array(EC_LAN_DAY_1, EC_LAN_DAY_2, EC_LAN_DAY_3, EC_LAN_DAY_4, EC_LAN_DAY_5, EC_LAN_DAY_6, EC_LAN_DAY_7, EC_LAN_DAY_8, EC_LAN_DAY_9, EC_LAN_DAY_10, EC_LAN_DAY_11, EC_LAN_DAY_12, EC_LAN_DAY_13, EC_LAN_DAY_14, EC_LAN_DAY_15, EC_LAN_DAY_16, EC_LAN_DAY_17, EC_LAN_DAY_18, EC_LAN_DAY_19, EC_LAN_DAY_20, EC_LAN_DAY_21, EC_LAN_DAY_22, EC_LAN_DAY_23, EC_LAN_DAY_24, EC_LAN_DAY_25, EC_LAN_DAY_26, EC_LAN_DAY_27, EC_LAN_DAY_28, EC_LAN_DAY_29, EC_LAN_DAY_30, EC_LAN_DAY_31); + +// show events------------------------------------------------------------------------------------------- +$monthstart = mktime(0, 0, 0, $month, 1, $year); // Start of month to be shown +$firstdayarray = getdate($monthstart); +$monthend = mktime(0, 0, 0, $month + 1, 1, $year) - 1; // End of month to be shown + +$prevmonth = ($month-1); +$prevyear = $year; +if ($prevmonth == 0) +{ + $prevmonth = 12; + $prevyear = ($year-1); +} +$previous = mktime(0, 0, 0, $prevmonth, 1, $prevyear); // Used by nav + +$nextmonth = ($month + 1); +$nextyear = $year; +if ($nextmonth == 13) +{ + $nextmonth = 1; + $nextyear = ($year + 1); +} +$next = mktime(0, 0, 0, $nextmonth, 1, $nextyear); +$py = $year-1; +$prevlink = mktime(0, 0, 0, $month, 1, $py); +$ny = $year + 1; +$nextlink = mktime(0, 0, 0, $month, 1, $ny); + +$prop = mktime(0, 0, 0, $month, 1, $year); // Sets start date for new event entry +$nowmonth = $ecal_class->cal_date['mon']; +$nowyear = $ecal_class->cal_date['year']; +$nowday = $ecal_class->cal_date['mday']; + +// time switch buttons +$cal_text = $tp -> parseTemplate($CALENDAR_TIME_TABLE, FALSE, $calendar_shortcodes); + +// navigation buttons +$nav_text = $tp -> parseTemplate($CALENDAR_NAVIGATION_TABLE, FALSE, $calendar_shortcodes); + +// get events from selected + $qry = "SELECT e.*, ec.* + FROM #event as e + LEFT JOIN #event_cat as ec ON e.event_category = ec.event_cat_id + WHERE e.event_id != '' + AND ((e.event_start >= ".intval($monthstart)." AND e.event_start <= ".intval($monthend).") + OR (e.event_end >= ".intval($monthstart)." AND e.event_end <= ".intval($monthend).") + OR (e.event_start <= ".intval($monthstart)." AND e.event_end >= ".intval($monthend).") + OR (e.event_recurring = '1' AND e.event_rec_y = ".intval($month).")) {$category_filter} + {$ecal_class->extra_query} + ORDER BY e.event_start"; + +if ($sql->db_Select_gen($qry)) +{ + while ($row = $sql->db_Fetch()) + { + // check for recurring events in this month + if($row['event_recurring']=='1') + { + if ($month == $row['event_rec_y']) + { // Change it into an event that happens today + $row['event_start'] = mktime(0,0,0,$row['event_rec_y'],$row['event_rec_m'],$year); + $row['event_end'] = $row['event_start']; + } + else + { // Effectively create a null event + $row['event_start'] = 0; + $row['event_end'] = 0; + } + } + + $evf = getdate($row['event_start']); + $tmp = $evf['mday']; // Day of month for start + $eve = getdate($row['event_end']); + $tmp2 = $eve['mday']; // Day of month for end + $tmp3 = date("t", $monthstart); // number of days in this month + if ((($ecal_class->max_recent_show != 0) && (time() - $row['event_datestamp']) <= $ecal_class->max_recent_show)) $row['is_recent'] = TRUE; + + //1) start in month, end in month + if(($row['event_start']>=$monthstart && $row['event_start']<=$monthend) && $row['event_end']<=$monthend) + { + $events[$tmp][] = $row; + for ($c=($tmp+1); $c<($tmp2+1); $c++) + { + $row['event_true_end'][$c] = ($c!=$tmp2 ? 1 : 2); + $events[$c][] = $row; + } + + //2) start in month, end after month + } + elseif(($row['event_start']>=$monthstart && $row['event_start']<=$monthend) && $row['event_end']>=$monthend) + { + $events[$tmp][] = $row; + for ($c=($tmp+1); $c<=$tmp3; $c++) + { + $row['event_true_end'][$c] = 1; + $events[$c][] = $row; + } + + //3) start before month, end in month + } + elseif($row['event_start']<=$monthstart && ($row['event_end']>=$monthstart && $row['event_end']<=$monthend)) + { + for ($c=1; $c<=$tmp2; $c++) + { + $row['event_true_end'][$c] = ($c!=$tmp2 ? 1 : 2); + $events[$c][] = $row; + } + + //4) start before month, end after month + } + elseif($row['event_start']<=$monthstart && $row['event_end']>=$monthend) + { + for ($c=1; $c<=$tmp3; $c++){ + $row['event_true_end'][$c] = 1; + $events[$c][] = $row; + } + } + } +} + + +// ****** CAUTION - the category dropdown also used $sql object - take care to avoid interference! + +$start = $monthstart; +$numberdays = date("t", $start); // number of days in this month + +$text = ""; +$text .= $tp -> parseTemplate($CALENDAR_CALENDAR_START, FALSE, $calendar_shortcodes); +$text .= $tp -> parseTemplate($CALENDAR_CALENDAR_HEADER_START, FALSE, $calendar_shortcodes); +foreach($week as $day) +{ + $text .= $tp -> parseTemplate($CALENDAR_CALENDAR_HEADER, FALSE, $calendar_shortcodes); +} +$text .= $tp -> parseTemplate($CALENDAR_CALENDAR_HEADER_END, FALSE, $calendar_shortcodes); + +$calmonth = $datearray['mon']; +$calday = $datearray['mday']; +$calyear = $datearray['year']; + +if ($pref['eventpost_weekstart'] == 'mon') +{ + $firstdayoffset = ($firstdayarray['wday'] == 0 ? $firstdayarray['wday']+6 : $firstdayarray['wday']-1); +} +else +{ + $firstdayoffset = $firstdayarray['wday'] ; +} +for ($c=0; $c<$firstdayoffset; $c++) +{ + $text .= $tp -> parseTemplate($CALENDAR_CALENDAR_DAY_NON, FALSE, $calendar_shortcodes); +} +$loop = $firstdayoffset; + +for ($c = 1; $c <= $numberdays; $c++) +{ + $dayarray = getdate($start + (($c-1) * 86400)); + $stopp = mktime(24, 0, 0, $calmonth, $c, $calyear); + $startt = mktime(0, 0, 0, $calmonth, $c, $calyear); + // Highlight the current day. + if ($dayarray['mon'] == $calmonth) + { + if ($nowday == $c && $calmonth == $nowmonth && $calyear == $nowyear) + { + //today + $text .= $tp -> parseTemplate($CALENDAR_CALENDAR_DAY_TODAY, FALSE, $calendar_shortcodes); + } + elseif(isset($events[$c]) && is_array($events[$c]) && !empty($events[$c]) && count($events[$c]) > 0) + { + //day has events + $text .= $tp -> parseTemplate($CALENDAR_CALENDAR_DAY_EVENT, FALSE, $calendar_shortcodes); + } + else + { + // no events and not today + $text .= $tp -> parseTemplate($CALENDAR_CALENDAR_DAY_EMPTY, FALSE, $calendar_shortcodes); + } + // if there are events then list them + if (array_key_exists($c, $events)) + { + foreach($events[$c] as $ev) + { + //if ($event_true_end[$c][$a]){ + if(isset($ev['event_true_end']) && $ev['event_true_end']) + { + //$ev['indicat'] = ($ev['event_true_end']==1 ? "->" : "|"); + $ev['indicat'] = ""; + $ev['imagesize'] = "4"; + $ev['fulltopic'] = FALSE; + $ev['startofevent'] = FALSE; + } + else + { + $ev['indicat'] = ""; + $ev['imagesize'] = "8"; + $ev['fulltopic'] = TRUE; + $ev['startofevent'] = TRUE; + } + $text .= $tp -> parseTemplate($CALENDAR_SHOWEVENT, FALSE, $calendar_shortcodes); + } + } + $text .= $tp -> parseTemplate($CALENDAR_CALENDAR_DAY_END, FALSE, $calendar_shortcodes); + } + $loop++; + if ($loop == 7) + { + $loop = 0; + if($c != $numberdays) + { + $text .= $tp -> parseTemplate($CALENDAR_CALENDAR_WEEKSWITCH, FALSE, $calendar_shortcodes); + } + } +} +//remainder cells to end the row properly with empty cells +if($loop!=0) +{ + $remainder = 7-$loop; + for ($c=0; $c<$remainder; $c++) + { + $text .= $tp -> parseTemplate($CALENDAR_CALENDAR_DAY_NON, FALSE, $calendar_shortcodes); + } +} +$text .= $tp -> parseTemplate($CALENDAR_CALENDAR_END, FALSE, $calendar_shortcodes); + +$caption = EC_LAN_79; // "Calendar View"; +$nav = $cal_text . $nav_text . $text; +$ns->tablerender($caption, $nav); + +require_once(FOOTERF); + +?> \ No newline at end of file diff --git a/e107_plugins/calendar_menu/calendar_menu.php b/e107_plugins/calendar_menu/calendar_menu.php new file mode 100644 index 000000000..ab47572cb --- /dev/null +++ b/e107_plugins/calendar_menu/calendar_menu.php @@ -0,0 +1,257 @@ +retrieve($cache_tag, $ecal_class->max_cache_time)) + { + echo $cacheData; + return; + } + +include_lan($ecal_dir."languages/".e_LANGUAGE.".php"); + +global $ecal_dir, $tp; + + +if (is_readable(THEME."calendar_template.php")) +{ + require(THEME."calendar_template.php"); +} +else +{ // Needs to be require - otherwise not loaded if two menus use it + require($ecal_dir."calendar_template.php"); +} + +$cal_datearray = $ecal_class->cal_date; +$cal_current_month = $cal_datearray['mon']; +$cal_current_year = $cal_datearray['year']; +$numberdays = date("t", $ecal_class->cal_date); // number of days in this month + + +$cal_monthstart = mktime(0, 0, 0, $cal_current_month, 1, $cal_current_year); // Time stamp for first day of month +$cal_firstdayarray = getdate($cal_monthstart); +$cal_monthend = mktime(0, 0, 0, $cal_current_month + 1, 1, $cal_current_year) -1; // Time stamp for last day of month + + + $cal_qry = "SELECT e.event_rec_m, e.event_rec_y, e.event_start, e.event_end, e.event_datestamp, ec.* + FROM #event as e LEFT JOIN #event_cat as ec ON e.event_category = ec.event_cat_id + WHERE ((e.event_start >= {$cal_monthstart} AND e.event_start <= {$cal_monthend}) OR (e.event_rec_y = {$cal_current_month})) + {$ecal_class->extra_query} order by e.event_start"; + + +$cal_events = array(); +$cal_totev = 0; +if ($cal_totev = $sql->db_Select_gen($cal_qry)) +{ + while ($cal_row = $sql->db_Fetch()) + { + if ($cal_row['event_rec_y'] == $cal_current_month) + { // Recurring events + $cal_start_day = $cal_row['event_rec_m']; + } + else + { // 'normal' events + $cal_tmp = getdate($cal_row['event_start']); + if ($cal_tmp['mon'] == $cal_current_month) + { + $cal_start_day = $cal_tmp['mday']; + } + else + { + $cal_start_day = 1; + } + } + // Mark start day of each event + $cal_events[$cal_start_day][] = $cal_row['event_cat_icon']; // Will be overwritten if several events on same day + if ((($ecal_class->max_recent_show != 0) && (time() - $cal_row['event_datestamp']) <= $ecal_class->max_recent_show)) $cal_events[$cal_start_day]['is_recent'] = TRUE; + } +} + + +if ($pref['eventpost_weekstart'] == 'sun') +{ + $cal_week = array(EC_LAN_25, EC_LAN_19, EC_LAN_20, EC_LAN_21, EC_LAN_22, EC_LAN_23, EC_LAN_24); +} +else +{ + $cal_week = array(EC_LAN_19, EC_LAN_20, EC_LAN_21, EC_LAN_22, EC_LAN_23, EC_LAN_24, EC_LAN_25); +} + +$cal_months = array(EC_LAN_0, EC_LAN_1, EC_LAN_2, EC_LAN_3, EC_LAN_4, EC_LAN_5, EC_LAN_6, EC_LAN_7, EC_LAN_8, EC_LAN_9, EC_LAN_10, EC_LAN_11); + + +$calendar_title = ""; +} +else +{ + $calendar_title .= $cal_current_year ." ". $cal_months[$cal_datearray['mon']-1] . ""; +} + + +$cal_text = $CALENDAR_MENU_START; + + +if ($pref['eventpost_showeventcount']=='1') +{ + if ($cal_totev) + { + $cal_text .= EC_LAN_26 . ": " . $cal_totev; + } + else + { + $cal_text .= EC_LAN_27; + } + $cal_text .= "

    "; +} + +$cal_start = $cal_monthstart; // First day of month as time stamp + + +// Start the table +$cal_text .= $CALENDAR_MENU_TABLE_START; +// Open header row +$cal_text .= $CALENDAR_MENU_HEADER_START; +// Now do the headings + +foreach($cal_week as $cal_day) +{ + $cal_text .= $CALENDAR_MENU_HEADER_FRONT; + $cal_text .= substr($cal_day, 0, $pref['eventpost_lenday']); + $cal_text .= $CALENDAR_MENU_HEADER_BACK; +} +$cal_text .= $CALENDAR_MENU_HEADER_END; // Close off header row, open first date row + + +$cal_thismonth = $cal_datearray['mon']; +$cal_thisday = $cal_datearray['mday']; // Today + + +if ($pref['eventpost_weekstart'] == 'mon') +{ + $firstdayoffset = ($cal_firstdayarray['wday'] == 0 ? $cal_firstdayarray['wday'] + 6 : $cal_firstdayarray['wday']-1); +} +else +{ + $firstdayoffset = $cal_firstdayarray['wday']; +} + + +for ($cal_c = 0; $cal_c < $firstdayoffset; $cal_c++) +{ + $cal_text .= $CALENDAR_MENU_DAY_NON; +} +$cal_loop = $firstdayoffset; + +// Now do the days of the month +for($cal_c = 1; $cal_c <= 31; $cal_c++) +{ // Four cases to decode: + // 1 - Today, no events + // 2 - Some other day, no events (or no icon defined) + // 3 - Today with events (and icon defined) + // 4 - Some other day with events (and icon defined) + $cal_dayarray = getdate($cal_start + (($cal_c-1) * 86400)); + $cal_css = 2; // The default - not today, no events + if ($cal_dayarray['mon'] == $cal_thismonth) + { // Dates match for this month + $cal_img = $cal_c; // Default 'image' is the day of the month + $cal_event_count = 0; + $title = ""; + if ($cal_thisday == $cal_c) $cal_css = 1; + $cal_linkut = mktime(0 , 0 , 0 , $cal_dayarray['mon'], $cal_c, $cal_datearray['year']).".one"; // ALways need "one" + if (array_key_exists($cal_c, $cal_events)) + { + $cal_event_icon = e_PLUGIN . "calendar_menu/images/" . $cal_events[$cal_c]['0']; + $cal_event_count = count($cal_events[$cal_c]); // See how many events today + if (!empty($cal_events[$cal_c]) && is_file($cal_event_icon)) + { // Show icon if it exists + $cal_css += 2; // Gives 3 for today, 4 for other day + if ($cal_event_count == 1) + { + $title = " title='1 ".EC_LAN_135."' "; + } + else + { + $title = " title='{$cal_event_count} " . EC_LAN_106 . "' "; + } + $cal_img = ""; + //height='10' width='10' + if (isset($cal_events[$cal_c]['is_recent']) && $cal_events[$cal_c]['is_recent']) + { + $cal_css += 2; + } + } + } + $cal_text .= $CALENDAR_MENU_DAY_START[$cal_css]."{$cal_img}"; + $cal_text .= $CALENDAR_MENU_DAY_END[$cal_css]; + $cal_loop++; + if ($cal_loop == 7) + { // Start next row + $cal_loop = 0; + if ($cal_c != $numberdays) + { + $cal_text .= $CALENDAR_MENU_WEEKSWITCH; + } + } + } +} + +if ($cal_loop != 0) +{ +for($cal_a = ($cal_loop + 1); $cal_a <= 7; $cal_a++) +{ + $cal_text .= $CALENDAR_MENU_DAY_NON; +} +} +// Close table +$cal_text .= $CALENDAR_MENU_END; + +// Now handle the data, cache as well +ob_start(); // Set up a new output buffer +$ns->tablerender($calendar_title, $cal_text, 'calendar_menu'); +$cache_data = ob_get_flush(); // Get the page content, and display it +$e107cache->set($cache_tag, $cache_data); // Save to cache + + +?> diff --git a/e107_plugins/calendar_menu/calendar_shortcodes.php b/e107_plugins/calendar_menu/calendar_shortcodes.php new file mode 100644 index 000000000..55704ac19 --- /dev/null +++ b/e107_plugins/calendar_menu/calendar_shortcodes.php @@ -0,0 +1,477 @@ + e_sc -> parse_scbatch(__FILE__); +/* +// TIME SWITCH BUTTONS ------------------------------------------------ +SC_BEGIN PREV_MONTH + global $PREV_MONTH, $previous, $months, $prevmonth; + return "<< ".$months[($prevmonth-1)].""; +SC_END + +SC_BEGIN NEXT_MONTH + global $NEXT_MONTH, $next, $months, $nextmonth; + return " ".$months[($nextmonth-1)]." >>"; +SC_END + +SC_BEGIN CURRENT_MONTH + global $CURRENT_MONTH, $pref, $months, $month, $year; + if($pref['eventpost_dateformat'] == 'my') { + $CURRENT_MONTH = $months[($month-1)]." ".$year; + } else { + $CURRENT_MONTH = $year." ".$months[($month-1)]; + } + return $CURRENT_MONTH; +SC_END + +SC_BEGIN PREV_YEAR + global $PREV_YEAR, $prevlink, $py; + return "<< ".$py.""; +SC_END + +SC_BEGIN NEXT_YEAR + global $NEXT_YEAR, $nextlink, $ny; + return "".$ny." >>"; +SC_END + +SC_BEGIN MONTH_LIST + global $MONTH_LIST, $year, $monthjump, $monthabb; + $MONTH_LIST = ""; + for ($ii = 0; $ii < 12; $ii++) + { + $m = $ii + 1; + $monthjump = mktime(0, 0, 0, $m, 1, $year); + $MONTH_LIST .= "".$monthabb[$ii]."  "; + } + return $MONTH_LIST; +SC_END + + + +// NAVIGATION BUTTONS ------------------------------------------------ +SC_BEGIN NAV_BUT_ALLEVENTS + global $NAV_BUT_ALLEVENTS; + $allevents = (e_PAGE == "event.php" ? EC_LAN_96 : EC_LAN_93); + return ""; +SC_END + +SC_BEGIN NAV_BUT_VIEWCAT + global $NAV_BUT_VIEWCAT; + //return ""; + return ""; +SC_END + +SC_BEGIN NAV_BUT_SUBSCRIPTION + global $NAV_BUT_SUBSCRIPTION, $pref; + if (($pref['eventpost_asubs']>0) && USER) + { + $NAV_BUT_SUBSCRIPTION = ""; + } + return $NAV_BUT_SUBSCRIPTION; +SC_END + +SC_BEGIN NAV_BUT_ENTEREVENT + global $NAV_BUT_ENTEREVENT, $pref, $prop; + $NAV_BUT_ENTEREVENT = ""; + if (check_class($pref['eventpost_admin']) || getperms('0')){ + // start no admin preference + $NAV_BUT_ENTEREVENT .= ""; + } + return $NAV_BUT_ENTEREVENT; +SC_END + +SC_BEGIN NAV_LINKCURRENTMONTH + global $NAV_LINKCURRENTMONTH, $month, $nowmonth, $year, $nowyear, $current, $ds; + $NAV_LINKCURRENTMONTH = ""; + if ($month != $nowmonth || $year != $nowyear || $ds == 'one'){ + $NAV_LINKCURRENTMONTH = ""; + } + return $NAV_LINKCURRENTMONTH; +SC_END + +SC_BEGIN NAV_CATEGORIES + global $NAV_CATEGORIES, $sql, $pref, $_POST, $cal_super; + $NAV_CATEGORIES = ""; + return $NAV_CATEGORIES; +SC_END + + + +// CALENDAR SHOWEVENT ------------------------------------------------------------ +SC_BEGIN SHOWEVENT_IMAGE + global $SHOWEVENT_IMAGE, $ev; + if($ev['event_cat_icon'] && file_exists(e_PLUGIN."calendar_menu/images/".$ev['event_cat_icon'])){ + $img = ""; + }else{ + $img = ""; + } + return $img; + //return ""; +SC_END + +SC_BEGIN SHOWEVENT_INDICAT + global $SHOWEVENT_INDICAT, $ev; + return $ev['indicat']; +SC_END + +SC_BEGIN SHOWEVENT_HEADING + global $SHOWEVENT_HEADING, $ev, $datearray, $c; + $linkut = mktime(0 , 0 , 0 , $datearray['mon'], $c, $datearray['year']); + if(isset($ev['fulltopic']) && $ev['fulltopic']) + { // Used on first day + $show_title = $ev['event_title']; + } + else + { + if (strlen($ev['event_title']) > 10) + { + $show_title = substr($ev['event_title'], 0, 10) . "..."; + } + else + { + $show_title = $ev['event_title']; + } + } + if($ev['startofevent']) + { + if (isset($ev['is_recent'])) + { + return "".$show_title.""; + } + else + { + return "".$show_title.""; + } + } + else + { + return "".$show_title.""; + } +SC_END + +SC_BEGIN CALENDAR_CALENDAR_RECENT_ICON + global $ev; + if (!isset($ev['is_recent'])) return ""; +// $recent_icon = e_PLUGIN."calendar_menu/images/recent_icon.png"; + $recent_icon = e_IMAGE."generic/".IMODE."/new.png"; + if (file_exists($recent_icon)) + { + return " "; + } + return "R"; +SC_END + + + +// CALENDAR CALENDAR ------------------------------------------------------------ +SC_BEGIN CALENDAR_CALENDAR_HEADER_DAY + global $CALENDAR_CALENDAR_HEADER_DAY, $day, $pref, $week; + if(isset($pref['eventpost_lenday']) && $pref['eventpost_lenday']) + { + return "".substr($day,0,$pref['eventpost_lenday']).""; + } + else + { + return "".$day.""; + } +SC_END + +SC_BEGIN CALENDAR_CALENDAR_DAY_TODAY_HEADING + global $CALENDAR_CALENDAR_DAY_TODAY_HEADING, $startt, $c, $days; + return "".$days[($c-1)]." [".EC_LAN_TODAY."]"; +SC_END + +SC_BEGIN CALENDAR_CALENDAR_DAY_EVENT_HEADING + global $CALENDAR_CALENDAR_DAY_EVENT_HEADING, $startt, $c, $days; + return "".$days[($c-1)].""; +SC_END + +SC_BEGIN CALENDAR_CALENDAR_DAY_EMPTY_HEADING + global $CALENDAR_CALENDAR_DAY_EMPTY_HEADING, $startt, $c, $days; + return "".$days[($c-1)].""; +SC_END + + +// EVENT LIST ------------------------------------------------ +SC_BEGIN EVENTLIST_CAPTION + global $EVENTLIST_CAPTION, $ds, $months, $selected_mon, $dayslo, $selected_day, $monthstart; + if ($ds == 'one') + { + $EVENTLIST_CAPTION = EC_LAN_111.$months[$selected_mon-1]." ".$selected_day; + } + elseif ($ds != 'event') + { + $EVENTLIST_CAPTION = EC_LAN_112.$months[date("m", $monthstart)-1]; + } + return $EVENTLIST_CAPTION; +SC_END + + + +// EVENT ARCHIVE ------------------------------------------------------------ +SC_BEGIN EVENTARCHIVE_CAPTION + global $EVENTARCHIVE_CAPTION, $num; + if ($num == 0) + { + $EVENTARCHIVE_CAPTION = EC_LAN_137; + } + else + { + $EVENTARCHIVE_CAPTION = str_replace("-NUM-", $num, EC_LAN_62); + } + return $EVENTARCHIVE_CAPTION; +SC_END + +SC_BEGIN EVENTARCHIVE_DATE + global $EVENTARCHIVE_DATE, $thisevent, $ecal_class; + $startds = $ecal_class->event_date_string($thisevent['event_start']); + $EVENTARCHIVE_DATE = "".$startds.""; + return $EVENTARCHIVE_DATE; +SC_END + +SC_BEGIN EVENTARCHIVE_DETAILS + global $EVENTARCHIVE_DETAILS, $thisevent, $tp; + $number = 40; + $rowtext = $tp->toHTML($thisevent['event_details'], TRUE, "nobreak"); + $rowtext = strip_tags($rowtext); + $words = explode(" ", $rowtext); + $EVENTARCHIVE_DETAILS = implode(" ", array_slice($words, 0, $number)); + if(count($words) > $number){ + $EVENTARCHIVE_DETAILS .= " ".EC_LAN_133." "; + } + return $EVENTARCHIVE_DETAILS; +SC_END + +SC_BEGIN EVENTARCHIVE_EMPTY + global $EVENTARCHIVE_EMPTY; + return EC_LAN_37; +SC_END + +SC_BEGIN EVENTARCHIVE_HEADING + global $EVENTARCHIVE_HEADING, $thisevent; + $EVENTARCHIVE_HEADING = $thisevent['event_title']; + return $EVENTARCHIVE_HEADING; +SC_END + + + + +// EVENT SHOWEVENT ------------------------------------------------------------ + +SC_BEGIN EVENT_RECENT_ICON + global $thisevent, $ecal_class; + if (($ecal_class->max_recent_show == 0) || (time() - $thisevent['event_datestamp']) > $ecal_class->max_recent_show) return ""; +// Can use the generic icon, or a calendar-specific one + $recent_icon = e_IMAGE."generic/".IMODE."/new.png"; +// $recent_icon = e_PLUGIN."calendar_menu/images/recent_icon.png"; + if (file_exists($recent_icon)) + { + return " "; + } + return ""; +SC_END + +SC_BEGIN EVENT_HEADING_DATE + global $thisevent, $ecal_class; + $startds = $ecal_class->event_date_string($thisevent['event_start']); + return $startds; +SC_END + +SC_BEGIN EVENT_DATE_START + global $thisevent, $ecal_class; + $startds = $ecal_class->event_date_string($thisevent['event_start']); + return $startds; +SC_END + +SC_BEGIN EVENT_TIME_START + global $thisevent, $ecal_class; + if ($thisevent['event_allday'] == 1) return ""; + $startds = $ecal_class->time_string($thisevent['event_start']); + return $startds; +SC_END + +SC_BEGIN EVENT_DATE_END + global $thisevent, $ecal_class; + if ($thisevent['event_allday'] ||($thisevent['event_end'] == $thisevent['event_start'])) return ""; + $endds = $ecal_class->event_date_string($thisevent['event_end']); + return $endds; +SC_END + +SC_BEGIN EVENT_TIME_END + global $thisevent, $ecal_class; + if ($thisevent['event_allday'] ||($thisevent['event_end'] == $thisevent['event_start'])) return ""; + $endds = $ecal_class->time_string($thisevent['event_end']); + return $endds; +SC_END + +SC_BEGIN EVENT_TITLE + global $thisevent; + return $thisevent['event_title']; +SC_END + +SC_BEGIN EVENT_CAT_ICON + global $thisevent; + if ($thisevent['event_cat_icon'] && file_exists(e_PLUGIN."calendar_menu/images/".$thisevent['event_cat_icon'])) + { + return " "; + } + else + { + return ""; + } +SC_END + +SC_BEGIN EVENT_ID + global $thisevent; + return "calevent".$thisevent['event_id']; +SC_END + +SC_BEGIN EVENT_DISPLAYSTYLE + global $EVENT_DISPLAYSTYLE, $ds; + if (($ds=="event") || ($ds=="one")){ + $EVENT_DISPLAYSTYLE = "show"; + }else{ + $EVENT_DISPLAYSTYLE = "none"; + } + return $EVENT_DISPLAYSTYLE; +SC_END + +SC_BEGIN EVENT_DETAILS + global $EVENT_DETAILS, $thisevent, $tp; + return $tp->toHTML($thisevent['event_details'], TRUE); +SC_END + +SC_BEGIN EVENT_CATEGORY + global $EVENT_CATEGORY, $thisevent; + $EVENT_CATEGORY = $thisevent['event_cat_name']; + return $EVENT_CATEGORY; +SC_END + +SC_BEGIN EVENT_LOCATION + global $EVENT_LOCATION, $thisevent; + if ($thisevent['event_location'] == ""){ + $EVENT_LOCATION = ""; + }else{ + $EVENT_LOCATION = $thisevent['event_location']; + } + return $EVENT_LOCATION; +SC_END + +SC_BEGIN EVENT_AUTHOR + global $EVENT_AUTHOR, $event_author_id, $event_author_name; + if(USER){ + $EVENT_AUTHOR = "".$event_author_name.""; + }else{ + $EVENT_AUTHOR = $event_author_name; + } + return $EVENT_AUTHOR; +SC_END + +SC_BEGIN EVENT_CONTACT + global $EVENT_CONTACT, $thisevent,$tp; + if ($thisevent['event_contact'] == ""){ + //$EVENT_CONTACT = EC_LAN_38; // Not Specified ; + $EVENT_CONTACT = ""; + }else{ + $EVENT_CONTACT = $tp->toHTML($thisevent['event_contact'],TRUE); + } + return $EVENT_CONTACT; +SC_END + +SC_BEGIN EVENT_THREAD + global $EVENT_THREAD, $thisevent; + return (isset($thisevent['event_thread']) && ($thisevent['event_thread'] != "")) ? " ".EC_LAN_39."" : ""; +SC_END + +SC_BEGIN EVENT_OPTIONS + global $EVENT_OPTIONS, $thisevent, $event_author_name, $cal_super; + if (USERNAME == $event_author_name || $cal_super){ + $EVENT_OPTIONS = "".EC_LAN_35 . "  ".EC_LAN_36.""; + } + return $EVENT_OPTIONS; +SC_END + + + + +SC_BEGIN NEXT_EVENT_TIME + global $cal_row, $ecal_class; + if ($cal_row['event_allday'] != 1) return $ecal_class->time_string($cal_row['event_start']); else return ''; +SC_END + +SC_BEGIN NEXT_EVENT_DATE + global $cal_row, $ecal_class; + return $ecal_class->next_date_string($cal_row['event_start']); +SC_END + +SC_BEGIN NEXT_EVENT_TITLE + global $pref, $cal_row; + if (isset($pref['eventpost_namelink']) && ($pref['eventpost_namelink'] == '2') && (isset($cal_row['event_thread']) && ($cal_row['event_thread'] != ""))) + { + $fe_event_title = ""; + } + else + { + $fe_event_title = ""; + } + $fe_event_title .= $cal_row['event_title'].""; + return $fe_event_title; +SC_END + +SC_BEGIN NEXT_EVENT_ICON + global $pref, $cal_row, $ecal_dir; + $fe_icon_file = ""; + if ($pref['eventpost_showcaticon'] == 1) + { + if($cal_row['event_cat_icon'] && file_exists($ecal_dir."images/".$cal_row['event_cat_icon'])) + { + $fe_icon_file = $ecal_dir."images/".$cal_row['event_cat_icon']; + } + else + { + $fe_icon_file = THEME."images/".(defined("BULLET") ? BULLET : "bullet2.gif"); + } + } + return $fe_icon_file; +SC_END + +SC_BEGIN NEXT_EVENT_GAP + global $cal_totev; + if ($cal_totev) return "

    "; else return ""; +SC_END + + +*/ +?> \ No newline at end of file diff --git a/e107_plugins/calendar_menu/calendar_sql.php b/e107_plugins/calendar_menu/calendar_sql.php new file mode 100644 index 000000000..8a965266f --- /dev/null +++ b/e107_plugins/calendar_menu/calendar_sql.php @@ -0,0 +1,42 @@ +CREATE TABLE event ( + event_id int(11) unsigned NOT NULL auto_increment, + event_start int(10) NOT NULL default '0', + event_end int(10) NOT NULL default '0', + event_allday tinyint(1) unsigned NOT NULL default '0', + event_recurring tinyint(1) unsigned NOT NULL default '0', + event_datestamp int(10) unsigned NOT NULL default '0', + event_title varchar(200) NOT NULL default '', + event_location text NOT NULL, + event_details text NOT NULL, + event_author varchar(100) NOT NULL default '', + event_contact varchar(200) NOT NULL default '', + event_category smallint(5) unsigned NOT NULL default '0', + event_thread varchar(100) NOT NULL default '', + event_rec_m tinyint(2) unsigned NOT NULL default '0', + event_rec_y tinyint(2) unsigned NOT NULL default '0', + PRIMARY KEY (event_id) + ) TYPE=MyISAM;, + CREATE TABLE event_cat ( + event_cat_id smallint(5) unsigned NOT NULL auto_increment, + event_cat_name varchar(100) NOT NULL default '', + event_cat_icon varchar(100) NOT NULL default '', + event_cat_class int(10) unsigned NOT NULL default '0', + event_cat_subs tinyint(3) unsigned NOT NULL default '0', + event_cat_ahead tinyint(3) unsigned NOT NULL default '0', + event_cat_msg1 text, + event_cat_msg2 text, + event_cat_notify tinyint(3) unsigned NOT NULL default '0', + event_cat_last int(10) unsigned NOT NULL default '0', + event_cat_today int(10) unsigned NOT NULL default '0', + event_cat_lastupdate int(10) unsigned NOT NULL default '0', + event_cat_addclass int(10) unsigned NOT NULL default '0', + event_cat_description text, + event_cat_force_class int(10) unsigned NOT NULL default '0', + PRIMARY KEY (event_cat_id) + ) TYPE=MyISAM;, + CREATE TABLE event_subs ( + event_subid int(10) unsigned NOT NULL auto_increment, + event_userid int(10) unsigned NOT NULL default '0', + event_cat int(10) unsigned NOT NULL default '0', + PRIMARY KEY (event_subid) + ) TYPE=MyISAM; diff --git a/e107_plugins/calendar_menu/calendar_template.php b/e107_plugins/calendar_menu/calendar_template.php new file mode 100644 index 000000000..2d41d9011 --- /dev/null +++ b/e107_plugins/calendar_menu/calendar_template.php @@ -0,0 +1,269 @@ +"; +$sc_style['PREV_MONTH']['post'] = "
    "; + +$sc_style['CURRENT_MONTH']['pre'] = ""; +$sc_style['CURRENT_MONTH']['post'] = ""; + +$sc_style['NEXT_MONTH']['pre'] = ""; +$sc_style['NEXT_MONTH']['post'] = ""; + +$sc_style['PREV_YEAR']['pre'] = ""; +$sc_style['PREV_YEAR']['post'] = ""; + +$sc_style['MONTH_LIST']['pre'] = ""; +$sc_style['MONTH_LIST']['post'] = ""; + +$sc_style['NEXT_YEAR']['pre'] = ""; +$sc_style['NEXT_YEAR']['post'] = ""; + +// + +$CALENDAR_TIME_TABLE = " +
    + + + + +\n + + + + +\n +
    {PREV_MONTH}{CURRENT_MONTH}{NEXT_MONTH}
    {PREV_YEAR}{MONTH_LIST}{NEXT_YEAR}
    "; + + + +// NAVIGATION BUTTONS ------------------------------------------------------------ +//$sc_style['NAV_LINKCURRENTMONTH']['pre'] = ""; +//$sc_style['NAV_LINKCURRENTMONTH']['post'] = ""; +$sc_style['NAV_LINKCURRENTMONTH']['pre'] = ""; +$sc_style['NAV_LINKCURRENTMONTH']['post'] = ""; + +$CALENDAR_NAVIGATION_TABLE = " +
    +
    + + + +\n +
    {NAV_CATEGORIES} {NAV_BUT_ALLEVENTS} {NAV_BUT_VIEWCAT} {NAV_BUT_ENTEREVENT} {NAV_BUT_SUBSCRIPTION} {NAV_LINKCURRENTMONTH}
    +
    +
    "; + + + +// EVENT LIST ------------------------------------------------------------ +$sc_style['EVENTLIST_CAPTION']['pre'] = ""; +$sc_style['EVENTLIST_CAPTION']['post'] = ":

    \n"; + +$EVENT_EVENTLIST_TABLE_START = "{EVENTLIST_CAPTION}"; +$EVENT_EVENTLIST_TABLE_END = "
    "; + + + +// EVENT ARCHIVE ------------------------------------------------------------ +$sc_style['EVENTARCHIVE_CAPTION']['pre'] = ""; +$sc_style['EVENTARCHIVE_CAPTION']['post'] = "\n"; + +$EVENT_ARCHIVE_TABLE_START = "
    {EVENTARCHIVE_CAPTION}"; +$EVENT_ARCHIVE_TABLE = " + + + +\n"; +//
    {EVENTARCHIVE_DETAILS} +$EVENT_ARCHIVE_TABLE_EMPTY = "\n"; +$EVENT_ARCHIVE_TABLE_END = "
    {EVENT_RECENT_ICON}{EVENTARCHIVE_DATE}{EVENTARCHIVE_HEADING}
    {EVENTARCHIVE_EMPTY}
    "; + + + +// EVENT SHOW EVENT ------------------------------------------------------------ +$EVENT_EVENT_TABLE_START = ""; +$EVENT_EVENT_TABLE_END = "
    "; + +$sc_style['EVENT_HEADING_DATE']['pre'] = ""; +$sc_style['EVENT_HEADING_DATE']['post'] = ""; + +$sc_style['EVENT_DETAILS']['pre'] = ""; +$sc_style['EVENT_DETAILS']['post'] = "\n"; + +$sc_style['EVENT_LOCATION']['pre'] = "".EC_LAN_32." "; +$sc_style['EVENT_LOCATION']['post'] = ""; + +$sc_style['EVENT_AUTHOR']['pre'] = "".EC_LAN_31." "; +$sc_style['EVENT_AUTHOR']['post'] = " "; + +$sc_style['EVENT_CONTACT']['pre'] = "".EC_LAN_33." "; +$sc_style['EVENT_CONTACT']['post'] = " "; + +$sc_style['EVENT_THREAD']['pre'] = ""; +$sc_style['EVENT_THREAD']['post'] = "\n"; + +$sc_style['EVENT_CATEGORY']['pre'] = "".EC_LAN_30." "; +$sc_style['EVENT_CATEGORY']['post'] = " "; + +$sc_style['EVENT_DATE_START']['pre'] = (isset($thisevent['event_allday']) && $thisevent['event_allday']) ? "".EC_LAN_68." " : "".EC_LAN_29." "; +$sc_style['EVENT_DATE_START']['post'] = ""; + +$sc_style['EVENT_TIME_START']['pre'] = EC_LAN_144; +$sc_style['EVENT_TIME_START']['post'] = ""; + +$sc_style['EVENT_DATE_END']['pre'] = "".EC_LAN_69." "; +$sc_style['EVENT_DATE_END']['post'] = ""; + +$sc_style['EVENT_TIME_END']['pre'] = EC_LAN_144; +$sc_style['EVENT_TIME_END']['post'] = ""; + +$EVENT_EVENT_TABLE = " + + +
    {EVENT_RECENT_ICON}{EVENT_CAT_ICON}{EVENT_HEADING_DATE}{EVENT_TIME_START} - {EVENT_TITLE}
    +
    + + + \n + + {EVENT_DETAILS} + {EVENT_THREAD} +
    {EVENT_AUTHOR} {EVENT_CAT_ICON} {EVENT_CATEGORY} {EVENT_CONTACT} {EVENT_OPTIONS}
    {EVENT_DATE_START}{EVENT_TIME_START} {EVENT_DATE_END}{EVENT_TIME_END}
    {EVENT_LOCATION}
    +
    + +\n +"; + + +// CALENDAR SHOW EVENT ------------------------------------------------------------ +$sc_style['CALENDAR_CALENDAR_RECENT_ICON']['pre'] = ""; +$sc_style['CALENDAR_CALENDAR_RECENT_ICON']['post'] = ""; +$CALENDAR_SHOWEVENT = "{CALENDAR_CALENDAR_RECENT_ICON}\n
    {SHOWEVENT_IMAGE}{SHOWEVENT_INDICAT}{SHOWEVENT_HEADING}
    "; + + + +// CALENDAR CALENDAR ------------------------------------------------------------ +$CALENDAR_CALENDAR_START = " +
    +"; + +$CALENDAR_CALENDAR_END = " +\n
    "; + +$CALENDAR_CALENDAR_DAY_NON = ""; + +//header row +$CALENDAR_CALENDAR_HEADER_START = ""; +$CALENDAR_CALENDAR_HEADER = "{CALENDAR_CALENDAR_HEADER_DAY}"; +$CALENDAR_CALENDAR_HEADER_END = "\n"; + + +$CALENDAR_CALENDAR_WEEKSWITCH = "\n"; + +//today +$CALENDAR_CALENDAR_DAY_TODAY = " + +{CALENDAR_CALENDAR_DAY_TODAY_HEADING}"; + +//day has events +$CALENDAR_CALENDAR_DAY_EVENT = " + +{CALENDAR_CALENDAR_DAY_EVENT_HEADING}"; + +// no events and not today +$CALENDAR_CALENDAR_DAY_EMPTY = " + +{CALENDAR_CALENDAR_DAY_EMPTY_HEADING}"; + +$CALENDAR_CALENDAR_DAY_END = ""; + +//==================================================================== +// Calendar menu templates +$CALENDAR_MENU_START = "
    "; +$CALENDAR_MENU_TABLE_START = ""; + +$CALENDAR_MENU_END = "
    "; + +// Blank cells at beginning and end +$CALENDAR_MENU_DAY_NON = "
    "; + +//header row +$CALENDAR_MENU_HEADER_START = "\n"; +$CALENDAR_MENU_HEADER_FRONT = ""; +$CALENDAR_MENU_HEADER_BACK = ""; +$CALENDAR_MENU_HEADER_END = "\n"; + + +$CALENDAR_MENU_WEEKSWITCH = "\n"; + +// Start and end CSS for date cells - six cases to decode, determined by array index: +// 1 - Today, no events +// 2 - Some other day, no events (or no icon defined) +// 3 - Today with events (and icon defined) +// 4 - Some other day with events (and icon defined) +// 5 - today with events, one or more of which has recently been added/updated (and icon defined) +// 6 - Some other day with events, one or more of which has recently been added/updated (and icon defined) + +//today, no events +$CALENDAR_MENU_DAY_START['1'] = ""; + +// no events and not today +$CALENDAR_MENU_DAY_START['2'] = ""; + +//day has events - same whether its today or not +$CALENDAR_MENU_DAY_START['3'] = ""; +$CALENDAR_MENU_DAY_START['4'] = ""; +// day has events, one which is recently added/updated +$CALENDAR_MENU_DAY_START['5'] = ""; +$CALENDAR_MENU_DAY_START['6'] = ""; +// Example highlight using background colour: +//$CALENDAR_MENU_DAY_START['5'] = ""; +//$CALENDAR_MENU_DAY_START['6'] = ""; + +$CALENDAR_MENU_DAY_END['1'] = ""; +$CALENDAR_MENU_DAY_END['2'] = ""; +$CALENDAR_MENU_DAY_END['3'] = ""; +$CALENDAR_MENU_DAY_END['4'] = ""; +$CALENDAR_MENU_DAY_END['5'] = ""; +$CALENDAR_MENU_DAY_END['6'] = ""; + +//============================================================================ +// Next event menu template +$sc_style['NEXT_EVENT_TIME']['pre'] = EC_LAN_144; +$sc_style['NEXT_EVENT_TIME']['post'] = ""; +// Following are original styles +//$sc_style['NEXT_EVENT_ICON']['pre'] = " \ No newline at end of file diff --git a/e107_plugins/calendar_menu/e_list.php b/e107_plugins/calendar_menu/e_list.php new file mode 100644 index 000000000..9bb93cb7d --- /dev/null +++ b/e107_plugins/calendar_menu/e_list.php @@ -0,0 +1,62 @@ + db_Select("plugin", "*", "plugin_path = 'calendar_menu' AND plugin_installflag = '1' ")) + { + return; + } + + $LIST_CAPTION = $arr[0]; + $LIST_DISPLAYSTYLE = ($arr[2] ? "" : "none"); + +require_once('ecal_class.php'); +$ecal_class = new ecal_class; + +$current_day = $ecal_class->cal_date['mday']; +$current_month = $ecal_class->cal_date['mon']; +$current_year = $ecal_class->cal_date['year']; + + $current = mktime(0,0,0,$current_month, $current_day, $current_year); + + if($mode == "new_page" || $mode == "new_menu" ){ + $lvisit = $this -> getlvisit(); + $qry = " event_datestamp>".intval($lvisit)." AND "; + }else{ + $qry = ""; + } + + $bullet = $this -> getBullet($arr[6], $mode); + + $qry = " + SELECT e.*, c.event_cat_name + FROM #event AS e + LEFT JOIN #event_cat AS c ON c.event_cat_id = e.event_category + WHERE ".$qry." e.event_start>='$current' AND c.event_cat_class REGEXP '".e_CLASS_REGEXP."' + ORDER BY e.event_start ASC LIMIT 0,".intval($arr[7]); + + if(!$event_items = $sql->db_Select_gen($qry)){ + $LIST_DATA = LIST_CALENDAR_2; + }else{ + while($row = $sql -> db_Fetch()){ + + $tmp = explode(".", $row['event_author']); + if($tmp[0] == "0"){ + $AUTHOR = $tmp[1]; + }elseif(is_numeric($tmp[0]) && $tmp[0] != "0"){ + $AUTHOR = (USER ? "".$tmp[1]."" : $tmp[1]); + }else{ + $AUTHOR = ""; + } + + $rowheading = $this -> parse_heading($row['event_title'], $mode); + $ICON = $bullet; + $HEADING = "".$rowheading.""; + $CATEGORY = $row['event_cat_name']; + $DATE = ($arr[5] ? ($row['event_start'] ? $this -> getListDate($row['event_start'], $mode) : "") : ""); + $INFO = ""; + $LIST_DATA[$mode][] = array( $ICON, $HEADING, $AUTHOR, $CATEGORY, $DATE, $INFO ); + } + } + +?> \ No newline at end of file diff --git a/e107_plugins/calendar_menu/e_notify.php b/e107_plugins/calendar_menu/e_notify.php new file mode 100644 index 000000000..e098c7682 --- /dev/null +++ b/e107_plugins/calendar_menu/e_notify.php @@ -0,0 +1,53 @@ + NT_LAN_EC_7, 'ecaledit' => NT_LAN_EC_2); +} + +if (!function_exists('notify_ecalnew')) +{ + function notify_ecalnew($data) { + global $nt; + include_lan(e_PLUGIN."calendar_menu/languages/".e_LANGUAGE.".php"); + $message = NT_LAN_EC_3.': '.USERNAME.' ('.NT_LAN_EC_4.': '.$data['ip'].' )
    '; + $message .= NT_LAN_EC_5.':
    '.$data['cmessage'].'

    '; + $nt -> send('ecaledit', NT_LAN_EC_6, $message); + } +} + +if (!function_exists('notify_ecaledit')) { + function notify_ecaledit($data) { + global $nt; + include_lan(e_PLUGIN."calendar_menu/languages/".e_LANGUAGE.".php"); + $message = NT_LAN_EC_3.': '.USERNAME.' ('.NT_LAN_EC_4.': '.$data['ip'].' )
    '; + $message .= NT_LAN_EC_5.':
    '.$data['cmessage'].'

    '; + $nt -> send('ecaledit', NT_LAN_EC_8, $message); + } +} + + + + +?> \ No newline at end of file diff --git a/e107_plugins/calendar_menu/e_rss.php b/e107_plugins/calendar_menu/e_rss.php new file mode 100644 index 000000000..7d3559875 --- /dev/null +++ b/e107_plugins/calendar_menu/e_rss.php @@ -0,0 +1,59 @@ +cal_date['mday']; +$current_month = $ecal_class->cal_date['mon']; +$current_year = $ecal_class->cal_date['year']; +$current = mktime(0,0,0,$current_month, $current_day, $current_year); + +$qry = " +SELECT e.*, c.event_cat_name +FROM #event AS e +LEFT JOIN #event_cat AS c ON c.event_cat_id = e.event_category +WHERE e.event_start>='$current' AND c.event_cat_class REGEXP '".e_CLASS_REGEXP."' +ORDER BY e.event_start ASC LIMIT 0,".$this->limit; + +$rss = array(); +$sqlrss = new db; +if($items = $sqlrss->db_Select_gen($qry)){ + $i=0; + while($rowrss = $sqlrss -> db_Fetch()){ + $tmp = explode(".", $rowrss['event_author']); + $rss[$i]['author'] = $tmp[1]; + $rss[$i]['author_email'] = ''; + $rss[$i]['link'] = $e107->base_path.$PLUGINS_DIRECTORY."calendar_menu/event.php?".$rowrss['event_start'].".event.".$rowrss['event_id']; + $rss[$i]['linkid'] = $rowrss['event_id']; + $rss[$i]['title'] = $rowrss['event_title']; + $rss[$i]['description'] = ''; + $rss[$i]['category_name'] = $rowrss['event_cat_name']; + $rss[$i]['category_link'] = ''; + $rss[$i]['datestamp'] = $rowrss['event_start']; + $rss[$i]['enc_url'] = ""; + $rss[$i]['enc_leng'] = ""; + $rss[$i]['enc_type'] = ""; + $i++; + } +} +//##### ------------------------------------------------------------------------------------ + +$eplug_rss_feed[] = $feed; +$eplug_rss_data[] = $rss; + +?> \ No newline at end of file diff --git a/e107_plugins/calendar_menu/e_search.php b/e107_plugins/calendar_menu/e_search.php new file mode 100644 index 000000000..0e3212c80 --- /dev/null +++ b/e107_plugins/calendar_menu/e_search.php @@ -0,0 +1,11 @@ + e_PLUGIN.'calendar_menu/search/search_parser.php', 'qtype' => CM_SCH_LAN_1, 'refpage' => 'calendar.php'); + +?> \ No newline at end of file diff --git a/e107_plugins/calendar_menu/ecal_class.php b/e107_plugins/calendar_menu/ecal_class.php new file mode 100644 index 000000000..b7023c61d --- /dev/null +++ b/e107_plugins/calendar_menu/ecal_class.php @@ -0,0 +1,245 @@ +time_now = time(); + $this->site_timedate = $this->time_now + ($pref['time_offset'] * 3600); // Check sign of offset + $this->user_timedate = $this->time_now + TIMEOFFSET; + switch ($pref['eventpost_caltime']) + { + case 1 : + $this->cal_timedate = $this->site_timedate; // Site time + break; + case 2 : + $this->cal_timedate = $this->user_timedate; // User + break; + default : + $this->cal_timedate = $this->time_now; // Server time - default + } + $this->now_date = getdate($this->time_now); + $this->site_date = getdate($this->site_timedate); // Array with h,m,s, day, month year etc + $this->cal_date = getdate($this->cal_timedate); + + $this->max_cache_time = $this->site_date['minutes'] + 60*$this->site_date['hours']; + + $this->cal_super = check_class($pref['eventpost_super']); + if ($this->cal_super) $this->extra_query = ""; else $this->extra_query = " AND find_in_set(event_cat_class,'".USERCLASS_LIST."')"; + + if (isset($pref['eventpost_recentshow']) && ($pref['eventpost_recentshow'] != 0)) + { + $this->max_recent_show = 3600 * $pref['eventpost_recentshow']; + } + else + { + $this->max_recent_show = 0; + } + switch ($pref['eventpost_timedisplay']) + { + case 2 : + $this->time_format_string = "%I:%M %p"; // 12-hour display + break; + case 3 : + $this->time_format_string = $pref['eventpost_timecustom']; // custom display + if (isset($this->time_format_string)) break; + default : + $this->time_format_string = "%H%M"; // default to 24-hour display + } + + switch ($pref['eventpost_datedisplay']) + { // Event entry calendar + case 2 : + $this->cal_format_string = "d-m-Y"; + $this->dcal_format_string = "%d-%m-%Y"; + $this->java_format_code = 2; + break; + case 3 : + $this->cal_format_string = "m-d-Y"; + $this->dcal_format_string = "%m-%d-%Y"; + $this->java_format_code = 3; + break; + default : // 'original' defaults + $this->cal_format_string = "Y-m-d"; + $this->dcal_format_string = "%Y-%m-%d"; + $this->java_format_code = 1; + } + + switch ($pref['eventpost_dateevent']) + { // Event list date display + case 0 : + $this->event_date_format_string = $pref['eventpost_eventdatecustom']; + break; + case 2 : + $this->event_date_format_string = "%a %d %b %Y"; + break; + case 3 : + $this->event_date_format_string = "%a %d-%m-%y"; + break; + default : + $this->event_date_format_string = "%A %d %B %Y"; + } + + switch ($pref['eventpost_datenext']) + { // Forthcoming event date display + case 0 : + $this->next_date_format_string = $pref['eventpost_nextdatecustom']; + break; + case 2 : + $this->next_date_format_string = "%d %b"; + break; + case 3 : + $this->next_date_format_string = "%B %d"; + break; + case 4 : + $this->next_date_format_string = "%b %d"; + break; + default : + $this->next_date_format_string = "%d %B"; + } + } + + function time_string($convtime) + { // Returns a time string from a time stamp, formatted as 24-hour, 12-hour or custom as set in prefs + return strftime($this->time_format_string, $convtime); + } + + function event_date_string($convdate) + { // Returns a date string from a date stamp, formatted for display in event list + return strftime($this->event_date_format_string,$convdate); + } + + + function next_date_string($convdate) + { // Returns a date string from a date stamp, formatted for display in forthcoming event menu + return strftime($this->next_date_format_string,$convdate); + } + + + function full_date($convdate) + { // Returns a date as dd-mm-yyyy or yyyy-mm-dd according to prefs (for event entry) + return date($this->cal_format_string, $convdate); + } + + function make_date($new_hour, $new_minute, $date_string) + { // Turns a date as entered in the calendar into a time stamp (for event entry) + global $pref; + $tmp = explode("-", $date_string); + switch ($pref['eventpost_datedisplay']) + { + case 2 : + return mktime($new_hour, $new_minute, 0, $tmp[1], $tmp[0], $tmp[2]); // dd-mm-yyyy + case 3 : + return mktime($new_hour, $new_minute, 0, $tmp[0], $tmp[1], $tmp[2]); // mm-dd-yyyy + default : + return mktime($new_hour, $new_minute, 0, $tmp[1], $tmp[2], $tmp[0]); // yyyy-mm-dd + } + } + + function cal_log($event_type, $event_title = '', $event_string='', $event_start=0) + { // All calendar-related logging intentionally passed through a single point to maintain control + // (so we could also add other info if we wanted) + // Event types: + // 1 - add event + // 2 - edit event + // 3 - delete event + // 4 - Bulk delete + global $pref, $admin_log, $e_event; + + $log_titles = array( '1' => 'Event Calendar - add event', + '2' => 'Event Calendar - edit event', + '3' => 'Event Calendar - delete event', + '4' => 'Event Calendar - Bulk Delete' + ); +// Do the notifies first + $cmessage = $log_titles[$event_type]."
    "; + if ($event_start > 0) + $cmessage .= "Event Start: ".strftime("%d-%B-%Y",$event_start)."
    "; + else + $cmessage .= "Event Start unknown
    "; + $edata_ec = array("cmessage" => $cmessage, "ip" => getip()); + switch ($event_type) + { + case 1 : $e_event -> trigger("ecalnew", $edata_ec); + break; + case 2 : + case 3 : + case 4 : $e_event -> trigger("ecaledit", $edata_ec); + break; + } + + switch ($pref['eventpost_adminlog']) + { + case 1 : if ($event_type == '1') return; + case 2 : break; // Continue + default : return; // Invalid or undefined option + } + $log_titles = array( '1' => 'Event Calendar - add event', + '2' => 'Event Calendar - edit event', + '3' => 'Event Calendar - delete event', + '4' => 'Event Calendar - Bulk Delete' + ); + $admin_log->log_event($log_titles[$event_type],$event_title." \n".$event_string,4); + } + } + +?> diff --git a/e107_plugins/calendar_menu/event.php b/e107_plugins/calendar_menu/event.php new file mode 100644 index 000000000..3b027faab --- /dev/null +++ b/e107_plugins/calendar_menu/event.php @@ -0,0 +1,854 @@ +cal_super; + +require_once(e_HANDLER."calendar/calendar_class.php"); +$cal = new DHTML_Calendar(true); + +$category_filter = ""; +if ((isset($_POST['event_cat_ids']) && $_POST['event_cat_ids'] != "all")) +{ + $category_filter = " AND (e.event_category = '".$_POST['event_cat_ids']."') "; +} + +/* +// enter new category into db +if (isset($_POST['ne_cat_create'])) +{ + if ($_POST['ne_new_category'] != "") + { + $sql->db_Insert("event_cat", "0, '".$tp->toDB($_POST['ne_new_category'])."', '".$tp->toDB($_POST['ne_new_category_icon'])."', '0', '0', '0', '0', '', '', '0', '0', '0', '".time()."', '0' "); + header("location:event.php?".$_POST['qs'].".m1"); + } + else + { + header("location:event.php?".$_POST['qs'].".m3"); + } +} +*/ +// Event to add or update +if ((isset($_POST['ne_insert']) || isset($_POST['ne_update'])) && USER == true) +{ + if (($_POST['ne_event'] == "") || !isset($_POST['qs'])) + { // Problem - tell user to go away + header("location:event.php?".$ev_start.".m3"); + } + else + { + $ev_start = $ecal_class->make_date($_POST['ne_hour'], $_POST['ne_minute'],$_POST['start_date']); + $ev_end = $ecal_class->make_date($_POST['end_hour'], $_POST['end_minute'],$_POST['end_date']); + $ev_title = $tp->toDB($_POST['ne_title']); + $ev_location = $tp->toDB($_POST['ne_location']); + $ev_event = $tp->toDB($_POST['ne_event']); + $temp_date = getdate($ecal_class->make_date(0,0,$_POST['start_date'])); + if ($_POST['recurring'] == 1) + { + $rec_m = $temp_date['mday']; // Day of month + $rec_y = $temp_date['mon']; // Month number + } + else + { + $rec_m = ""; + $rec_y = ""; + } + + $report_msg = '.m3'; + if (isset($_POST['ne_insert'])) + { // Bits specific to inserting a new event + $qry = " 0, '".intval($ev_start)."', '".intval($ev_end)."', '".intval($_POST['allday'])."', '".intval($_POST['recurring'])."', '".time()."', '$ev_title', '$ev_location', '$ev_event', '".USERID.".".USERNAME."', '".$tp -> toDB($_POST['ne_email'])."', '".intval($_POST['ne_category'])."', '".$tp -> toDB($_POST['ne_thread'])."', '".intval($rec_m)."', '".intval($rec_y)."' "; + $sql->db_Insert("event", $qry); + $ecal_class->cal_log(1,'db_Insert',$qry, $ev_start); + $qs = preg_replace("/ne./i", "", $_POST['qs']); + $report_msg = '.m4'; + } + + if (isset($_POST['ne_update'])) + { // Bits specific to updating an existing event + $qry = "event_start='".intval($ev_start)."', event_end='".intval($ev_end)."', event_allday='".intval($_POST['allday'])."', event_recurring='".intval($_POST['recurring'])."', event_datestamp= '".time()."', event_title= '$ev_title', event_location='$ev_location', event_details='$ev_event', event_contact='".$tp -> toDB($_POST['ne_email'])."', event_category='".intval($_POST['ne_category'])."', event_thread='".$tp -> toDB($_POST['ne_thread'])."', event_rec_m='".intval($rec_m)."', event_rec_y='".intval($rec_y)."' WHERE event_id='".intval($_POST['id'])."' "; + $sql->db_Update("event", $qry); + $ecal_class->cal_log(2,'db_Update',$qry, $ev_start); + $qs = preg_replace("/ed./i", "", $_POST['qs']); + $report_msg = '.m5'; + } + // Now clear cache - just do the lot for now - get clever later + $e107cache->clear('nq_event_cal'); + header("location:event.php?".$ev_start.".".$qs.$report_msg); + } +} + +$action = ""; // Remove notice + +require_once(HEADERF); + +if (isset($_POST['jump'])) +{ + $smarray = getdate(mktime(0, 0, 0, $_POST['jumpmonth'], 1, $_POST['jumpyear'])); + $month = $smarray['mon']; + $year = $smarray['year']; +} +else +{ + if(e_QUERY) + { + $qs = explode(".", e_QUERY); + $action = $qs[0]; // Often a date if just viewing + $ds = (isset($qs[1]) ? $qs[1] : ""); + $eveid = (isset($qs[2]) ? $qs[2] : ""); + } + + if ($action == "") + { + $month = $ecal_class->cal_date['mon']; + $year = $ecal_class->cal_date['year']; + } + else + { + $smarray = getdate($action); + $month = $smarray['mon']; + $year = $smarray['year']; + } +} + + +if (isset($_POST['confirm'])) +{ + $qry = "event_id='".intval($_POST['existing'])."' "; + if ($sql->db_Delete("event", $qry)) + { + $message = EC_LAN_51; //Event Deleted + $ecal_class->cal_log(3,'db_Delete',$qry,$ev_start); + } + else + { + $message = EC_LAN_109; //Unable to Delete event for some mysterious reason + } +} + + +if ($action == "de") +{ // Delete event - show confirmation form + $text = "
    + ".EC_LAN_48." +

    +
    + + + + +
    +
    "; + $ns->tablerender(EC_LAN_46, $text); // Confirm Delete Event + require_once(FOOTERF); + exit; +} + + + +if (isset($_POST['cancel'])) +{ // Delete Cancelled + $message = EC_LAN_47; +} + + +// set up data arrays ---------------------------------------------------------------------------------- +// (some of these are only used in the shortcodes) +if ($pref['eventpost_weekstart'] == 'sun') +{ + $days = Array(EC_LAN_25, EC_LAN_19, EC_LAN_20, EC_LAN_21, EC_LAN_22, EC_LAN_23, EC_LAN_24); +} +else +{ + $days = Array(EC_LAN_19, EC_LAN_20, EC_LAN_21, EC_LAN_22, EC_LAN_23, EC_LAN_24, EC_LAN_25); +} +$dayslo = array('1.', '2.', '3.', '4.', '5.', '6.', '7.', '8.', '9.', '10.', '11.', '12.', '13.', '14.', '15.', '16.', '17.', '18.', '19.', '20.', '21.', '22.', '23.', '24.', '25.', '26.', '27.', '28.', '29.', '30.', '31.'); +$monthabb = Array(EC_LAN_JAN, EC_LAN_FEB, EC_LAN_MAR, EC_LAN_APR, EC_LAN_MAY, EC_LAN_JUN, EC_LAN_JUL, EC_LAN_AUG, EC_LAN_SEP, EC_LAN_OCT, EC_LAN_NOV, EC_LAN_DEC); +$months = array(EC_LAN_0, EC_LAN_1, EC_LAN_2, EC_LAN_3, EC_LAN_4, EC_LAN_5, EC_LAN_6, EC_LAN_7, EC_LAN_8, EC_LAN_9, EC_LAN_10, EC_LAN_11); +// ---------------------------------------------------------------------------------------------------------- + +// Messages acknowledging actions +$poss_message = array('m1' => EC_LAN_41, 'm2' => EC_LAN_42, 'm3' => EC_LAN_43, 'm4' => EC_LAN_44, 'm5' => EC_LAN_45); +if (isset($qs[2])) if (isset($poss_message[$qs[2]])) $message = $poss_message[$qs[2]]; + +if (isset($message)) +{ + $ns->tablerender("", "
    ".$message."
    "); +} + + +// enter new event form +if ($action == "ne" || $action == "ed") +{ + if ($ecal_class->cal_super || check_class($pref['eventpost_admin'])) + { +function make_calendar($boxname, $boxvalue) +{ + global $ecal_class, $cal; + + unset($cal_options); + unset($cal_attrib); + $cal_options['firstDay'] = 0; + $cal_options['showsTime'] = false; + $cal_options['showOthers'] = true; + $cal_options['weekNumbers'] = false; + $cal_options['ifFormat'] = $ecal_class->dcal_format_string; + $cal_attrib['class'] = "tbox"; + $cal_attrib['size'] = "12"; + $cal_attrib['name'] = $boxname; + $cal_attrib['value'] = $boxvalue; + return $cal->make_input_field($cal_options, $cal_attrib); +} + + +function make_hourmin($boxname,$cur_hour,$cur_minute) +{ + global $pref; + if (isset($pref['eventpost_fivemins'])) $incval = 5; else $incval = 1; + $retval = " \n + \n"; + return $retval; +} + + + if ($action == "ed") + { // Editing existing event - read from database + $sql->db_Select("event", "*", "event_id='".intval($qs[1])."' "); + list($null, $ne_start, $ne_end, $allday, $recurring, $ne_datestamp, $ne_title, $ne_location, $ne_event, $ne_author, $ne_email, $ne_category, $ne_thread) = $sql->db_Fetch(); + + $smarray = getdate($ne_start); + $ne_hour = $smarray['hours']; + $ne_minute = $smarray['minutes']; + $ne_startdate = $ecal_class->full_date($ne_start); + + $smarray = getdate($ne_end); + $end_hour = $smarray['hours']; + $end_minute = $smarray['minutes']; + $ne_enddate = $ecal_class->full_date($ne_end); + } + else + { // New event - initialise everything + $smarray = getdate($qs[1]); + $month = $smarray['mon']; + $year = $smarray['year']; + $ne_startdate = $ecal_class->full_date($qs[1]); + + $ne_hour = $smarray['hours']; + $ne_minute = $smarray['minutes']; + + $end_hour = $smarray['hours']; + $end_minute = $smarray['minutes']; + $ne_enddate = $ecal_class->full_date($qs[1]); + } + + $text = " + "; + + $text .= " +
    + "; + + if ($action == "ed") + { + $caption = EC_LAN_66; // edit Event + + } elseif ($action == "ne") + { + $caption = EC_LAN_28; // Enter New Event + } + else + { + $caption = EC_LAN_83; + } + + $text .= " + + + + + + + + + + + + + + + + + + + + "; + // * *BK* Check if the add class is appropriate for adding new categories + // * *BK* It will default to everybody class when created. Need to go in to admin categories if + // * *BK* you want to change read class. + if (FALSE && check_class($pref['eventpost_addcat']) && $action != "ed") + { + require_once(e_HANDLER."file_class.php"); + $fi = new e_file; + $imagelist = $fi->get_files(e_PLUGIN."calendar_menu/images", "\.\w{3}$"); + $text .= " + + + + "; + } + + $text .= " + + + + + + + + + "; + // * *BK* + // * *BK* Only display for forum thread if it is required. No point in being in if not wanted + // * *BK* or if forums are inactive + // * *BK* + if (isset($pref['eventpost_forum']) && $pref['eventpost_forum'] == 1) + { + $text .= " + + + + "; + } + // * *BK* + // * *BK* If the user is logged in and has their email set plus the field is empty then put in + // * *BK* their email address. They can always take it out if they want, its not a required field + if (empty($ne_email) && ($action == "ne") && defined('USEREMAIL')) + { + $ne_email = USEREMAIL; + } + $text .= " + + + + + + + + + + +
    ".EC_LAN_72." ".EC_LAN_67." "; + + + $text .= make_calendar("start_date",$ne_startdate)."   ".EC_LAN_73." ".make_calendar("end_date",$ne_enddate); + $text .= " +
    ".EC_LAN_71." + ".EC_LAN_67; + + + $text .= make_hourmin("ne_",$ne_hour,$ne_minute)."  ".EC_LAN_73.make_hourmin('end_',$end_hour,$end_minute); + $text .= "
    "; + $text .= EC_LAN_64." +
    ".EC_LAN_65.""; + $text .= ""; + $text .= EC_LAN_63." +
    ".EC_LAN_70." * + +
    ".EC_LAN_52." + +
    ".EC_LAN_53." ".EC_LAN_54." + "; + $text .= "
    ".EC_LAN_55; + $text .= " "; + $text .= " "; + $text .= ""; + $text .= "
    +
    +
    ".EC_LAN_32." + +
    ".EC_LAN_57." * + +
    ".EC_LAN_58." + +
    ".EC_LAN_59." + +
    ".EC_LAN_105."
    "; + if ($action == "ed") + { + $text .= " + "; + } + else + { + $text .= ""; + } + $text .= "
    +
    "; + + $ns->tablerender($caption, $text); + require_once(FOOTERF); + exit; + } + else + { + header("location:".e_PLUGIN."calendar_menu/event.php"); + exit; + } +} // End of "Enter New Event + +//----------------------------------------------- +// show events +// $month, $year have the month required +//----------------------------------------------- +$monthstart = mktime(0, 0, 0, $month, 1, $year); +$firstdayarray = getdate($monthstart); +$monthend = mktime(0, 0, 0, $month + 1, 1, $year) -1 ; +$lastdayarray = getdate($monthend); + +$prevmonth = ($month-1); +$prevyear = $year; +if ($prevmonth == 0) +{ + $prevmonth = 12; + $prevyear = ($year-1); +} +$previous = mktime(0, 0, 0, $prevmonth, 1, $prevyear); + +$nextmonth = ($month + 1); +$nextyear = $year; +if ($nextmonth == 13) +{ + $nextmonth = 1; + $nextyear = ($year + 1); +} + +$prop = mktime(0, 0, 0, $month, 1, $year); // Sets start date for new event entry +$next = mktime(0, 0, 0, $nextmonth, 1, $nextyear); // Used by nav buttons +$nowmonth = $ecal_class->cal_date['mon']; +$nowyear = $ecal_class->cal_date['year']; + + +$py = $year-1; +$prevlink = mktime(0, 0, 0, $month, 1, $py); +$ny = $year + 1; +$nextlink = mktime(0, 0, 0, $month, 1, $ny); + +if (is_readable(THEME."calendar_template.php")) +{ // Has to be require + require(THEME."calendar_template.php"); +} +else +{ + require(e_PLUGIN."calendar_menu/calendar_template.php"); +} + +$text2 = ""; +// time switch buttons +$text2 .= $tp -> parseTemplate($CALENDAR_TIME_TABLE, FALSE, $calendar_shortcodes); + +// navigation buttons +$text2 .= $tp -> parseTemplate($CALENDAR_NAVIGATION_TABLE, FALSE, $calendar_shortcodes); + + +// ****** CAUTION - the category dropdown also used $sql object - take care to avoid interference! + +$event = array(); +$extra = ''; + +if ($ds == "event") +{ // Show single event + $qry = " + SELECT e.*, ec.* + FROM #event as e + LEFT JOIN #event_cat as ec ON e.event_category = ec.event_cat_id + WHERE e.event_id='".intval($eveid)."' + {$ecal_class->extra_query} + "; + $sql2->db_Select_gen($qry); + $row = $sql2->db_Fetch(); + if ($row['event_recurring']=='1') // Single event, selected by ID. So day/month must match + { + $row['event_start'] = mktime(0,0,0,$row['event_rec_y'],$row['event_rec_m'],$year); + $row['event_end'] = $row['event_start']; + } + $event[] = $row; + $next10_start = $event[0]['event_start']; + $text2 .= $tp -> parseTemplate($EVENT_EVENT_TABLE_START, FALSE, $calendar_shortcodes); + $text2 .= show_event($event); + $text2 .= $tp -> parseTemplate($EVENT_EVENT_TABLE_END, FALSE, $calendar_shortcodes); + +} +else +{ + if ($ds == 'one') + { // Show events from one day + $tmp = getdate($action); + $selected_day = $tmp['mday']; + $selected_mon = $tmp['mon']; + $start_time = $action; + $end_time = $action + 86399; + $next10_start = $end_time + 1; + $cap_title = " - ".$months[$selected_mon-1]." ".$selected_day; + $extra = " OR (e.event_rec_y = ".intval($selected_mon)." AND e.event_rec_m = ".intval($selected_day).") "; + } + else + { // Display whole of selected month + $start_time = $monthstart; + $end_time = $monthend; + $next10_start = $end_time + 1; + $cap_title = ''; + $extra = " OR e.event_rec_y = ".intval($month)." "; + } + + + $qry = " + SELECT e.*, ec.* + FROM #event as e + LEFT JOIN #event_cat as ec ON e.event_category = ec.event_cat_id WHERE (e.event_recurring = '0' AND + ((e.event_start >= ".intval($start_time)." AND e.event_start <= ".intval($end_time).") + OR (e.event_end >= ".intval($start_time)." AND e.event_end <= ".intval($end_time).") + OR (e.event_start <= ".intval($start_time)." AND e.event_end >= ".intval($end_time).") ) + {$extra}) + {$category_filter} + {$ecal_class->extra_query} + ORDER BY e.event_start ASC + "; + +// Query generates a list of event IDs in $idarray which meet the criteria. +// $idarray has one primary index location for each day of month, then secondary for events. + if ($cal_count=$sql->db_Select_gen($qry)) + { + while ($row = $sql->db_Fetch()) + { + if ($row['event_recurring']=='1') // Recurring events + { + if (($row['event_rec_y'] == $month) && (!in_array($row['event_id'], $idArray))) // Only allow one instance of each recurring event + { + $tmp = getdate($row['event_start']); + $row['event_start'] = mktime($tmp['hours'],$tmp['minutes'],0,$row['event_rec_y'],$row['event_rec_m'],$year); + $row['event_end'] = $row['event_start']; + $events[$row['event_rec_m']][] = $row; + $idArray[] = $row['event_id']; + } + } + else + { + if ($ds == 'one') + { + if (!isset($idArray) || !is_array($idArray) || !in_array($row['event_id'], $idArray)) + { + $events[$selected_day][] = $row; + $idArray[] = $row['event_id']; + } + } + else + { // Multiple events + if ($row['event_start'] < intval($start_time)) + { + $start_day = "1"; // Event starts before this month + } + else + { + $tmp = getdate($row['event_start']); + $start_day = $tmp['mday']; + } + if ($row['event_end'] < $row['event_start']) + { // End date before start date + $end_day = $start_day; + } + else + { + if ($row['event_end'] > intval($end_time)) + { + $end_day = "31"; // Event ends after this month + } + else + { + $tmp = getdate($row['event_end']); + $end_day = $tmp['mday']; + } + } + for ($i = $start_day; $i <= $end_day; $i++) + { + if (!isset($idArray) || !is_array($idArray) || !in_array($row['event_id'], $idArray)) + { + $events[$i][] = $row; + $idArray[] = $row['event_id']; + } + } + } + } + } + } +} + + +// event list +if(isset($events) && is_array($events)) +{ + $text2 .= $tp -> parseTemplate($EVENT_EVENTLIST_TABLE_START, FALSE, $calendar_shortcodes); + foreach ($events as $dom => $event){ + $text2 .= show_event($event); + } + $text2 .= $tp -> parseTemplate($EVENT_EVENTLIST_TABLE_END, FALSE, $calendar_shortcodes); +} + + +/* +$nextmonth = mktime(0, 0, 0, $month + 1, 1, $year)-1; +if (!isset($next10_start)) +{ + $next10_start = $nextmonth; +} +*/ + +// Show next 10 events after current event/day/month (doesn't show recurring events) +$qry = " +SELECT e.* FROM #event AS e +LEFT JOIN #event_cat AS ec ON e.event_category = ec.event_cat_id +WHERE e.event_start > '".intval($next10_start)."' {$ecal_class->extra_query} {$category_filter} +ORDER BY e.event_start ASC +LIMIT 0, 10 +"; + +$num = $sql->db_Select_gen($qry); +if ($num != 0) +{ + $gen = new convert; + $archive_events = ""; +// while ($events = $sql->db_Fetch()) + while ($thisevent = $sql->db_Fetch()) + { + $archive_events .= $tp -> parseTemplate($EVENT_ARCHIVE_TABLE, FALSE, $calendar_shortcodes); + } +} +else +{ + $archive_events = $tp -> parseTemplate($EVENT_ARCHIVE_TABLE_EMPTY, FALSE, $calendar_shortcodes); +} + +$text2 .= $tp -> parseTemplate($EVENT_ARCHIVE_TABLE_START, FALSE, $calendar_shortcodes); +$text2 .= $archive_events; +$text2 .= $tp -> parseTemplate($EVENT_ARCHIVE_TABLE_END, FALSE, $calendar_shortcodes); + + +$caption = EC_LAN_80; // "Event List"; +$ns->tablerender($caption.(isset($cap_title) ? $cap_title : ""), $text2); +require_once(FOOTERF); + + +// Display one event in a form which can be expanded. +function show_event($day_events) +{ + global $tp, $cal_super, $_POST, $ds, $thisevent, $EVENT_ID, $EVENT_EVENT_TABLE, $calendar_shortcodes, $event_author_id, $event_author_name; + $text2 = ""; + foreach($day_events as $event) + { + $thisevent = $event; + $gen = new convert; + $lp = explode(".", $thisevent['event_author'],2); + if (preg_match("/[0-9]+/", $lp[0])) + { + $event_author_id = $lp[0]; + $event_author_name = $lp[1]; + } + $text2 .= $tp -> parseTemplate($EVENT_EVENT_TABLE, FALSE, $calendar_shortcodes); + } + return $text2; +} + + +function headerjs() +{ + global $cal; + $script = $cal->load_files(); +/* + $script .= " + "; +*/ + return $script; +} + +?> diff --git a/e107_plugins/calendar_menu/images/b1.png b/e107_plugins/calendar_menu/images/b1.png new file mode 100644 index 0000000000000000000000000000000000000000..107ae9a1c56c710546a045be66fea1bfbcea2799 GIT binary patch literal 716 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 orhxaAVI-*mcuOQnfO(Sq1C?Gk>jr=T^zGE zawy5+B!8O{@8hEXbvtU{)hQf(f`%`uA-w=UcfctE6k&kR>JZBDB_*mtL^RQg|8AiV zW6)t3x@CY;c{ojwJ#)ZD5xuKLj}S0vSCZn@C=u0L313RKdk4E6MWK^8be@9bYWOS( z?}xxADkNH@z7p|APBfLF4$2^@0JJBN!89WF7f&g*hzx_hNcboTou*+-jUcq_7zw*0 zkOu|FJMlOtmLT9EMpVwA5dwajN0qGX4u?>7JWRl^@mL6lT{0pU^aw3rF+6s|h(+*N z6o=hm&?`nX)PgHGEZmBJVa2X<=uHk)sBn@+Kh+{15ok0^-nURO4CzZ^q$(=PMAIx8 z&JzA6)X#({O(;bK`sonbKt^b2T1zJ|>Nul{qQf-0?-ETK4WkM+;66H;N>839WbsDz zGlMQgr+sSD{l@6Dx*vYhYtvbMn4UbPg2~HxoK{t0VNE6z!)BW;jEQ+s%&|dgB2a~q zazYRUp69K6o7HL^5O~2poNCma#St|XV>BA=cDvK*6h%?1)e@LLO)AxDwMHY!qH!G0 z%*lq)=d&zZP*6} zR#sMCUS3gAQCV48RaI48U0qXCQ(Ifhaa>(pU44ChLqkJjV`EcOQ*(23OG}F+thKeZ zt*x!Sy}hHOqqDQKtErF6B84YlarF2si~>y>FJr7nc3Odxw*Od`T2!~1&712xVZTG_3NdjrRC-2 zm6eq@Z{Dn~u1en5*4Eb7*EcpcHa9o7wzjsnw|91Sq=!7UWOhlpad|{3L&4{hJzq=1 zfo~MIGyu52y9<|&!5_Dzcv#|m$_nWv1dE(x|oH6wUGC~;};$- f;TbQJ6KtR5WgNfyOT5>HqzwdJR?4%8$dvy9M8*^y literal 0 HcmV?d00001 diff --git a/e107_plugins/calendar_menu/images/b13.png b/e107_plugins/calendar_menu/images/b13.png new file mode 100644 index 0000000000000000000000000000000000000000..bdb87c0f99ac5c9c0c68728e227eef944766813a GIT binary patch literal 1075 zcmV-31kC%1P)004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00093 zP)t-s0{;S!z5HB~|4W4bLxlf1l<;o0+kd|GD{ICYTfQP{&ogPxLsi~WWB)s3{~&wv zX0F^+oy-j}Uj$Wg2F2^36E6)EWcYqHeMnY%sOLYG$l>a-h))qrn5(yFs2@(h-EeAC|1x{BCUU3dP zP5}xEA4F(VjQ=~7|0AdWO`o#~5*rE%3IPEMEM&Dar2k8}-5zFv5F#}WGEN36PYpU> z9z$>zF<%ZTP6!et4k=eNo&PJH|1qBDByFQ3W3@4Y=OKmQ5q7^BhR-p1@iBVmDRSQ` za?TuEq#aa~DTC-Kjo&S7qbY;mDuvD?f3+lIqcd{FDrwF#de$m?*CKS!B7M&|RAwV= zz8*_~DKbPvd%R48#6^9yF*;0KNo7`Yszh?UJaW7wT&){htt4%&OH@J~REkDxnOS0W zSz>-@gtB0Jpi)v>b907qgsESIvNdCx6HALnb&(e`MQMAWgpHPag@uESsDhQSdwYd@ zgpP`wxJP4=4LfN%OhaOHeYL*6rlzK?t+uVUzon(FwZ6wdQ*JO-XF^Lt-rnBU*4E9< z*3Qn()!yFS-RFaho*^?lZEaDVot@|B=lA#b|NsAde0)SiGE-biY;0_FbaY!=TRS^D zt*x!DuCA}IuduMNv9YnTva++Yv$V9dwY9ajwzjvox45{txw*Nzy1Ki&yS%)-y}iA@ zzP`V|zreu2z`(%4!NJ19!o$PE#KgqK#l^dCU$jHda$;ryf%FD~k%*@Qq&CSlv z&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4?Ck9A?d|UF?(gsK@bK{Q z@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg={r&#_{{R2~t4m^400001 zbW%=J06^y0W&i*H32;bRa{vGf5&!@T5&_cPe*6Fc0FX&UK~yLe1;H&&0ssJj(eHsu zVvd<<7UuH{k6Wh|A>(@Okz-h6}2)|7p4& t(K!V0t|004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00093 zP)t-sWB~gAgoXcLRR2>%|3y6iBs%3?g8yuR)D#uY1_R&;4&5Xi?PD$ff=mBeGye+| z=TvmpLtHuf@0CC~~T%iC%lokyCYCHdVOaCJ$=NnMWL~=L)01*ZanE*lJ z0Alh0Y5D+O|08vY7*I1QJmI31$Hi zcM%n24hvKS2PFjqTm=LFD@Fe!Li!g(uMsW84i)+rBlHF%$p9qc04@I@8~PU)@(&N+ z6CJS#6P^nd{0<=U4>7JAFY*s1-xDmht7AkrQr-xU+*8ztxwA>aua;0YvYFgnZ( z8Hx@SMkFJ}G(FBcM7=dbPA)5AW<;=0NyRoa$0{zm4-dQs4Z05|K0i~G3>u$0K6X}9 ze^^nsU0kGASXoj|gm-SNYiGDpSE42?mIDoyJWxpx9HL`ilzxDMcYdgVda`+Xf_rz2 zc6hmhft5ZyaR3ZSG)#V6WxB7nqN1X*tf;)Fs;i`+#jUV$IXY`5I72^5+S=OE($dq+ z$jZvf+tAnJ+}NIed_5Z^OJHu9nVI6^;_~wH`uh5Ld3h{4L`F$lX=!P3adB8!SU5O1 zsi~=|s;aB2tE{Z7t*x!DuCA}IudlDKu&}VPv9YqUva_?Zw6wIfwY9dkwzs#pxVX5v zxw*Q!y1To(yu7@dCU$jHda$;ryf z%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1uz*=jZ3>=;-O`>FVn0>+9?6 z?CkCB?e6aG@9*#M@bK~R@$&NW^Yioc^z`-h_4fAm_xJbs`1twx`TF|$=>y5?00001 zbW%=J06^y0W&i*H32;bRa{vGf5&!@T5&_cPe*6Fc0FX&UK~yLe1;H&&0ssJj(eHsu zVvd<<7UuH{k6Wh|A>(@Okz-h6}2)|7p4& t(K!V0t|l8 literal 0 HcmV?d00001 diff --git a/e107_plugins/calendar_menu/images/b15.png b/e107_plugins/calendar_menu/images/b15.png new file mode 100644 index 0000000000000000000000000000000000000000..a118fb9860200bb4e5a0cc5de576a59fd215694d GIT binary patch literal 1055 zcmWktc}x^{6#fyQtTe`{#jvSK<5b%?HE2g;<5C-7Tv}M=8c489gOE)@-B?HmYG7z< zWGI@BM`02yS!p$0swP7rb~FM5EXQ&$%Qe6P%gu7nat=2g|9J1q_wthWeedPn4G;Z# zzvl;@0D%3$L26t^=xr!m<$T=dK%@+Ai2)%20F>O%*ow%N`4L?Z9s)r6#{k^Q1Yl!N z#%TajKLcPU4glXr0C*?mT&epC09O!xDJl@`WfwCNgWI2?f(33iqkme6B8HZ3V^TgQ z^{ONZwutakJM_C5{A5rhu=*SwAznkJ0*%ywiVnC)fU-EnH3JBzK`;T%Qdm5GM>vB> z_cT(W$|1n7c_@uhMCie39DJeyAK}P(__FAaN?Dlr9I^1qUui{%7JP~;e1CzcJf(qD z+{6?oP~eTz7Wi8UJtL*5#A1XuLf>l?ryeVf0&2BmElr5!A;f6F1q|^)f3U!DB791W zLmf2C(ol?EamB8w6zLZt!#c=U0#?i;&oJm5jPuH90agoNAVMM{cV=qAX+3n2E1)_Z z)R2P~UeW?_hganp;kH$mT8mR{c>Nkcm+|6a_zgVV( zGtjAeEv!~)FiohAd&3tRIhJKhIQBoDeZzAmGp~=vb*c*p=3_7z>~^~#2o{T_L$KKF z!l=W}FpTDNG+2i{l&>yHdwY8}!A?<>E>06q;MWNqNsw5+VGyu6&} z`HG5)%F4>Bsw$JoR9#(NQ&Ur0TU%FGXEvMb>+2gD8X6lLo0^)Mo10r&T3TCM<)LkD zZC0zby}iAoqocF4v#YDCySrP~)6>(_+uPgM*JrcY`uqC_1_lNP2W6>4Lqo&E!y_Xj zqobo^V`Jmv;}a7TlarGUhhu7LYI=HlW@ct~c6M%VZhn4#VPQcOMW@rbxVX5qw6wgu zyt1;gy1KfywkG>pUtizY*x20M+}hgO-rnBX+1cIQmCbe}DM#hMaY?~LBZ2>9Z-Pwr zB?o;&0Pya?x8c$;`17`0%m`KoL>)imZh8`;j_~p~5xL$6u^;!MmFL~9E+1ywPrmZb zuX-}&;rfo(zJ%;Qp3itb%fIg7jE=nN<{V53b9a{b9s#XKPiD5o6yNtd>`Zmj4}k+! zHW#3Gg)V!5LxtYAs?$mh7+pT zIt1kg$QQw#YHGRoHlh>JO%nRU6-jMd5R_;koewk)gqOmX4ELmGg^1{iJV@xFE2;&V z34W3Qodf67z?}wX!W=K&j74}N^7BD?U}}cn?SSUkk!RAqLf?`KigRzt>Sc-En1{W>&? zprklN1SAQB$N?`0(7HfZ9B_XIjxRgIbIF-zzVORjLSI$lXkeZODy7)A%e9t%)e!gw zBGmB7xSgZUIz(q3%q5fu1t@*Llf|(`$^BuJHrod+P*9e{@^j09t2OrN9hYvs3#2^{ zVckj+Q`3d1Y(As$M)Y4FB~^H4v+ctmzC7R|pTTap$EwMGT=}4;Ae)z0`rqT{ZS40M z2^DtXcVkFCl=Pq`LBq4=Ke=4)`&acHFB=67O+8HlDuwBBF)QLz7Y>J`R;v{Xg;Xk4 z_6=!kN*IXO8D1|#LG1SaKM z9*@`D+}zUA!sqi_TU*=O+5`fDP$+C~Z|~^n=gp1SL}IbHySuxmr>D2Kx390S zzrSB1kzhwVXkYw+p^<=chfZZ*`Tg)Iz#E(1?3og?Gz!z&IfE LN)-7YQewgXY(5!% literal 0 HcmV?d00001 diff --git a/e107_plugins/calendar_menu/images/b2.png b/e107_plugins/calendar_menu/images/b2.png new file mode 100644 index 0000000000000000000000000000000000000000..8697768b3cad22585554eabc26b31255f28b3304 GIT binary patch literal 847 zcmWlXe~48@6vyvlUG}-F+qx1wjPTumS|?W9*)?zsYIoWtcWgI1zQ9J1w+)tdQM3Ef z=$0%x6w*-t+@L=O?VtOPcngVZ{_|ot;-OH_Uw9F*YY^-$`(yr!8)RH(51;cr=ggTi zFmTT9nSW({|E7M&an{f7ng$z(R=wI|b<5T#_S&%KovFDg$GP<7z@vp;TlckQ=VtnD z_16ZU*<3w&`wPdZ{IloP#!TsyU9H+47|HU0b$uw}Fw>z4s0o<~p-e;>^HN(_A(@F( z#}m1rrQ(GKv#PuZc^N|ClROZq$1}j02f4+E%x8sSrF}|5saWCRl!F1>W+VY>1j~Kf zqJ^Z!XPHlPpPGQ>g5-cT@QmR$#cd!)&@Lk#PK;-vnIMMaf}>P`CM2_W2-XyL0ml?~ z02_gghch4@hPw<$1hom02q}WP3~7R5iV}v}7Ml>%VJM+UAy;8nA~(ctfRT@prlVF*)%Bdzl+OVe)J zU9~h#b*QN8QbLtdS(X(=QI@5Y5(pIlLWm#;eBbAs17&lcoEf$|QE9>aUT1RU?%TFl z``)fMea9KFje+6Ht=~>PvWKIsnSHI7-#@s}I(+PCy>a-+L8o!(gZlXP`fH+9A0HbV zujA);PVCr;aeeEUwddBQBX;iV+3BgqmM43c@wPJ+XYr;bV`2Nnya`2&;Jjy`<-`Zo(d zpIEupQ@uBLyl+svHBnw#dVv2wcX59IclVc0oo@cIY4m#Yh5ueW**hry{%gaZ!4AXw0Zh5m(XM* literal 0 HcmV?d00001 diff --git a/e107_plugins/calendar_menu/images/b3.png b/e107_plugins/calendar_menu/images/b3.png new file mode 100644 index 0000000000000000000000000000000000000000..3aa7d2fef313b755a14f9b956172311b1e5e6a25 GIT binary patch literal 720 zcmWlWZAep57{~82Q8%V53RVQ|LNDG>*zturX0#oZ+#%OIPOvkA>|kb>UhpocF4c$& z5uK>yYJC_4i$S3i3}zHbi6r#pMrKpV1_ikwK@wtpFxK&Rc>WLn!}B~mhjTj=JmR!( zw@Z@b474^AkzMOiS|qfxx}rm*jlKRhza)*_bF6h23ttiqw6&DX*xluOO9$TcmP(TC zROo29r63h}CPghyv!-Dsxs{|DuC64td|J<^Nyad&IGZp?mTN01EuX?EjmC9sX)I^5 zT%2W199LnQ;fzkRoERFU29hwC;$S0RE#E6NDvej zL6l~YVIWWxs1l$eU|`4zkQG26OcI!+07Jl#LZKon0)QZ72x=Hmq{y;Dpe)M>AxtpV zDK;qP6bld*g@_Wj;#S%EVTQ`Mrka|nGPmr8l(>MKF~&JJ1SU7)+~9^waVZd{)9I8z z$V5s^63b?@*-R#5S(aOtA;M-np3CL(`Fx>J&~+VS%9yHY8l_ac@)nsL6(3-Wl3<7A zTbe&DOxeZO54Y>_jE`5E}Zv-`_A=9;WL*!HFch2Eb6K8 zdTTtOzM=L&L%r8i?G-q|r#{g)5@_~^E4LO;f*|s5@qN?_%;U22U3;ox&Ur#25wg(r zvRrpG%)PUFPo^5JO|kuvp9f=ahxc9C_ITX$dN$!(`mkKIu%kB-7$|zNI+7?m zamYG+ZMCu87Fiy8HNJCr9_cfKi5vX+uc`juWB#r?XaDtnC*jYOK6P|PE)Rx&_$wBt zY>$Q}7N1G6xygs#PHCC_z3Xe=UAtCn3%wuRuqfSMt-JcA>CcqdTMD!Un@7>foBsiw C;}xR- literal 0 HcmV?d00001 diff --git a/e107_plugins/calendar_menu/images/b4.png b/e107_plugins/calendar_menu/images/b4.png new file mode 100644 index 0000000000000000000000000000000000000000..a2e6670fc288c85f1e0fce86492c6716b4011f7e GIT binary patch literal 854 zcmWksU1%Le7@b=avrUYSin_!S?hw?D7`cSx9rc)Du-s%MjB`C%EOvqMqp_Tb6$nGE1AHq z)j{ZB=uqeg==cb71RVe*Lse!CXJxF^W^eJAp_v=Zpx+kf=rj%j#U+KDGVRMwn#OUQrb#DFk|fSL zsqZn#2xq(~ihK`U3(Lx~h(bd#62gz7s4UBVzh70A)|wC|xaa%6Qp&S0N$DN)S3a;` zq}CSAW$@_lKR#oN{m;)or2rVYWiM)%e|=@wHt%cCt+pR~Vf|RUb?Rh&rS;r8Sb27% zKJ`HTN!hMXH5yZO^5EfVdU&c)pKMtC@z8eD?t5=xc4p<^ZG&G;HunLrd8zj*fBKyd zTep{kC+qk$2Ke0A_;+tO%Y%U(XFjQ~+eP$#0WclVpSN|M)>)YSKdmOqA-w>Iw1{3O@_u5 zF(pC<5*euxGfi%rLXVa7R5*+%bP4h#_8fVG%K|e4qZA+sbyewNY^t&GKJzAZNm?ML zU_nqtVizKfoyNJvnL$b-MKi&i6t%KL<(zPmg=sq01REUZI4&tEMN-M6;)!92_4=uC<*;ZcS-z znHQBb8mEXQOmOC^sw#_es;VplIp>C4ibT)^(>%{dqmlQ%o+@~tv9*>k%BV2Lwrx9^ zOhSv+nx%sCOo&V=m1S8vMcMnVdn6oFr_a|n!P3K@F9$gC-r3hP0FFL2&CY{gt{sHp z3;osC`lsK&wB6r%_nqF>&fAy3)>~J43orG~i+*ometw}xPA#5H7Eh7hiTR)v{q67J z-<7qM<*m7=5AW~o&}}f-Z~pjr@WrFv%j{m?@BViDU;n}GuhEx(-nrG?e|Yuld(Zv1 z%inN5y>MW^U%GL6@ox9|GuP(^`9>!`4+o?JhFuV!{P6F=`0|ezzuNoeb~OVZ-Mv2e o^rvTf*ET=u+-9%d|KYDgpMC!9O|^9MYFGfQt*)=^(u+6#2jEd=8vpO?BZBq6=2P0RF3j-#gBeq#90FaTe?wY@dH#q`_C#Y1D;R@$w* zx_hpS5AFsa^YxL(OJgZWg)1D}a&mw{5KE|)D}~7Ze-l~2qq!vFX+4Sq*UABxyDr5R z09F=w%&J#ZvtCKlTC4>|h+}N$0JH$Hffle9@r%7B5C9=)6EJv0hcX2KW zrItAISiKr16GI~!O+jE&zR@N)V?aS{i7@NBG?S6y%zBoEu>fW{GD(pRz0b8#( zqLG`g4NZQwy107hz2{YV*QK^cMtI>y*UtKE=DVfdU!J>r=JfT>i*Ntk{Ge-TptZ3u zx^VEXMgOa_Q=Q)obxxMvAFqPtKQHf#7tZ|t%Fyz;_fC9rzGwN|m5b{?{QKCo4}aZw zXZMcv-posDr`E34|CoK^jW1Uk_iXHW>c&6E&Mx)**6N@7>Bl_}4Lo@3Bffas96Pz8 z_n*A)a>vcW>YU&I?#J`Z3)5YnX66od73W`GXtiCKdid7Xd9ZF?0mZS2(a-VIum1-Y CpG{@} literal 0 HcmV?d00001 diff --git a/e107_plugins/calendar_menu/images/b7.png b/e107_plugins/calendar_menu/images/b7.png new file mode 100644 index 0000000000000000000000000000000000000000..d985772d4216bab73f8f75bb119c39f7a58844b5 GIT binary patch literal 1075 zcmWktX-peu5dESgQcD%JLX9eDf3#H-MYL5)#UHAw4J(quwxM(h32{*kHQ~@EE!06( z^fDEiElQJv}2MgCK~^%*?E;tnBRUoSYnqM3S4Eo0pfDpPw(4N(%}K z3JVL1ii%`1nOrU}E-o%9DN!gCrKP21Wo6~%&+S}VZIyxwd>g??7>gww5?(XU7 z>Fw?9>+9?9@7HKF0|NttgM&juL&L+vBO@cDqoZSEW2|rE4h{|v508$H*h3s2AD^6@oSvSZot>SZpI=;DTwY$X*Re?} zS!Ms`%1gw-3EW%Jd9vbNU%RJ#0Nyiwiz~x30q1Nn-rm;c(Vd&uTO{Awx`Uu0W;*(r zRfX9LE|lcqJZjbdv7J?aba%R$X&cAzZ>)TKZeIfXqpD$X&0YTxD|1!n%NV)IuXRFs ztLkUn=2N++YqPkbud3IAcBZ~C543KxQ_d*38`Vx9QWYU&&gZMwsQlLG*f*ct6h84k q<{hexZvZ1(xqY20wXiC9G4|twyj#VlUzy!zcLVnK9c)V>H{t(wwQ1A< literal 0 HcmV?d00001 diff --git a/e107_plugins/calendar_menu/images/b8.png b/e107_plugins/calendar_menu/images/b8.png new file mode 100644 index 0000000000000000000000000000000000000000..6f47d4ea7922d0b0a9bedaa1192e2e5c321dcac7 GIT binary patch literal 1075 zcmV-31kC%1P)004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00093 zP)t-s|MCFx(%tOA+4RZb^}yHp^N7y! zk=E>N#_eOt?^?^#kZkIQ3oKb+KP=1|AcAZFpq*{riWQUD7W}{?#dOKZ; zRCl3vj-qXbqHU0iN^Nr}SCmO@S1d$_XMM1cr>KaYr;(knnWlbUbx<2Uc|==mVr<8| zyuP%w$g;j=Pg`+3NnJilnwzHH-rm;M*4NF~l$4ZBEjVsYS(S^6_xJbz|NqtB--LvO zXgx}8S6FmvYI}Qob8~ZKSY&>Fet&;|fPjF3fq{a8f`fyDgoK2Jg@uNOhKGlTh=_=Z ziHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z}m6ev3mY0{8n3$NEnVFiJ znwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5(rl+T;sHmu^si~@}s;jH3 ztgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#pxVX5vxw*Q!y1To(yu7@< zy}iD^zQ4b}z`(%4!NJ19!o$PE#KgqK#l^dCU$jHda$;ryf%FD~k%*@Qq&CSlv z&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4?Ck9A?d|UF?(gsK@bK{Q z@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg={r&#_{{R2~u3<8p00001 zbW%=J06^y0W&i*H32;bRa{vGf5&!@T5&_cPe*6Fc0FX&UK~yLe1;L>*L}37c(eK=g zWi+xGZC^r@WL4BO%^OHG&5OyJ84|-<_jit}?%?yGN_A_q(wMj}b%Qh-v&VFestQlK zf~vx^OW5pLs%Bikn6k{a%PQwp#v~elIm1Y?-K}5iw^J0xvV*mtBIpFhq{54ieH;~n tS9SPf^|Swd0Pm^hCIw%mDm12T)jvj~C94uF872S#002ovPDHLkV1nK3bW#8S literal 0 HcmV?d00001 diff --git a/e107_plugins/calendar_menu/images/b9.png b/e107_plugins/calendar_menu/images/b9.png new file mode 100644 index 0000000000000000000000000000000000000000..dfaaf71c0847aa2e8280a773df8ab41e6746c57c GIT binary patch literal 1122 zcmWkrS!~=?6n&G)zE1YZo=GOlWS{JlbuyVO`rJTw<6RCB4QQMT6_c- zm0h^EVkG{U>IGGQD-=z7;s7XV+q{p!DC@4!4C??;CKxLyRn{s91g>kyv- zaIFS_=ZgTe+yNl{%HhI;UI2_>bkN%abilBT>etkO&MUf$RxpaC878Rf0bQ3hofHBV zgac;8g|k{fXE~M?Bu&?~pic6d*+E5`9RS!|7$eCtCrSQ*u4uaG*D*%1p`6Kr0h5d7 z6iHPiKconXs*bZNCHOH$b`XNejsvrUmxClP@(Sc)Fj_`w30M$2d;wczndB8g)y*!7 z7W|wXbPyb{xa=q``{A@8Cu@+Ll>!!&#%Kv4d9xk0I50a(;jBV(G9{>r78DhYU?l`+ z92iM)GR}wuBMM4@;v`=SChLfBiiL%1+B7$5N5EOGEs0%?{E_hsm zD9fsf-34++# z+S=UQ+}PMyUteEaTU%XSU0GSdaeR4sd1+~BadB~BVZrC~&Ck!z&CSiu&SDrgGcz+i zJv}uwH90vsF)`uwddJ7dQ4}2;8yg)R9T^!J9v&VV8X6oN92git5X9s0^!NAo_4W1k z_V)DjxZUpV?r!+`uC6Yp)7jbC+0oI_-rnBU*4EnE+S1bEa5$Qqo12=N8XFrM8XD^B z>+9<3YHMrlc6&`tO?7p3RaI4GWo1Q0MR|F7Sy>rWU0PaNQc_Y}TwGLCWVKog3kwSh z3ZN(X`T2QydAYf{IXOAm+1XiHS(%xc85tR7vpGFIJuNLQH8nLQB_%mIIVmYAF)`6( zG9@G=#K*_S#l^+O#>T|NL`O$QMMXg;BO)Tg!^6YE!a_qsjYeZgNQl8;fcEab6x|NN za1|XM2hLwk)?gB~+do4B5R-HnhR3I`UBKe^9(R|wG&StLz3RXK!XE|1?x(LiXFfkU zI*CoYMPE(*!r0u6*F3Q%X}gB+j;o$+CvIMQRB-p*zk(lHj~gz|58a0Ye;%>l-0&5A z>nxb@e$c0Yhkx8_lnxJmyY75=^ZoTtZrMq>1fPy+Dt`Q~9MX8A;nfZANA(^?U z48f&&3WmlC{>dc@Mg|5(3I>)|re;<~CJMR+K+w#hX${n8?CIhdA|c6o@E~u40}r!- z``U)T%by-*wdU|T(j4xdcjNpMre|xIK(L2xPM^prhEx0}wE5IuIvs2TYG?3t^>bP0 Hl+XkKoXS+( literal 0 HcmV?d00001 diff --git a/e107_plugins/calendar_menu/images/cal2.png b/e107_plugins/calendar_menu/images/cal2.png new file mode 100644 index 0000000000000000000000000000000000000000..0830a242cba5cd2163080d11fefa511cbeef21da GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2VGmzZ%#=aj&v7|ftIx;Y9?C1WI$O`1Mmw5WR zvR~rj<*?Mv+Yk;?A{XEj;`*QAKadH;?->~GGccTIVA#*Vu%3ZoJ_7?#jZ%G&B~Y5N zB*-tA!Qt7BG$4nwz$3Dlfq`2Hgc&d0t@{HM)G2X|C~+=IO)SaG&r=A=%uQtoF3nRg zG*<9WE>SQtFfdXuu(UEYw=yzN&@}*p8J%fjKz+uZE{-7*lB@?0@-{f|FdMk9ZTP$V z>0wrD4zDB4;qG}i&Oc##wuT7=d)VgmiJW3M#eYJZPyMCS!A78V22WQ%mvv4FO#tRb BOWyzh literal 0 HcmV?d00001 diff --git a/e107_plugins/calendar_menu/images/cal3.png b/e107_plugins/calendar_menu/images/cal3.png new file mode 100644 index 0000000000000000000000000000000000000000..b47d0de7af6175216731b195b1c70e946e6f03e6 GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2VGmzZ%#=aj&v7|ftIx;Y9?C1WI$O`1Mmw5WR zvR~rj<&seo67A{(3dsfdgt-1^_zz?@H2g0pc%P7PKOo?|gTsCUgY^mu^92O@-|U?) z4U}dq3GxeOaCmkj4angv@Q5sCVBi)4Va7{$>;3=*bxK?#N}P*Q6H7Al^Atidb5j|D zOY;;AjTQWpOB9R@42%>E4XunUtPD&QbPa%D`U<0)Kz+uZE{-7*lB@?0@-{f|FdMk9 zZTP$V>0wrD4zDB4;qG}i&Oc##wuT7=d)VgmiJW3M#eYJZPyMCS!A78V22WQ%mvv4F FO#n8KQ5*mO literal 0 HcmV?d00001 diff --git a/e107_plugins/calendar_menu/images/calendar_16.png b/e107_plugins/calendar_menu/images/calendar_16.png new file mode 100644 index 0000000000000000000000000000000000000000..5360ab59cdce2c52bdb58a2872ada2e029c8f925 GIT binary patch literal 1028 zcmd6l|5Mrp7{@MNy^|s=itew(<1E&Fc%nyoR5QGmOK0IN6Men=k{r=_o;d$=$ zZp@{BxO>-uT?m5grcpEV;<;yQp4=Yy)U>Db<3Zw5PErs=JO0)aS5O4mwwjxBItzy_ z1pxehKLHQ}a5x;{a5w@$m`p~aF$fR^c=X7*>|5{a(@;-w@&18Aej8l7F1+4>#o+Rf z^%#cT)(`r8EB8@=x;o($V1W(7Xk?aD%B&FaF2$Tq!s#>^MsN%p9T~Y}o%ck+OTc<4 zRC^cR{zSC785T4NO(v5s25H%iJw57+Ro}ba?u!>HsF$a~d=Ix-f9+NagsnIh5sPIT z!C+Ng3zJ={Py35I4qL=0*R+gxPMN z^LRY<0zq5<@Cv}qPH6~W6Nhusslh>m&6g$q%Pg4ZF+Mp-C=|Zs<+Y7Kt|V%8 z&iCtv|FTT~GdEjrj(=c?gD&Q&l<_Kb@$=~U|B?Tn8$zynK#Cun!p~yx^LbzJzbUHV zAe3Sri$kWB7I8UwoTB1y%kOdCjW2m=nUvG1Eo??Yg4<9UYcfAPp0k7eltABlbW}2+ zA{`#xdV~GvLm$%$#N}sqGRWl#FMse+ zlIpn^6Mx_T2DSQgDMe3zja_jrk-c{xm8_i^t71LOafMTQ#kZIxeTvFEc;OQF&%%bG zeKn-3-?dJ>*D4`B!!M|nQxX!T%Ch96?__^^XN0sx-Dt( z>SS^E*J8A@#5SYZkt9h=zBMjq4gYlfQtGoARA%Fx{=nT6+J*fGyLrDPJK8;MuhbyO W!48)2%rWT}ON5q1&(yrnto;`m;H=01 literal 0 HcmV?d00001 diff --git a/e107_plugins/calendar_menu/images/calendar_32.png b/e107_plugins/calendar_menu/images/calendar_32.png new file mode 100644 index 0000000000000000000000000000000000000000..c79efecfdec8ac6985b24e6f09adbf9b6bb62c1d GIT binary patch literal 1922 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 literal 0 HcmV?d00001 diff --git a/e107_plugins/calendar_menu/images/star2.png b/e107_plugins/calendar_menu/images/star2.png new file mode 100644 index 0000000000000000000000000000000000000000..06be5de648a933aa8b7e0ad9eee9591a947bd19a GIT binary patch literal 1046 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6zM9{GlYxANWRD*>z6NIK7IQ1&Ye5AZr!?Z z*R5N(a^=cJixw?hxN!db`7>wEoHS`te}8{{eSKYBU2Sb`RaI4KX=!nBaZyoGK|w)Q zR#s+aW^!_JQc_Z4Vq!u-^zq7% zS^xgrm2Xe){dj%+`uXpFe|`J$o#9v6A1PoSdQXPPXa29w( z7Bet#3xhBt!>l@r)i-64E|B)Mu|1U7P zVCKZ*)lqKQxVf2&g+bxKz5V6_1)06?v^f|Y)Q%p_GkGm_I%;0q+C-z@uS2C789Z`d z`TFloeXGpGAaITUu7l)78&qol`;+0HmJp@c;k- literal 0 HcmV?d00001 diff --git a/e107_plugins/calendar_menu/images/star4.png b/e107_plugins/calendar_menu/images/star4.png new file mode 100644 index 0000000000000000000000000000000000000000..6bbc73d2218afd2418962499081e83a019c4781b GIT binary patch literal 1116 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6zM9{GlYxANWRDhM@nVSbWN@=!FwtT- zyNvbhGPd)p1kSG#ys%p2!WyxQYb7slP`t89?aC(gTYFvIY{hTw^SpZ~bn`r~`^VxR z98Y?1BIVJUf+y!I5+g01Uuk=BwX3qg>*dWU`59jCAFu!PV&9k7#}4jZ^yAa5AD{1C zzjFN2h2yVp&HViG(5r|04jecD^xh~K4FT$g!2d>7PN(Q!j^-6o%1)PJI zXx@^NXxa7H)9)Rp_J*wi><6#kOL&*?hcQol<=IV9Cq-J1`(~D0dBwdm`{g|Cqn%|T z3rn7E{G)fV=SX0xyMD24b_UPcxb3FPw*|eeuUcgtcw;#mOPTQH2EVkuze49FRj5z8 ToBJ*h=oki1S3j3^P6#4s>KF)#oXn=mk(Wo13f#&%vn;Jl#V1rd=8VqzC1 zB`+%~UQtuKqON|+)zwX0{FbNZ-O$j@US9X(;~yj?JxED;R8a7wq9W14;(1%!i>|Ip zFRzzVro5gxGvCYW{rdGUHf;E`Z{O!bhrS#;_G;h0gNqi;Zfg2=<;ss+w|?Bacm4SB zOUIA@{r>&Ow{Hgy8~}Q66pV%dbwhx+js=)c7%WSI{DS|J2^g%_q&ff%;VkfoEM{Qf z76xHPhFNnYfP&SYE{-7@qO1oU`3?q%FdWGIwTjnOY2((!=S=VFCB?*iyO;faHM>)K zhKeo+Lj!{yn=Z$Mw8eGoj0^&szf4WLnY`gv$H@sxU9Ww8)eX#?Yp+C3io0rI&cvW# z;d8G!sPc+{hD~-PBam+pHDBkQGRyu`TaWxx6=!02z#lwCGlzf5zEq$y7(8A5T-G@y GGywosi`{7e literal 0 HcmV?d00001 diff --git a/e107_plugins/calendar_menu/images/star6.png b/e107_plugins/calendar_menu/images/star6.png new file mode 100644 index 0000000000000000000000000000000000000000..519dc2ea88804d9e2658558184a2a49dc0fecc98 GIT binary patch literal 1115 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6zM9{GlYxANWRDny9+ zS+=0_0zu~mLobMgT@Z`7C>eKIG3kn0@)h-pTdwME;?=i2TkeMDZT9NEAK&{RssBOB z^hX7ApH#RdS}cFww)#a^RHfI(ms7UBo*AC+b@cuEBQG{w__Xirt9@$^E_(3o%JU!h zx@R|?y?*@krQ_d!d^>R90ML7*U^E1%8v?SoZFU1qv@8ko3;s_gV6a+~>Hsu^v%n*= zn1O*?7=#%aX3dcR3O0DUIEHA5vL4*)cPM~??LzQxMSCH0cZrn533I>88$L8GD9DJ~ zu+aSM*Ew?zK6%B%#31k>lb=Il^2PgXObipce=YS{HQ#)Fwx#5|Q)^yTo%UyBI1%;o zjBEbJq7DXzmha1tFSuIA;rO_GWfss4O&8Ph%cK=+-pj;qki81b<^LGx*{Lr07ZHC6 P=oSV~S3j3^P6=I{~EY2`Nl%Yd}p;4HjN{}Iok0FMSA&Q&9jf25Nh4ri| z+gUw<^ZJ74jYKXOi(N32ylAU<*-`C^v-*`7*IRPpZV8^ZvO@1hd2KF^zh9R0pgiS4 zQ^BLoiYHUsp3m%h5$IL9aLUU7ul$`GUL4!^>FlvDNB6y2zUW|E)9m}VemuJO#7I;J! zGca%qgD@k*tT_@u!6r`^#}Exs)`NTb4hBdtTqs_@{$j^`S)&rJVp!-4AJSq0t?pd2~|G9!0_>-ZPazE>(duaF^ikKEOhmze?e>v9Sgs$ z%e4_%>Z-}iz%u#P=1Z5OIhjtbT|e1@je%ni@3Xpd;>JzOKFB;axvDD3@PPkDoa#C` Ttskp^u3_+W^>bP0l+XkK3wG$# literal 0 HcmV?d00001 diff --git a/e107_plugins/calendar_menu/images/star8.png b/e107_plugins/calendar_menu/images/star8.png new file mode 100644 index 0000000000000000000000000000000000000000..1e95e2ae34fe16393581f233df6ba4861b982856 GIT binary patch literal 1117 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6zM9{GlYxANWRD%Smw=H|KLR>7`E7Qu;aN1t~cf8mvszy9X?4Od_6d+=%B?N|5S z|M>pQ literal 0 HcmV?d00001 diff --git a/e107_plugins/calendar_menu/index.html b/e107_plugins/calendar_menu/index.html new file mode 100644 index 000000000..e69de29bb diff --git a/e107_plugins/calendar_menu/languages/English.php b/e107_plugins/calendar_menu/languages/English.php new file mode 100644 index 000000000..f4e2fafa6 --- /dev/null +++ b/e107_plugins/calendar_menu/languages/English.php @@ -0,0 +1,380 @@ + \ No newline at end of file diff --git a/e107_plugins/calendar_menu/languages/English_search.php b/e107_plugins/calendar_menu/languages/English_search.php new file mode 100644 index 000000000..8fbd91bad --- /dev/null +++ b/e107_plugins/calendar_menu/languages/English_search.php @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/e107_plugins/calendar_menu/log/index.html b/e107_plugins/calendar_menu/log/index.html new file mode 100644 index 000000000..e69de29bb diff --git a/e107_plugins/calendar_menu/next_event_menu.php b/e107_plugins/calendar_menu/next_event_menu.php new file mode 100644 index 000000000..9eae4b77a --- /dev/null +++ b/e107_plugins/calendar_menu/next_event_menu.php @@ -0,0 +1,153 @@ +retrieve($cache_tag, $ecal_class->max_cache_time)) + { + echo $cacheData; + return; + } + +include_lan(e_PLUGIN."calendar_menu/languages/".e_LANGUAGE.".php"); + +// Values defined through admin pages +$menu_title = $pref['eventpost_menuheading']; +$days_ahead = $pref['eventpost_daysforward']; +$show_count = $pref['eventpost_numevents']; +$show_recurring = $pref['eventpost_checkrecur']; +$link_in_heading = $pref['eventpost_linkheader']; + +// Now set defaults for anything not defined +if (!$menu_title) $menu_title = EC_LAN_140; +if (!$days_ahead) $days_ahead = 30; // Number of days ahead to go +if (!$show_count) $show_count = 3; // Number of events to show +if (!$show_recurring) $show_recurring = 1; // Zero to exclude recurring events +if (!$link_in_heading) $link_in_heading = 0; // Zero for simple heading, 1 to have clickable link + + +require($ecal_dir."calendar_shortcodes.php"); +if (is_readable(THEME."calendar_template.php")) +{ // Needs to be require in case second + require(THEME."calendar_template.php"); +} +else +{ + require($ecal_dir."calendar_template.php"); +} + +$site_time = $ecal_class->cal_timedate; +$end_time = $site_time + (86400 * $days_ahead); + + +// Build up query bit by bit + $cal_qry = "SELECT e.event_id, e.event_rec_m, e.event_rec_y, e.event_start, e.event_thread, e.event_title, e.event_recurring, e.event_allday, ec.* + FROM #event as e LEFT JOIN #event_cat as ec ON e.event_category = ec.event_cat_id + WHERE (((e.event_start >= {$site_time} AND e.event_start < {$end_time}))"; + +if ($show_recurring > 0) +{ // This won't work properly under some circumstances if $days_ahead is greater than the number of days in the current month plus next month. + // If that matters, need another test on event_rec_y (which is actually the month) - plus the calculation to generate the values + $cal_datearray = $ecal_class->cal_date; + $first_day = $cal_datearray['mday']; + $first_month = $cal_datearray['mon']; + + $end_date = mktime(0,0,0,$first_month,$first_day,0) + (86400 * $days_ahead); + $end_datearray = getdate($end_date); + $last_month = $end_datearray['mon']; + $last_day = $end_datearray['mday']; + $cal_qry .= " OR ((e.event_recurring = '1') + AND "; + if ($first_month == $last_month) + { // All dates within current month + $cal_qry .= "(((e.event_rec_y = {$first_month}) + AND (e.event_rec_m >= {$first_day}) AND (e.event_rec_m < {$last_day}) ) ))"; + } + else + { // Dates overlap one or more months + $cal_qry .= "(((e.event_rec_y = {$first_month}) AND (e.event_rec_m >= {$first_day})) + OR ((e.event_rec_y = {$last_month}) AND (e.event_rec_m < {$last_day}))"; + $first_month++; + if ($first_month > 12) $first_month = 1; + if ($first_month <> $last_month) + { // Add a whole month in the middle + $cal_qry .= " OR (e.event_rec_y = {$first_month}) "; + } + $cal_qry .= "))"; + } +} + +$cal_qry .= ')'.$ecal_class->extra_query; // Puts in class filter if not calendar admin + +if (isset($pref['eventpost_fe_set'])) +{ + $cal_qry .= " AND find_in_set(ec.event_cat_id,'".$pref['eventpost_fe_set']."')"; +} + +$cal_qry .= " order by e.event_start LIMIT {$show_count}"; + + +$cal_totev = 0; +$cal_text = ''; +$cal_row = array(); +global $cal_row, $cal_totev; + +$cal_totev = $sql->db_Select_gen($cal_qry); + + +if ($cal_totev > 0) +{ + while ($cal_row = $sql->db_Fetch()) + { + $cal_totev --; // Can use this to modify inter-event gap + $cal_text .= $tp->parseTemplate($EVENT_CAL_FE_LINE,FALSE,$calendar_shortcodes); + } +} +else +{ + $cal_text.= EC_LAN_141; +} + +$calendar_title = $menu_title; +if ($link_in_heading == 1) +{ + $calendar_title = "" . $menu_title . ""; +} + +// Now handle the data, cache as well +ob_start(); // Set up a new output buffer +$ns->tablerender($calendar_title, $cal_text, 'next_event_menu'); +$cache_data = ob_get_flush(); // Get the page content, and display it +$e107cache->set($cache_tag, $cache_data); // Save to cache + + +?> \ No newline at end of file diff --git a/e107_plugins/calendar_menu/plugin.php b/e107_plugins/calendar_menu/plugin.php new file mode 100644 index 000000000..22ce7c80c --- /dev/null +++ b/e107_plugins/calendar_menu/plugin.php @@ -0,0 +1,280 @@ +db_Select("plugin", "plugin_version", "plugin_name='Event Calendar' AND plugin_installflag > 0"); +list($ecalVer) = $ecalSQL->db_Fetch(); +$ecalVer = preg_replace("/[a-zA-z\s]/", '', $ecalVer); + +// List of preferences ----------------------------------------------------------------------------------------------- +$eplug_prefs = array( +"eventpost_admin" => 0, +"eventpost_adminlog" => 0, +"eventpost_showeventcount" => 1, +"eventpost_forum" => 1, +"eventpost_recentshow" => 0, +"eventpost_super" => 0, +"eventpost_menulink" => 0, +"eventpost_dateformat" => 1, +"eventpost_fivemins" => 0, +"eventpost_weekstart" => "sun", +"eventpost_lenday" => 1, +"eventpost_caltime" => 0, +"eventpost_datedisplay" => 1, +"eventpost_timedisplay" => 0, +"eventpost_timecustom" => "%H%M", +"eventpost_dateevent" => 1, +"eventpost_datenext" => 1, +"eventpost_eventdatecustom" => "&A %d %B %Y", +"eventpost_nextdatecustom" => "%d %b", +"eventpost_mailsubject" => EC_ADLAN_12, +"eventpost_mailfrom" => EC_ADLAN_A151, +"eventpost_mailaddress" => EC_ADLAN_A152, +"eventpost_asubs" => 1, +"eventpost_emaillog" => 1, +"eventpost_menuheading" => EC_LAN_140, +"eventpost_daysforward" => 30, +"eventpost_numevents" => 3, +"eventpost_checkrecur" => 1, +"eventpost_linkheader" => 0, +"eventpost_fe_set" => "", +"eventpost_showcaticon" => 0, +"eventpost_namelink" => 1 ); + +// List of table names ----------------------------------------------------------------------------------------------- +$eplug_table_names = array("event","event_cat","event_subs" ); + +// List of sql requests to create tables ----------------------------------------------------------------------------- +$eplug_tables = array( +"CREATE TABLE ".MPREFIX."event ( + event_id int(11) unsigned NOT NULL auto_increment, + event_start int(10) NOT NULL default '0', + event_end int(10) NOT NULL default '0', + event_allday tinyint(1) unsigned NOT NULL default '0', + event_recurring tinyint(1) unsigned NOT NULL default '0', + event_datestamp int(10) unsigned NOT NULL default '0', + event_title varchar(200) NOT NULL default '', + event_location text NOT NULL, + event_details text NOT NULL, + event_author varchar(100) NOT NULL default '', + event_contact varchar(200) NOT NULL default '', + event_category smallint(5) unsigned NOT NULL default '0', + event_thread varchar(100) NOT NULL default '', + event_rec_m tinyint(2) unsigned NOT NULL default '0', + event_rec_y tinyint(2) unsigned NOT NULL default '0', + PRIMARY KEY (event_id) + ) TYPE=MyISAM;", + "CREATE TABLE ".MPREFIX."event_cat ( + event_cat_id smallint(5) unsigned NOT NULL auto_increment, + event_cat_name varchar(100) NOT NULL default '', + event_cat_icon varchar(100) NOT NULL default '', + event_cat_class int(10) unsigned NOT NULL default '0', + event_cat_subs tinyint(3) unsigned NOT NULL default '0', + event_cat_ahead tinyint(3) unsigned NOT NULL default '0', + event_cat_msg1 text, + event_cat_msg2 text, + event_cat_notify tinyint(3) unsigned NOT NULL default '0', + event_cat_last int(10) unsigned NOT NULL default '0', + event_cat_today int(10) unsigned NOT NULL default '0', + event_cat_lastupdate int(10) unsigned NOT NULL default '0', + event_cat_addclass int(10) unsigned NOT NULL default '0', + event_cat_description text, + event_cat_force_class int(10) unsigned NOT NULL default '0', + PRIMARY KEY (event_cat_id) + ) TYPE=MyISAM;" + , + "CREATE TABLE ".MPREFIX."event_subs ( + event_subid int(10) unsigned NOT NULL auto_increment, + event_userid int(10) unsigned NOT NULL default '0', + event_cat int(10) unsigned NOT NULL default '0', + PRIMARY KEY (event_subid) + ) TYPE=MyISAM;"); + + +// Create a link in main menu (yes=TRUE, no=FALSE) ------------------------------------------------------------- +$ec_dir = e_PLUGIN."calendar_menu/"; +$eplug_link = TRUE; +$eplug_link_name = EC_LAN_83; // "Calendar"; +$eplug_link_url = "".$ec_dir."calendar.php"; +$eplug_link_perms = "Everyone"; // Everyone, Guest, Member, Admin + + +// Text to display after plugin successfully installed ------------------------------------------------------------------ +$eplug_done = EC_LAN_82; // "To activate please go to your menus screen and select the calendar_menu into one of your menu areas."; + + + +// upgrading ... // +$upgrade_add_prefs = ""; +$upgrade_remove_prefs = ""; +$upgrade_alter_tables = array(); +$version_notes = ""; + + +if (!function_exists('create_ec_log_dir')) +{ +function create_ec_log_dir() +{ +global $eplug_folder; + +$response = ""; +$cal_log_dir = e_PLUGIN.$eplug_folder.'/log'; + if (!is_dir($cal_log_dir)) + { // Need to create log directory + if (!mkdir($cal_log_dir,0666)) + { + $response = EC_ADLAN_A158."
    "; + } + } + if (!is_dir($cal_log_dir)) + { + $response .= EC_ADLAN_A153; + return $response; + } + +// Now check directory permissions + if (!is_writable($cal_log_dir."/")) + { + if (!chmod($cal_log_dir,0666)) + { + $response = EC_ADLAN_A154."
    "; + } + if (!is_writable($cal_log_dir."/")) + { + $response .= EC_ADLAN_A155; + } + } + return $response; +} +} + + +if ($ecalVer < 3.5) +{ +// To version 3.5 + +$upgrade_alter_tables = array( +"ALTER TABLE ".MPREFIX."event_cat ADD event_cat_class int(10) unsigned NOT NULL default '0'", +"ALTER TABLE ".MPREFIX."event_cat ADD event_cat_subs tinyint(3) unsigned NOT NULL default '0'", +"ALTER TABLE ".MPREFIX."event_cat ADD event_cat_force tinyint(3) unsigned NOT NULL default '0'", +"ALTER TABLE ".MPREFIX."event_cat ADD event_cat_ahead tinyint(3) unsigned NOT NULL default '0'", +"ALTER TABLE ".MPREFIX."event_cat ADD event_cat_msg1 text", +"ALTER TABLE ".MPREFIX."event_cat ADD event_cat_msg2 text", +"ALTER TABLE ".MPREFIX."event_cat ADD event_cat_notify tinyint(3) unsigned NOT NULL default '0'", +"ALTER TABLE ".MPREFIX."event_cat ADD event_cat_last int(10) unsigned NOT NULL default '0'", +"ALTER TABLE ".MPREFIX."event_cat ADD event_cat_today int(10) unsigned NOT NULL default '0'", +"ALTER TABLE ".MPREFIX."event_cat ADD event_cat_lastupdate int(10) unsigned NOT NULL default '0'", +"ALTER TABLE ".MPREFIX."event_cat ADD event_cat_addclass int(10) unsigned NOT NULL default '0'", +"CREATE TABLE ".MPREFIX."event_subs ( + event_subid int(10) unsigned NOT NULL auto_increment, + event_userid int(10) unsigned NOT NULL default '0', + event_cat int(10) unsigned NOT NULL default '0', + PRIMARY KEY (event_subid) + ) TYPE=MyISAM;" +); +$version_notes .= "3.5
    ".EC_ADLAN_A156."
    "; +} +// To version 3.6 - fair number of tweaks overall +if ($ecalVer < 3.6) +{ +$upgrade_alter_tables = array( +"ALTER TABLE ".MPREFIX."event_cat DROP event_cat_force", +"ALTER TABLE ".MPREFIX."event_cat ADD event_cat_description text", +"ALTER TABLE ".MPREFIX."event_cat ADD event_cat_force_class int(10) unsigned NOT NULL default '0'" +); + $verprefs = array( + "eventpost_adminlog" => 0, + "eventpost_showeventcount" => 1, + "eventpost_menuheading" => EC_LAN_140, + "eventpost_daysforward" => 30, + "eventpost_numevents" => 3, + "eventpost_checkrecur" => 1, + "eventpost_linkheader" => 0, + "eventpost_showcaticon" => 0, + "eventpost_dateformat" => 1, + "eventpost_fivemins" => 0, + "eventpost_emaillog" => 1, + "eventpost_caltime" => 0, + "eventpost_datedisplay" => 1, + "eventpost_timedisplay" => 0, + "eventpost_timecustom" => "%H%M", + "eventpost_fe_set" => "", + "eventpost_namelink" => 1, + "eventpost_recentshow" => 0, + "eventpost_dateevent" => 1, + "eventpost_datenext" => 1, + "eventpost_eventdatecustom" => "&A %d %B %Y", + "eventpost_nextdatecustom" => "%d %b", + "eventpost_menulink" => 0 ); + $upgrade_add_prefs .= $verprefs; + $version_notes .= "3.6
    ".EC_ADLAN_A156."
    ".create_ec_log_dir()."
    + Configure
    "; + + $upgrade_remove_prefs = array( + "eventpost_addcat", + "eventpost_evtoday", + "eventpost_headercss", + "eventpost_daycss", + "eventpost_todaycss" + ); +} + + +$eplug_upgrade_done = EC_LAN_108."
    ".$version_notes; + + +?> \ No newline at end of file diff --git a/e107_plugins/calendar_menu/readme.pdf b/e107_plugins/calendar_menu/readme.pdf new file mode 100644 index 0000000000000000000000000000000000000000..365d7f3b3e7221b0c7fa934dd91d55d885387f21 GIT binary patch literal 60782 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 literal 0 HcmV?d00001 diff --git a/e107_plugins/calendar_menu/search/search_parser.php b/e107_plugins/calendar_menu/search/search_parser.php new file mode 100644 index 000000000..c08aadbb0 --- /dev/null +++ b/e107_plugins/calendar_menu/search/search_parser.php @@ -0,0 +1,40 @@ + DESC); + +$ps = $sch -> parsesearch('event', $return_fields, $search_fields, $weights, 'search_events', $no_results, $where, $order); +$text .= $ps['text']; +$results = $ps['results']; + +function search_events($row) { + global $con; + $res['link'] = e_PLUGIN."calendar_menu/event.php?".time().".event.".$row['event_id']; + $res['title'] = $row['event_title']; + $res['summary'] = $row['event_details']; + $res['detail'] = $row['event_location']." | ".$con -> convert_date($row['event_start'], "long"); + return $res; +} + +?> \ No newline at end of file diff --git a/e107_plugins/calendar_menu/subs_menu.php b/e107_plugins/calendar_menu/subs_menu.php new file mode 100644 index 000000000..29a3d14d4 --- /dev/null +++ b/e107_plugins/calendar_menu/subs_menu.php @@ -0,0 +1,251 @@ + 0) && e_QUERY) +{ // Run with query of ?dd-mm[-yy] to test specific date + list($day,$month,$year) = explode("-",e_QUERY); + if (!isset($year) || ($year == 0)) $year = date("Y"); + $cal_starttime = mktime(0,0,0,$month,$day,$year); + echo "Debug run for {$day}-{$month}-{$year}
    "; +} +else +{ // Normal operation +$cal_starttime = mktime(0, 0, 0, date("n"), date("d"), date("Y")); +} + +$log_requirement = 0; // Logging required 0=none, 1=summary, 2=detailed +if (isset($pref['eventpost_emaillog'])) $log_requirement = $pref['eventpost_emaillog']; +if ($debug_level >= 2) $log_requirement = 2; // Force full logging if debug + +if ($log_requirement > 0) +{ + $log_filename = $ec_dir.'log/calendar_mail.txt'; + if (!$run_from_menu) + { + if (!($handle = fopen($log_filename, 'a'))) $log_requirement = 0; + if (fwrite($handle,"\r\n\r\nMail subscriptions run started at ".date("D j M Y G:i:s")) === false) $log_requirement = 0; + fclose($handle); + } +} + +// Start with the 'in advance' emails +$cal_args = "select * from #event left join #event_cat on event_category=event_cat_id where (event_cat_subs>0 OR event_cat_force_class != '') and +event_cat_last < " . intval($cal_starttime) . " and +event_cat_ahead > 0 and +event_start >= (" . intval($cal_starttime) . "+(86400*(event_cat_ahead))) and +event_start < (" . intval($cal_starttime) . "+(86400*(event_cat_ahead+1))) and +find_in_set(event_cat_notify,'1,3,5,7')"; + +send_mailshot($cal_args, 'Advance',1); + + + +// then for today +//$cal_starttime = mktime(0, 0, 0, date("n"), date("d"), date("Y")); +$cal_args = "select * from #event left join #event_cat on event_category=event_cat_id where (event_cat_subs>0 OR event_cat_force_class != '') and +event_cat_today < " . intval($cal_starttime) . " and +event_start >= (" . intval($cal_starttime) . ") and +event_start < (86400+" . intval($cal_starttime) . ") and +find_in_set(event_cat_notify,'2,3,6,7')"; + +send_mailshot($cal_args, 'today',2); + + +// Finally do 'day before' emails +$cal_args = "select * from #event left join #event_cat on event_category=event_cat_id where (event_cat_subs>0 OR event_cat_force_class != '') and +event_cat_today < " . intval($cal_starttime) . " and +event_start >= (" . intval($cal_starttime) ." + 86400 ) and +event_start < (" . intval($cal_starttime) ." + 172800) and +find_in_set(event_cat_notify,'4,5,6,7')"; + +send_mailshot($cal_args, 'tomorrow',2); + + +if (($log_requirement > 0) && (!$run_from_menu)) +{ + if (!($handle = fopen($log_filename, 'a'))) $log_requirement = 0; + if (fwrite($handle," .. completed at ".date("D j M Y G:i:s")."\r\n") === false) $log_requirement = 0; + fclose($handle); +} + +// Done + + +/* + Function to actually send a mailshot +*/ +function send_mailshot($cal_query, $shot_type, $msg_num) +{ + global $sql, $sql2; + global $log_requirement, $log_filename, $debug_level; + global $pref; + global $run_from_menu; + + if (($log_requirement > 1) && (!$run_from_menu)) + { + if (!$handle = fopen($log_filename, 'a')) $log_requirement = 0; + if (fwrite($handle,"\r\n Starting emails for ".$shot_type." at ".date("D j M Y G:i:s")) === false) $log_requirement = 0; + if ($debug_level >= 2) + { + if (fwrite($handle,"\r\n Query is: ".$cal_query."\r\n") === false) $log_requirement = 0; + } + } + +if ($num_cat_proc = $sql->db_Select_gen($cal_query)) + { // Got at least one event to process here + if ($log_requirement > 1) + { + if ($run_from_menu) if (!($handle = fopen($log_filename, 'a'))) $log_requirement = 0; + if (fwrite($handle," - ".$num_cat_proc." categories found to process\r\n") === false) $log_requirement = 0; + } + require_once(e_HANDLER . "mail.php"); + while ($cal_row = $sql->db_Fetch()) + { // Process one event at a time + extract($cal_row); + + if ($log_requirement > 1) + { + if (fwrite($handle," Processing event: ".$event_title." \r\n") === false) $log_requirement = 0; + } + + if ($msg_num == 1) + $sql2->db_Update("event_cat", "event_cat_last=" . time() . " where event_cat_id=" . intval($event_cat_id)); + else + $sql2->db_Update("event_cat", "event_cat_today=" . time() . " where event_cat_id=" . intval($event_cat_id)); + + +// Start of next try on query +// Four cases for the query: +// 1. No forced mailshots - based on event_subs table only Need INNER JOIN +// 2. Forced mailshot to members - send to all users (don't care about subscriptions) Don't need JOIN +// 3. Forced mailshot to group of members - based on user table only Don't need JOIN +// 4. Forced mailshot to group, plus optional subscriptions - use the lot! Need LEFT JOIN +// (Always block sent to banned members) + $manual_subs = (isset($pref['eventpost_asubs']) && ($pref['eventpost_asubs'] == '1')); + $subs_fields = ''; + $subs_join = ''; + $where_clause = ''; + $group_clause = ''; + + + if ($event_cat_force_class != e_UC_MEMBER) + { // Cases 1, 3, 4 (basic query does for case 2) + + if ((!$event_cat_force_class) || ($manual_subs)) + { // Cases 1 & 4 - need to join with event_subs database + $subs_fields = ", es.* "; + if ($event_cat_force_class) $subs_join = "LEFT"; else $subs_join = "INNER"; + $subs_join .= " join #event_subs AS es on u.user_id=es.event_userid "; + $where_clause = " es.event_cat='".intval($event_category)."' "; + $group_clause = " GROUP BY u.user_id"; + } + + if ($event_cat_force_class) + { // cases 3 and 4 - ... and check for involuntary subscribers + if ($where_clause) $where_clause .= " OR "; + if ($event_cat_force_class == e_UC_ADMIN) + { + $where_clause .= "(u.user_admin = '1' )"; + } + else + { + $where_clause .= "find_in_set('".intval($event_cat_force_class)."', u.user_class)"; + } + } + + if ($where_clause) $where_clause = ' AND ('.$where_clause.' ) '; + } // End of cases 1, 3, 4 + + $cal_emilargs = "SELECT u.user_id, u.user_class, u.user_email, u.user_name, u.user_ban, u.user_admin{$subs_fields} + from #user AS u {$subs_join} + WHERE u.user_ban = '0' {$where_clause} {$group_clause}"; + + + if ($debug_level >= 2) + { + if (fwrite($handle,"\r\n Email selection query is: ".$cal_emilargs."\r\n") === false) $log_requirement = 0; + } + if ($num_shots = $sql2->db_Select_gen($cal_emilargs)) + { + if ($log_requirement > 1) + { + if (fwrite($handle," - ".$num_shots." emails found to send\r\n") === false) $log_requirement = 0; + } + while ($cal_emrow = $sql2->db_Fetch()) + { + extract($cal_emrow); + if ($msg_num == 1) + $cal_msg = $event_title . "\n\n" . $event_cat_msg1; + else + $cal_msg = $event_title . "\n\n" . $event_cat_msg2; + if ($debug_level == 0) $send_result = sendemail($user_email, $pref['eventpost_mailsubject'], $cal_msg, $user_name, $pref['eventpost_mailaddress'], $pref['eventpost_mailfrom']); + if ($log_requirement > 1) + { + $log_string = " Send to: ".$user_email." Name: ".$user_name; + if ($debug_level > 0) + { $log_string .= " *DEBUG* +"; } + else + { $log_string .= " Result = ".$send_result." +"; } + if (fwrite($handle,$log_string) === false) $log_requirement = 0; + } + } + } + } // while + if ($log_requirement > 1) + { + if (fwrite($handle," Completed emails for ".$shot_type." at ".date("D j M Y G:i:s")."\r\n") === false) $log_requirement = 0; + fclose($handle); + } + } +} + + + +?> \ No newline at end of file diff --git a/e107_plugins/calendar_menu/subscribe.php b/e107_plugins/calendar_menu/subscribe.php new file mode 100644 index 000000000..be0de1e61 --- /dev/null +++ b/e107_plugins/calendar_menu/subscribe.php @@ -0,0 +1,110 @@ + toDB($_POST['event_list']); // IDs of allowed categories + $cal_subs = $tp -> toDB($_POST['event_subd']); // Checkbox results + $cal_db->db_Delete("event_subs", "event_userid='" . USERID . "'"); // Delete all for this user to start + foreach($cal_cats as $cal_row) + { // Now add in a subscription for each allowed category + if ($cal_subs[$cal_row]) + { + $cal_inargs = "0,'" . USERID . "','" . $cal_row . "'"; + $cal_db->db_Insert("event_subs", $cal_inargs); + } + // print $cal_row . $cal_subs[$cal_row] . "
    "; + } + $caltext = " + + +
    " . EC_LAN_130 . "
    " . EC_LAN_131 . "
     
    "; +} +else +{ + $caltext = "
    + + +"; + // Get list of currently subscribed + $cal_db->db_Select("event_subs", "event_cat", "where event_userid='" . USERID . "'", "nowhere"); + while ($cal_s = $cal_db->db_Fetch()) + { + extract($cal_s); + $cal_array[] = $event_cat; + } // while + + // Get list of categories that have subscriptions and are visible to this member + $cal_args = "select * from #event_cat + where event_cat_subs>0 and (find_in_set(event_cat_class,'".USERCLASS_LIST."') OR find_in_set(event_cat_force_class,'".USERCLASS_LIST."'))"; + if ($cal_db->db_Select_gen($cal_args)) + { + // echo $cal_args."
    "; + while ($cal_row = $cal_db->db_Fetch()) + { + extract($cal_row); + $caltext .= ""; + } + $caltext .= ""; + } + } + else + { + $caltext .= ""; + } + $caltext .= ""; + $caltext .= "
    " . EC_LAN_125 . "
    " . EC_LAN_126 . "" . EC_LAN_127 . "" . EC_LAN_136 . "
    "; + if (check_class($event_cat_force_class)) + { + $caltext .= EC_LAN_126; + } + else + { + $caltext .= " + {$event_cat_name}{$event_cat_description}
    " . EC_LAN_128 . "
    "; +} +} +else +{ + if (isset($pref['eventpost_asubs']) && ($pref['eventpost_asubs'] == '1')) + $caltext = EC_LAN_142; // Register or log in + else + $caltext = EC_LAN_143; // No facility +} +$ns->tablerender(EC_LAN_124, $caltext); +require_once(FOOTERF); + +?> \ No newline at end of file diff --git a/e107_plugins/chatbox_menu/admin_chatbox.php b/e107_plugins/chatbox_menu/admin_chatbox.php new file mode 100644 index 000000000..cbab947b7 --- /dev/null +++ b/e107_plugins/chatbox_menu/admin_chatbox.php @@ -0,0 +1,177 @@ +clear("chatbox"); + $message = CHBLAN_1; +} + +if (isset($_POST['prune'])) { + $chatbox_prune = $_POST['chatbox_prune']; + $prunetime = time() - $chatbox_prune; + + $sql->db_Delete("chatbox", "cb_datestamp < '$prunetime' "); + $e107cache->clear("chatbox"); + $message = CHBLAN_28; +} + +if (isset($_POST['recalculate'])) { + $sql->db_Update("user", "user_chats = 0"); + $qry = "SELECT u.user_id AS uid, count(c.cb_nick) AS count FROM #chatbox AS c + LEFT JOIN #user AS u ON SUBSTRING_INDEX(c.cb_nick,'.',1) = u.user_id + WHERE u.user_id > 0 + GROUP BY uid"; + + if ($sql -> db_Select_gen($qry)) { + $ret = array(); + while($row = $sql -> db_Fetch()) + { + $list[$row['uid']] = $row['count']; + } + } + + foreach($list as $uid => $cnt) + { + $sql->db_Update("user", "user_chats = '{$cnt}' WHERE user_id = '{$uid}'"); + } + $message = CHBLAN_33; +} + +if (isset($message)) { + $ns->tablerender("", "
    ".$message."
    "); +} + +$chatbox_posts = $pref['chatbox_posts']; + +$text = "
    +
    + + + + + + + + + + + + + + "; + + if($pref['smiley_activate']) + { + $text .= " + + + "; + } + + $text .= " + + + "; + + + $text .= " + + + "; + + $text .= " + + +
    ".CHBLAN_11.":
    ".CHBLAN_12."
    + +
    ".CHBLAN_32.": ". r_userclass("cb_mod", $pref['cb_mod'], 'off', "admin, classes")." +
    ".CHBLAN_36."". + ($pref['cb_layer'] == 0 ? "" : "")."  ". CHBLAN_37."
    ". + ($pref['cb_layer'] == 1 ? "" : "")." ".CHBLAN_29." -- ". CHBLAN_30.":
    ". + ($pref['cb_layer'] == 2 ? "" : "")."  ". CHBLAN_38." +
    ".CHBLAN_31."?: ". ($pref['cb_emote'] ? "" : "")." +
    ".CHBLAN_21.":
    ".CHBLAN_22."
    + ".CHBLAN_23." + +
    ".CHBLAN_34.": + +
    + +
    +
    +
    "; + +$ns->tablerender(CHBLAN_20, $text); + +require_once(e_ADMIN."footer.php"); +?> \ No newline at end of file diff --git a/e107_plugins/chatbox_menu/chat.php b/e107_plugins/chatbox_menu/chat.php new file mode 100644 index 000000000..8d1a1bd85 --- /dev/null +++ b/e107_plugins/chatbox_menu/chat.php @@ -0,0 +1,168 @@ +db_Select("menus", "*", "menu_name='chatbox_menu'"); +$row = $sql->db_Fetch(); + +if (!check_class($row['menu_class'])) { + $ns->tablerender(CHATBOX_L23, "
    ".CHATBOX_L24."
    "); + require_once(FOOTERF); + exit; +} + +if(!isset($pref['cb_mod'])) +{ + $pref['cb_mod'] = e_UC_ADMIN; +} +define("CB_MOD", check_class($pref['cb_mod'])); + +if($_POST['moderate'] && CB_MOD) +{ + if(isset($_POST['block'])) + { + foreach(array_keys($_POST['block']) as $k){ $kk[] = intval($k); } + $blocklist = implode(",", $kk); + $sql->db_Select_gen("UPDATE #chatbox SET cb_blocked=1 WHERE cb_id IN ({$blocklist})"); + } + + if(isset($_POST['unblock'])) + { + foreach(array_keys($_POST['unblock']) as $k){ $kk[] = intval($k); } + $unblocklist = implode(",", $kk); + $sql->db_Select_gen("UPDATE #chatbox SET cb_blocked=0 WHERE cb_id IN ({$unblocklist})"); + } + + if(isset($_POST['delete'])) + { + $deletelist = implode(",", array_keys($_POST['delete'])); + $sql -> db_Select_gen("SELECT c.cb_id, u.user_id FROM #chatbox AS c + LEFT JOIN #user AS u ON SUBSTRING_INDEX(c.cb_nick,'.',1) = u.user_id + WHERE c.cb_id IN (".$deletelist.")"); + $rowlist = $sql -> db_getList(); + foreach ($rowlist as $row) { + $sql -> db_Select_gen("UPDATE #user SET user_chats=user_chats-1 where user_id = ".intval($row['user_id'])); + } + $sql -> db_Select_gen("DELETE FROM #chatbox WHERE cb_id IN ({$deletelist})"); + } + $e107cache->clear("chatbox"); + $message = CHATBOX_L18; +} + +// when coming from search.php +if (strstr(e_QUERY, "fs")) { + $cgtm = str_replace(".fs", "", e_QUERY); + $fs = TRUE; +} +// end search + +if (e_QUERY ? $from = e_QUERY : $from = 0); + +$chat_total = $sql->db_Count("chatbox"); + +$qry_where = (CB_MOD ? "1" : "cb_blocked=0"); + +// when coming from search.php calculate page number +if ($fs) { + $page_count = 0; + $row_count = 0; + $sql->db_Select("chatbox", "*", "{$qry_where} ORDER BY cb_datestamp DESC"); + while ($row = $sql -> db_Fetch()) { + if ($row['cb_id'] == $cgtm) { + $from = $page_count; + break; + } + $row_count++; + if ($row_count == 30) { + $row_count = 0; + $page_count += 30; + } + } +} +// end search + +$sql->db_Select("chatbox", "*", "{$qry_where} ORDER BY cb_datestamp DESC LIMIT ".intval($from).", 30"); +$obj2 = new convert; + +$chatList = $sql->db_getList(); +foreach ($chatList as $row) +{ + $CHAT_TABLE_DATESTAMP = $obj2->convert_date($row['cb_datestamp'], "long"); + $CHAT_TABLE_NICK = preg_replace("/[0-9]+\./", "", $row['cb_nick']); + $cb_message = $tp->toHTML($row['cb_message']); + if($row['cb_blocked']) + { + $cb_message .= "
    ".CHATBOX_L25; + } + if(CB_MOD) + { + $cb_message .= "
    ".CHATBOX_L10; + if($row['cb_blocked']) + { + $cb_message .= "   ".CHATBOX_L7; + } + else + { + $cb_message .= "   ".CHATBOX_L9; + } + } + + $CHAT_TABLE_MESSAGE = $cb_message; + $CHAT_TABLE_FLAG = ($flag ? "forumheader3" : "forumheader4"); + + if (!$CHAT_TABLE) { + if (file_exists(THEME."chat_template.php")) + { + require_once(THEME."chat_template.php"); + } + else + { + require_once(e_PLUGIN."chatbox_menu/chat_template.php"); + } + } + $textstring .= preg_replace("/\{(.*?)\}/e", '$\1', $CHAT_TABLE); + $flag = (!$flag ? TRUE : FALSE); +} + +$textstart = preg_replace("/\{(.*?)\}/e", '$\1', $CHAT_TABLE_START); +$textend = preg_replace("/\{(.*?)\}/e", '$\1', $CHAT_TABLE_END); +$text = $textstart.$textstring.$textend; +if(CB_MOD) +{ + $text = "
    ".$text."
    "; +} +if($message) +{ + $ns->tablerender("", $message); +} + +$ns->tablerender(CHATBOX_L20, $text); + + +require_once(e_HANDLER."np_class.php"); +$ix = new nextprev("chat.php", $from, 30, $chat_total, CHATBOX_L21); + +require_once(FOOTERF); +?> \ No newline at end of file diff --git a/e107_plugins/chatbox_menu/chat_template.php b/e107_plugins/chatbox_menu/chat_template.php new file mode 100644 index 000000000..5ed23b703 --- /dev/null +++ b/e107_plugins/chatbox_menu/chat_template.php @@ -0,0 +1,27 @@ +
    "; +} +if(!$CHAT_TABLE){ + $CHAT_TABLE = "\n +
    +
    + bullet \n{CHAT_TABLE_NICK} ".CHATBOX_L22." {CHAT_TABLE_DATESTAMP}
    +
    {CHAT_TABLE_MESSAGE}
    \n +
    +
    \n"; + +} +if(!$CHAT_TABLE_END){ + $CHAT_TABLE_END = " +
    "; +} +// ##### ------------------------------------------------------------------------------------------ + + +?> \ No newline at end of file diff --git a/e107_plugins/chatbox_menu/chatbox_menu.php b/e107_plugins/chatbox_menu/chatbox_menu.php new file mode 100644 index 000000000..c8f534256 --- /dev/null +++ b/e107_plugins/chatbox_menu/chatbox_menu.php @@ -0,0 +1,266 @@ + toDB($_POST['nick']))); + + $cmessage = $_POST['cmessage']; + $cmessage = preg_replace("#\[.*?\](.*?)\[/.*?\]#s", "\\1", $cmessage); + + $fp = new floodprotect; + if($fp -> flood("chatbox", "cb_datestamp")) + { + if((strlen(trim($cmessage)) < 1000) && trim($cmessage) != "") + { + $cmessage = $tp -> toDB($cmessage, false, true); + if($sql -> db_Select("chatbox", "*", "cb_message='$cmessage' AND cb_datestamp+84600>".time())) + { + $emessage = CHATBOX_L17; + } + else + { + $datestamp = time(); + $ip = $e107->getip(); + if(USER) + { + $nick = USERID.".".USERNAME; + $sql -> db_Update("user", "user_chats=user_chats+1, user_lastpost='".time()."' WHERE user_id='".USERID."' "); + } + else if(!$nick) + { + $nick = "0.Anonymous"; + } + else + { + if($sql -> db_Select("user", "*", "user_name='$nick' ")){ + $emessage = CHATBOX_L1; + } + else + { + $nick = "0.".$nick; + } + } + if(!$emessage) + { + $sql -> db_Insert("chatbox", "0, '$nick', '$cmessage', '".time()."', '0' , '$ip' "); + $edata_cb = array("cmessage" => $cmessage, "ip" => $ip); + $e_event -> trigger("cboxpost", $edata_cb); + $e107cache->clear("nq_chatbox"); + } + } + } + else + { + $emessage = CHATBOX_L15; + } + } + else + { + $emessage = CHATBOX_L19; + } + } +} + +if(!USER && !$pref['anon_post']){ + if($pref['user_reg']) + { + $texta = "
    ".CHATBOX_L3."


    "; + } +} +else +{ + $cb_width = (defined("CBWIDTH") ? CBWIDTH : ""); + + if($pref['cb_layer'] == 2) + { + $texta = "\n
    +
    + "; + } + else + { + $texta = (e_QUERY ? "\n" : "\n"); + } + $texta .= "
    "; + + if(($pref['anon_post'] == "1" && USER == FALSE)) + { + $texta .= "\n
    "; + } + + if($pref['cb_layer'] == 2) + { + + $oc = "onclick=\"javascript:sendInfo('".SITEURL.$PLUGINS_DIRECTORY."chatbox_menu/chatbox_menu.php', 'chatbox_posts', this.form);\""; + } + else + { + $oc = ""; + } + $texta .= " + +
    + + "; + + if($pref['cb_emote'] && $pref['smiley_activate']){ + $texta .= " + + \n"; + } + + $texta .="
    \n
    \n"; +} + +if($emessage != ""){ + $texta .= "
    ".$emessage."
    "; +} + +if(!$text = $e107cache->retrieve("nq_chatbox")) +{ + global $pref,$tp; + $pref['chatbox_posts'] = ($pref['chatbox_posts'] ? $pref['chatbox_posts'] : 10); + $chatbox_posts = $pref['chatbox_posts']; + if(!isset($pref['cb_mod'])) + { + $pref['cb_mod'] = e_UC_ADMIN; + } + define("CB_MOD", check_class($pref['cb_mod'])); + + $qry = " + SELECT c.*, u.user_name FROM #chatbox AS c + LEFT JOIN #user AS u ON SUBSTRING_INDEX(c.cb_nick,'.',1) = u.user_id + ORDER BY c.cb_datestamp DESC LIMIT 0, ".intval($chatbox_posts); + + if($sql -> db_Select_gen($qry)) + { + $obj2 = new convert; + $cbpost = $sql -> db_getList(); + foreach($cbpost as $cb) + { + // get available vars + list($cb_uid, $cb_nick) = explode(".", $cb['cb_nick'], 2); + if($cb['user_name']) + { + $cb_nick = "{$cb['user_name']}"; + } + else + { + $cb_nick = $tp -> toHTML($cb_nick,FALSE,'emotes_off, no_make_clickable'); + $cb_nick = str_replace("Anonymous", LAN_ANONYMOUS, $cb_nick); + } + + $datestamp = $obj2->convert_date($cb['cb_datestamp'], "short"); + if(!$pref['cb_wordwrap']) { $pref['cb_wordwrap'] = 30; } + $emotes_active = $pref['cb_emote'] ? 'emotes_on' : 'emotes_off'; + + $cb_message = $tp -> toHTML($cb['cb_message'], FALSE, $emotes_active, $cb_uid, $pref['menu_wordwrap']); + + $replace[0] = "["; $replace[1] = "]"; + $search[0] = "["; $search[1] = "]"; + $cb_message = str_replace($search, $replace, $cb_message); + + global $CHATBOXSTYLE; + if(!$CHATBOXSTYLE) + { + $bullet = (defined("BULLET") ? "" : ""); + // default chatbox style + $CHATBOXSTYLE = "\n
    + $bullet {USERNAME}
    {TIMEDATE}
    {MESSAGE}

    \n"; + } + + $search[0] = "/\{USERNAME\}(.*?)/si"; + $replace[0] = $cb_nick; + $search[1] = "/\{TIMEDATE\}(.*?)/si"; + $replace[1] = $datestamp; + $search[2] = "/\{MESSAGE\}(.*?)/si"; + $replace[2] = ($cb['cb_blocked'] ? CHATBOX_L6 : $cb_message); + + $text .= preg_replace($search, $replace, $CHATBOXSTYLE); + + } + } + else + { + $text .= "".CHATBOX_L11.""; + } + $total_chats = $sql -> db_Count("chatbox"); + if($total_chats > $chatbox_posts || CB_MOD) + { + $text .= "
    "; + } + $e107cache->set("nq_chatbox", $text); +} + +$caption = (file_exists(THEME."images/chatbox_menu.png") ? " ".CHATBOX_L2 : CHATBOX_L2); + +if($pref['cb_layer'] == 1) +{ + $text = $texta."
    ".$text."
    "; + $ns -> tablerender($caption, $text, 'chatbox'); +} +elseif($pref['cb_layer'] == 2 && isset($_POST['chat_submit'])) +{ + $text = $texta.$text; + $text = str_replace(e_IMAGE, e_IMAGE_ABS, $text); + echo $text; +} +else +{ + $text = $texta.$text; + if($pref['cb_layer'] == 2) + { + $text = "
    ".$text."
    "; + } + $ns -> tablerender($caption, $text, 'chatbox'); +} + +//$text = ($pref['cb_layer'] ? $texta."
    ".$text."
    " : $texta.$text); +//if(ADMIN && getperms("C")){$text .= "
    ";} +//$ns -> tablerender($caption, $text, 'chatbox'); + +?> \ No newline at end of file diff --git a/e107_plugins/chatbox_menu/chatbox_sql.php b/e107_plugins/chatbox_menu/chatbox_sql.php new file mode 100644 index 000000000..7f2a46a1f --- /dev/null +++ b/e107_plugins/chatbox_menu/chatbox_sql.php @@ -0,0 +1,9 @@ +CREATE TABLE chatbox ( + cb_id int(10) unsigned NOT NULL auto_increment, + cb_nick varchar(30) NOT NULL default '', + cb_message text NOT NULL, + cb_datestamp int(10) unsigned NOT NULL default '0', + cb_blocked tinyint(3) unsigned NOT NULL default '0', + cb_ip varchar(15) NOT NULL default '', + PRIMARY KEY (cb_id) + ) TYPE=MyISAM; \ No newline at end of file diff --git a/e107_plugins/chatbox_menu/e_list.php b/e107_plugins/chatbox_menu/e_list.php new file mode 100644 index 000000000..8677e1d6d --- /dev/null +++ b/e107_plugins/chatbox_menu/e_list.php @@ -0,0 +1,41 @@ + db_Select("plugin", "*", "plugin_path = 'chatbox_menu' AND plugin_installflag = '1' ")){ + return; + } + + $LIST_CAPTION = $arr[0]; + $LIST_DISPLAYSTYLE = ($arr[2] ? "" : "none"); + + if($mode == "new_page" || $mode == "new_menu" ){ + $lvisit = $this -> getlvisit(); + $qry = "cb_datestamp>".$lvisit; + }else{ + $qry = "cb_id != '0' "; + } + $qry .= " ORDER BY cb_datestamp DESC LIMIT 0,".intval($arr[7]); + + $bullet = $this -> getBullet($arr[6], $mode); + + if(!$chatbox_posts = $sql -> db_Select("chatbox", "*", $qry)){ + $LIST_DATA = LIST_CHATBOX_2; + }else{ + while($row = $sql -> db_Fetch()) { + + $cb_id = substr($row['cb_nick'] , 0, strpos($row['cb_nick'] , ".")); + $cb_nick = substr($row['cb_nick'] , (strpos($row['cb_nick'] , ".")+1)); + $cb_message = ($row['cb_blocked'] ? CHATBOX_L6 : str_replace("
    ", " ", $tp -> toHTML($row['cb_message']))); + $rowheading = $this -> parse_heading($cb_message, $mode); + $ICON = $bullet; + $HEADING = $rowheading; + $AUTHOR = ($arr[3] ? ($cb_id != 0 ? "".$cb_nick."" : $cb_nick) : ""); + $CATEGORY = ""; + $DATE = ($arr[5] ? ($row['cb_datestamp'] ? $this -> getListDate($row['cb_datestamp'], $mode) : "") : ""); + $INFO = ""; + $LIST_DATA[$mode][] = array( $ICON, $HEADING, $AUTHOR, $CATEGORY, $DATE, $INFO ); + } + } + +?> \ No newline at end of file diff --git a/e107_plugins/chatbox_menu/e_notify.php b/e107_plugins/chatbox_menu/e_notify.php new file mode 100644 index 000000000..81f6e10ce --- /dev/null +++ b/e107_plugins/chatbox_menu/e_notify.php @@ -0,0 +1,40 @@ + NT_LAN_CB_2); +} + + +if (!function_exists('notify_cboxpost')) { + function notify_cboxpost($data) { + global $nt; + include_lan(e_PLUGIN."chatbox_menu/languages/".e_LANGUAGE."/".e_LANGUAGE.".php"); + $message = NT_LAN_CB_3.': '.USERNAME.' ('.NT_LAN_CB_4.': '.$data['ip'].' )
    '; + $message .= NT_LAN_CB_5.':
    '.$data['cmessage'].'

    '; + $nt -> send('cboxpost', NT_LAN_CB_6, $message); + } +} + +?> \ No newline at end of file diff --git a/e107_plugins/chatbox_menu/e_rss.php b/e107_plugins/chatbox_menu/e_rss.php new file mode 100644 index 000000000..c10417db5 --- /dev/null +++ b/e107_plugins/chatbox_menu/e_rss.php @@ -0,0 +1,44 @@ + db_Select('chatbox', "*", "cb_blocked=0 ORDER BY cb_datestamp DESC LIMIT 0,".$this -> limit)){ + $i=0; + while($rowrss = $sql -> db_Fetch()){ + $tmp = explode(".", $rowrss['cb_nick']); + $rss[$i]['author'] = $tmp[1]; + $rss[$i]['author_email'] = ''; + $rss[$i]['link'] = $e107->base_path.$PLUGINS_DIRECTORY."chatbox_menu/chat.php?".$rowrss['cb_id']; + $rss[$i]['linkid'] = $rowrss['cb_id']; + $rss[$i]['title'] = ''; + $rss[$i]['description'] = $rowrss['cb_message']; + $rss[$i]['category_name'] = ''; + $rss[$i]['category_link'] = ''; + $rss[$i]['datestamp'] = $rowrss['cb_datestamp']; + $rss[$i]['enc_url'] = ""; + $rss[$i]['enc_leng'] = ""; + $rss[$i]['enc_type'] = ""; + $i++; + } +} + + +//##### ------------------------------------------------------------------------------------ + +$eplug_rss_data[] = $rss; +$eplug_rss_feed[] = $feed; +?> \ No newline at end of file diff --git a/e107_plugins/chatbox_menu/e_search.php b/e107_plugins/chatbox_menu/e_search.php new file mode 100644 index 000000000..c8ae9e0dc --- /dev/null +++ b/e107_plugins/chatbox_menu/e_search.php @@ -0,0 +1,11 @@ + e_PLUGIN.'chatbox_menu/search/search_parser.php', 'qtype' => CB_SCH_LAN_1, 'refpage' => 'chat.php', 'advanced' => e_PLUGIN.'chatbox_menu/search/search_advanced.php'); +?> \ No newline at end of file diff --git a/e107_plugins/chatbox_menu/e_status.php b/e107_plugins/chatbox_menu/e_status.php new file mode 100644 index 000000000..c43b58c0f --- /dev/null +++ b/e107_plugins/chatbox_menu/e_status.php @@ -0,0 +1,6 @@ + db_Count("chatbox"); +$text .= "
    ".ADLAN_115.": ".$chatbox_posts."
    "; +?> \ No newline at end of file diff --git a/e107_plugins/chatbox_menu/images/blocked.png b/e107_plugins/chatbox_menu/images/blocked.png new file mode 100644 index 0000000000000000000000000000000000000000..be6625a681fe45261b081ff634b4624c224ecf4b GIT binary patch literal 1235 zcmWktc}&v>6#hzqa-;|*ULanpK(e?5-PEWRPzWtYsel^EKuQf8sG*9c9uXZZOb7^w z;)PNzSBFkS<*4P94p}NcL}A5nlul7>ov5SghP?g!<9lDemzS3>-^=+5Zp}83f!aaGjPpu$p&392vsv=gynwxp;|#!UNz!8W9^p zL^hkPx4HRtetuwGd(>o0`-6vxB(Oa$2~nuQ&UF=2Rqd2Y(D=F zU;=mn`~{2xPk{lT7dXb}*O!zu6&GIyJ^(i0AK)$UH}D)71RethKo6V*G+9~Q8cms< z-Hg5c443uJ9jo>1%9Z5fL+VWy6U{CzS(&l5^*+!CbOSkj{Kva(0O7+?gh z0c|SP?Gq==iHRf>Qa}K0+{mn6-2qGjjR2*mlSoA2;S?4|p`pzB^?FCg89O^Ga3L-( zFEEgf9;KKV+P00hZ>Q*Jb3g#2R-5^Ja&#rlDJ6yW?xnOe%g&ulMTLdSz0002H`i)1RkO+D6bmWLmB$|5jM!$J8 z6BT6{9cAq8Cx(X3hKEn7)pY3+RaKEjqf1NE$Hh^0Hf3Zm@$tH?TS+3B_V<71>Ut(H zaImedP9~!V52&MqT3V>FQJ0*|D3w%EL07KO`SVm%#3Uu@A|pwu{Jekvhoq!xCnqDj z+-Rhp9_sF<&Q5A=C9Rg~>#4SuYHFymlCEB*(o#BiZl+|(%vRW+-4LZ3z&);98P-qeoH1YAfKdt$beGkroXh{qL$BoIXa8`(RqyvlEzkqW; zB{qf~5Q~F@V*TbgwEO=U!+}GalCxYTxYc`Ab?{s1zUa;yg=_6SmYSAqS{l2%(%`nv zZ`n1o;N+4s^{Oqk+Lya{A2KhwEB1H?i;CUH)b4Kt;?q4fJmqj}x?Cup%?f#FZrwG* z!zn>gx$uZ;KbVUty&W#ZF;$;)#E-N&;hc7^5U*5t5BLmVOr{%uoY=Kt_BRs8?} literal 0 HcmV?d00001 diff --git a/e107_plugins/chatbox_menu/images/chatbox_16.png b/e107_plugins/chatbox_menu/images/chatbox_16.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3aab597d9838b3ecff77f74b8df9883316eb60 GIT binary patch literal 1062 zcmdT?|5Mrp82+T@I`6!-YqxV--B~-Q*DiB;wQDVJESRG?GsKO{R#W-7Sbjrsf-OPw z`(}!W0s;z%+(LoLh`ZFlg@zsjJq?^pbUL#wUE<-KAiU9^(R24a&pmg~5AS>TG^C{_ zM@AfqKoBGne-29s`m6u(mC&HZy|XtxXkk||7cdB-HlKL8@d<*2M5d(>adHXVy#rjv z?)LV!)dIHr(A75IlIyMN_m_K%u} zQLBU``gUTm?}pIyTEt3Yi9XCEOw;h8Waj(adG2# z+Pu^0WL{hR@FuLTt`f3;kZ_k49xW>sbKM+Jj=U&gE|Y}2YKe!1I(xgpY}^+90o|R` zT(L^8vz--qr>7w4$ADC#XZAo&U!a0@Pay}r&Q+hcf>MP=-z{I4?q(Fubu>9Ux%L*8 zi%~Dq+y=v+kj&rsn)wsA#3wdFIlWUh_ySK=uCH%ai=R$SP0?Hb9_WYtpL-~5V>cfd zqrlGf_Q}9z_SvVQqSV5_1;~5p#tL3$KG#12op7qKc(Mn1_4MyAPAMWMa6Z zndhoK0Pv(Pkr*6`nnp-X561ry5a!*`%HZh-X*d!sy)c(nmQ{=*7;<4Y8ja7-x{4Ce zEHZ;Sj-CpZ9^FXM!RQip7|3zv$ z{&MYTdvs;OrOdNqa;;bJ=|>MkzGQ_Y;%1MUJ(`^_tJypm-pq^99(?Q4UzFZsM81!HflP`$vhUfNV~}wEbmtKR zVaKZ@QPxiD0|VxhbGNZk@kl6AyHRN8yM$rEe-S(`6{|XPrRrbqI-w{4 literal 0 HcmV?d00001 diff --git a/e107_plugins/chatbox_menu/images/chatbox_32.png b/e107_plugins/chatbox_menu/images/chatbox_32.png new file mode 100644 index 0000000000000000000000000000000000000000..d1dd539886b039d39892f4bc87544ad6e3e3a21f GIT binary patch literal 1857 zcmd^<`9IW&AICqTShBS%rPe;oZhc3^hO}(h#Mk5~H;r?hgK@6by0fGmx5#abG>kiP z=4_O44wEp;w#l_}wq+c1&wG9Uj_>R7c)gyF*YB^#E5*vfSXTOsG=d z^z^V;?8(XLQw}s*tI#}}^J}~4p&u_lTJYx0TdaNBD1C*?<>vmvj|}f0A0KZS0e=dY zHUpnNZHIf#+^0cT_edyyV0{-{9V)-^+$}63-O68k@>JB>1{4YjN>EU zt=3Kgg9>MV%=E*jTub4VByZNyAgB{)eURJ?gw&Pt41PiWSTbQK;|Ua{h>EkpD@UYa zI6x-CrEoSTS5Q|8c&DMx*N~Kw+uGKZUGP!Xm{pc1YH4YWh%55LSE~P1-%tx;I;@-J zLbuz`^6(<$`+rCk`=lh%^dyXSK{k%}z3BkCe5$b?h}}?A3uR@HJ_rJVppY)4R62qDN{_h-|gGdRYs#;NAo9JTDz7Bz_=*lAIg6mVLoB|n>WoruP=Lnkrf-849 zk4hn=2;!>2sR07>;k3gJaRTHlw`sJ&AH7LO)aFKqp)dd#bYQbNeqm{LC4yuERVQZL zE}x-A(8V^`AhR~-KV|095@_7X6|Ou z&!C&WG4XnGn*)!sU}omezW(8~kWab6eCi@-VdhA2)(r4fL?4QNP2m z0y!HSdpUu;Si*b&zALLkRN4pg^9wX8#JVlqC>7nz=Ifc_(nrDCDyo+XE(tsK9*ly! z!tN@_joI>xWNHw0wG)I@&jm(qzgIW+S>XsSIN}XYhRV-um+-k`I(1)sLsry!-tu@S zBqY44Mif`Ll~J`58^3netG}RR`)b^5bYu&K@=7zDqaVsf*>XR}bPSKspUgmEqR`K7 zVuAsU3?NtVBKyF=4A(Ocr?7nF+ynqn+t6Pk$RQ-m#=`cX{yz(`WlR3&;3rOpVI0D2 zLwv#_JnrBS1Md(|9LhAv!xv|R^YD%e9l_}#h*-C&k%8S08D1PqMBU2##nDASl_)eC z9i?&e>d9M&lT=r5>7}36*4Htrmuo#oRgLYRYQ0&xXvwQBxu=Laf8ON5Q_g<4%tJAY zCR^;weyZi8Qc1Dv7xhYfowF2O4pq%+mDW@aFI24CO%rHCcyAs$?B| zzq8L{n-mq+N|OXBA(1k5)rJJB>PgX^Lauu4{E|K&wv0(Y{S&-GGyVd#Cw}d3A3=!RS7GXgYh6*$^1FFa;U8Pxreg^mG5g%!LuGv6{%!(`t@~Ap z4<3(i+qqB@T94)Nk5?>^$m9v`M%AdK6MOFCmB5+VT&ve#Rnym|C!(mZSlXf4uYk%IC804Pm z4YGLa%e-p+@NVb)bK_OQ?7H16a}$(%~+)|MPfEs6-%P_MWo evnrSC`x8PobX%S!jTIkk9WljN7&REW-}@Ju&t+=> literal 0 HcmV?d00001 diff --git a/e107_plugins/chatbox_menu/languages/English/English.php b/e107_plugins/chatbox_menu/languages/English/English.php new file mode 100644 index 000000000..6fff87e5d --- /dev/null +++ b/e107_plugins/chatbox_menu/languages/English/English.php @@ -0,0 +1,55 @@ +here to signup"); +define("CHATBOX_L4", "Submit"); +define("CHATBOX_L5", "Reset"); +define("CHATBOX_L6", "[blocked by admin]"); +define("CHATBOX_L7", "Unblock"); +define("CHATBOX_L8", "Info"); +define("CHATBOX_L9", "Block"); +define("CHATBOX_L10", "Delete"); +define("CHATBOX_L11", "No messages yet."); +define("CHATBOX_L12", "View all posts"); +define("CHATBOX_L13", "moderate chatbox"); +define("CHATBOX_L14", "Emotes"); +define("CHATBOX_L15", "Post too long, or empty post submitted"); +define("CHATBOX_L16", "Anonymous"); +define("CHATBOX_L17", "Duplicate post"); +define("CHATBOX_L18", "Chatbox messages moderated"); +define("CHATBOX_L19", "You may only post once every ".(FLOODPROTECT ? FLOODTIMEOUT : 'n/a')." seconds"); + +define("CHATBOX_L20", "Chatbox (all posts)"); +define("CHATBOX_L21", "Chat Posts"); +define("CHATBOX_L22", "on"); +define("CHATBOX_L23", "Error!"); +define("CHATBOX_L24", "You do not have the correct permissions to view this page."); +define("CHATBOX_L25", "[ this post has been blocked by admin ]"); + +// Notify +define("NT_LAN_CB_1", "Chatbox Events"); +define("NT_LAN_CB_2", "Message posted"); +define("NT_LAN_CB_3", "Posted by"); +define("NT_LAN_CB_4", "IP Address"); +define("NT_LAN_CB_5", "Message"); +define("NT_LAN_CB_6", "Chatbox Message Posted"); + +?> \ No newline at end of file diff --git a/e107_plugins/chatbox_menu/languages/English/English_config.php b/e107_plugins/chatbox_menu/languages/English/English_config.php new file mode 100644 index 000000000..875d57861 --- /dev/null +++ b/e107_plugins/chatbox_menu/languages/English/English_config.php @@ -0,0 +1,56 @@ + \ No newline at end of file diff --git a/e107_plugins/chatbox_menu/languages/English/lan_chatbox_search.php b/e107_plugins/chatbox_menu/languages/English/lan_chatbox_search.php new file mode 100644 index 000000000..df6616f3f --- /dev/null +++ b/e107_plugins/chatbox_menu/languages/English/lan_chatbox_search.php @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/e107_plugins/chatbox_menu/plugin.php b/e107_plugins/chatbox_menu/plugin.php new file mode 100644 index 000000000..47862b961 --- /dev/null +++ b/e107_plugins/chatbox_menu/plugin.php @@ -0,0 +1,102 @@ + '10', + 'cb_wordwrap' => '20', + 'cb_layer' => '0', + 'cb_layer_height' => '200', + 'cb_emote' => '0', + 'cb_mod' => e_UC_ADMIN +); + +// List of table names ----------------------------------------------------------------------------------------------- +$eplug_table_names = array( + "chatbox" +); + +// List of sql requests to create tables ----------------------------------------------------------------------------- +$eplug_tables = array( + "CREATE TABLE ".MPREFIX."chatbox ( + cb_id int(10) unsigned NOT NULL auto_increment, + cb_nick varchar(30) NOT NULL default '', + cb_message text NOT NULL, + cb_datestamp int(10) unsigned NOT NULL default '0', + cb_blocked tinyint(3) unsigned NOT NULL default '0', + cb_ip varchar(15) NOT NULL default '', + PRIMARY KEY (cb_id) + ) TYPE=MyISAM;" +); + +// Create a link in main menu (yes=TRUE, no=FALSE) ------------------------------------------------------------- +$eplug_link = FALSE; +$eplug_link_name = ''; +$eplug_link_url = ''; + + +// upgrading ... // +$upgrade_add_prefs = ""; +$upgrade_remove_prefs = ""; +$upgrade_alter_tables = ""; + + +if (!function_exists('chatbox_menu_uninstall')) { + function chatbox_menu_uninstall() { + global $sql; + $sql -> db_Update("user", "user_chats='0'"); + } +} + +if (!function_exists('chatbox_menu_install')) { + function chatbox_menu_install() { + global $sql; + $sql -> db_Update("user", "user_chats='0'"); + } +} + +?> diff --git a/e107_plugins/chatbox_menu/search/search_advanced.php b/e107_plugins/chatbox_menu/search/search_advanced.php new file mode 100644 index 000000000..d19842232 --- /dev/null +++ b/e107_plugins/chatbox_menu/search/search_advanced.php @@ -0,0 +1,28 @@ + \ No newline at end of file diff --git a/e107_plugins/chatbox_menu/search/search_parser.php b/e107_plugins/chatbox_menu/search/search_parser.php new file mode 100644 index 000000000..5d821729d --- /dev/null +++ b/e107_plugins/chatbox_menu/search/search_parser.php @@ -0,0 +1,57 @@ + db_Count('chatbox'); + +// advanced +$advanced_where = ""; +if (isset($_GET['time']) && is_numeric($_GET['time'])) { + $advanced_where .= " cb_datestamp ".($_GET['on'] == 'new' ? '>=' : '<=')." '".(time() - $_GET['time'])."' AND"; +} + +if (isset($_GET['author']) && $_GET['author'] != '') { + $advanced_where .= " cb_nick LIKE '%".$tp -> toDB($_GET['author'])."%' AND"; +} + +// basic +$return_fields = 'cb_id, cb_nick, cb_message, cb_datestamp'; +$search_fields = array('cb_nick', 'cb_message'); +$weights = array('1', '1'); +$no_results = LAN_198; +$where = $advanced_where; +$order = array('cb_datestamp' => DESC); + +$ps = $sch -> parsesearch('chatbox', $return_fields, $search_fields, $weights, 'search_chatbox', $no_results, $where, $order); +$text .= $ps['text']; +$results = $ps['results']; + +function search_chatbox($row) { + global $con, $cb_count; + preg_match("/([0-9]+)\.(.*)/", $row['cb_nick'], $user); + $res['link'] = e_PLUGIN."chatbox_menu/chat.php?".$row['cb_id'].".fs"; + $res['pre_title'] = LAN_SEARCH_7; + $res['title'] = $user[2]; + $res['summary'] = $row['cb_message']; + $res['detail'] = $con -> convert_date($row['cb_datestamp'], "long"); + return $res; +} + +?> \ No newline at end of file diff --git a/e107_plugins/clock_menu/clock.js b/e107_plugins/clock_menu/clock.js new file mode 100644 index 000000000..89ae48d64 --- /dev/null +++ b/e107_plugins/clock_menu/clock.js @@ -0,0 +1,70 @@ + \ No newline at end of file diff --git a/e107_plugins/clock_menu/clock_menu.php b/e107_plugins/clock_menu/clock_menu.php new file mode 100644 index 000000000..25ba0f682 --- /dev/null +++ b/e107_plugins/clock_menu/clock_menu.php @@ -0,0 +1,65 @@ +\n
     
    \n"; +if (!isset($clock_flat) || !$clock_flat) { + $ns->tablerender($menu_pref['clock_caption'], "
    ".$text."
    ", 'clock'); +} else { + echo $text; +} +?> + + + + +\n\n"; +?> \ No newline at end of file diff --git a/e107_plugins/clock_menu/config.php b/e107_plugins/clock_menu/config.php new file mode 100644 index 000000000..321686652 --- /dev/null +++ b/e107_plugins/clock_menu/config.php @@ -0,0 +1,111 @@ +db_Update("core", "e107_value='$tmp' WHERE e107_name='menu_pref' "); + $ns->tablerender("", "
    ".CLOCK_AD_L1."
    "); +} + +$text = "
    +
    + "; + +// Title +$text .= " + + + "; + +// Format Time +$text .= " + + + "; + +// Date Prefix +$text .= " + + + "; + +// Date Suffix +$text .= " + + + "; + +$text .= " + + + "; + +$text .= " + + + "; + +$text .= " + + + "; + +$text .= " + + +
    ".CLOCK_AD_L2.": + +
    ".CLOCK_AD_L5.": ".($menu_pref['clock_format'] == 1 ? $rs->form_checkbox("clock_format", 1, 1) : $rs->form_checkbox("clock_format", 1, 0) )." +
    ".CLOCK_AD_L6."
    ".CLOCK_AD_L7.": + +
    ".CLOCK_AD_L8."
    ".CLOCK_AD_L9.": + 1 +
    ".CLOCK_AD_L13."
    ".CLOCK_AD_L10.": + 2 +
    ".CLOCK_AD_L13."
    ".CLOCK_AD_L11.": + 3 +
    ".CLOCK_AD_L13."
    ".CLOCK_AD_L12.": + 4 +
    ".CLOCK_AD_L13."
    + +
    +
    +
    "; +$ns->tablerender(CLOCK_AD_L4, $text); +require_once(e_ADMIN."footer.php"); +?> \ No newline at end of file diff --git a/e107_plugins/clock_menu/languages/English.php b/e107_plugins/clock_menu/languages/English.php new file mode 100644 index 000000000..dafe3d022 --- /dev/null +++ b/e107_plugins/clock_menu/languages/English.php @@ -0,0 +1,44 @@ + \ No newline at end of file diff --git a/e107_plugins/clock_menu/languages/admin/English.php b/e107_plugins/clock_menu/languages/admin/English.php new file mode 100644 index 000000000..91cc8c439 --- /dev/null +++ b/e107_plugins/clock_menu/languages/admin/English.php @@ -0,0 +1,44 @@ + diff --git a/e107_plugins/comment_menu/comment_menu.php b/e107_plugins/comment_menu/comment_menu.php new file mode 100644 index 000000000..f3a5622b2 --- /dev/null +++ b/e107_plugins/comment_menu/comment_menu.php @@ -0,0 +1,47 @@ +getCommentData(intval($menu_pref['comment_display'])); + +$text = ''; +// no posts yet .. +if(empty($data) || !is_array($data)){ + $text = CM_L1; +} + +global $row; +foreach($data as $row){ + $text .= $tp->parseTemplate($COMMENT_MENU_TEMPLATE, true, $comment_menu_shortcodes); +} + +$ns->tablerender($menu_pref['comment_caption'], $text, 'comment'); + +?> \ No newline at end of file diff --git a/e107_plugins/comment_menu/comment_menu_shortcodes.php b/e107_plugins/comment_menu/comment_menu_shortcodes.php new file mode 100644 index 000000000..100bc88a8 --- /dev/null +++ b/e107_plugins/comment_menu/comment_menu_shortcodes.php @@ -0,0 +1,73 @@ + e_sc -> parse_scbatch(__FILE__); + +/* +SC_BEGIN CM_ICON +return (defined("BULLET") ? "" : "bullet"); +SC_END + +SC_BEGIN CM_DATESTAMP +global $row; +$gen = new convert; +return $gen->convert_date($row['comment_datestamp'], "short"); +SC_END + +SC_BEGIN CM_HEADING +global $row; +return $row['comment_title']; +SC_END + +SC_BEGIN CM_URL_PRE +global $row; +return ($row['comment_url'] ? "" : ""); +SC_END + +SC_BEGIN CM_URL_POST +global $row; +return ($row['comment_url'] ? "" : ""); +SC_END + +SC_BEGIN CM_TYPE +global $row; +return $row['comment_type']; +SC_END + +SC_BEGIN CM_AUTHOR +global $row; +return $row['comment_author']; +SC_END + +SC_BEGIN CM_COMMENT +global $row, $menu_pref; +$COMMENT = ''; +if($menu_pref['comment_characters']>0){ + $COMMENT = $row['comment_comment']; + if (strlen($COMMENT) > $menu_pref['comment_characters']) + { + $COMMENT = substr($COMMENT, 0, $menu_pref['comment_characters']).$menu_pref['comment_postfix']; + } +} +return $COMMENT; +SC_END + +*/ +?> \ No newline at end of file diff --git a/e107_plugins/comment_menu/comment_menu_template.php b/e107_plugins/comment_menu/comment_menu_template.php new file mode 100644 index 000000000..24258de21 --- /dev/null +++ b/e107_plugins/comment_menu/comment_menu_template.php @@ -0,0 +1,38 @@ +"; +$sc_style['CM_AUTHOR']['post'] = ""; + +$sc_style['CM_DATESTAMP']['pre'] = " ".CM_L11." "; +$sc_style['CM_DATESTAMP']['post'] = ""; + +$sc_style['CM_COMMENT']['pre'] = ""; +$sc_style['CM_COMMENT']['post'] = "

    "; + +if (!isset($COMMENT_MENU_TEMPLATE)){ + $COMMENT_MENU_TEMPLATE = " + {CM_ICON} {CM_URL_PRE}{CM_TYPE} {CM_HEADING}{CM_URL_POST}
    + {CM_AUTHOR} {CM_DATESTAMP}
    + {CM_COMMENT}"; +} +?> \ No newline at end of file diff --git a/e107_plugins/comment_menu/config.php b/e107_plugins/comment_menu/config.php new file mode 100644 index 000000000..fb1cd450a --- /dev/null +++ b/e107_plugins/comment_menu/config.php @@ -0,0 +1,100 @@ +db_Update("core", "e107_value='$tmp' WHERE e107_name='menu_pref' "); + $ns->tablerender("", "
    ".CM_L10."
    "); +} + +$text = "
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ".CM_L3.": + +
    ".CM_L4.": + +
    ".CM_L5.": + +
    ".CM_L6.": + +
    ".CM_L7.": +
    +
    +
    "; +$ns->tablerender(CM_L8, $text); +require_once(e_ADMIN."footer.php"); +?> \ No newline at end of file diff --git a/e107_plugins/comment_menu/languages/English.php b/e107_plugins/comment_menu/languages/English.php new file mode 100644 index 000000000..22f02f850 --- /dev/null +++ b/e107_plugins/comment_menu/languages/English.php @@ -0,0 +1,29 @@ + diff --git a/e107_plugins/compliance_menu/compliance_menu.php b/e107_plugins/compliance_menu/compliance_menu.php new file mode 100644 index 000000000..d36417970 --- /dev/null +++ b/e107_plugins/compliance_menu/compliance_menu.php @@ -0,0 +1,11 @@ + + Valid XHTML 1.1!
    + Valid CSS! +
    "; +$caption = (file_exists(THEME."images/compliance_menu.png") ? " ".COMPLIANCE_L1 : COMPLIANCE_L1); +$ns->tablerender($caption, $text, 'compliance'); +?> \ No newline at end of file diff --git a/e107_plugins/compliance_menu/images/valid-xhtml11.png b/e107_plugins/compliance_menu/images/valid-xhtml11.png new file mode 100644 index 0000000000000000000000000000000000000000..6d305e7dffef621c85ba83fabd07f80b88a5c4f3 GIT binary patch literal 1916 zcmW-hc~leE9><3*M8y(ZAZ|b?+bBmERCFFFW@K}$m^YxnfK(j>=_pSbMR@`BV3bHl z5jxPPGwE)Cj1tF64!N&iD8Get-Aed;hxU9+t(& zPM$b(A^-rBSH?wQHcz&dm(ao16Wu@d*~~FZx>^bV&83q*Z*&3x`{lB45~HnuW3gH- z7Mm<)o5r!2%oeMeGMG#Tli6ybbSAUGV9*)NRs*Run5;U|sv~qdomOY!btbEpc1^r^d8uoYrWyYD}Tg@@kw@;|euzVo+X%aw?ov;c^vkpb?Hi zDHYE$I6EFV4TCcbqhjO+1;Q|LmPSa1)6j^T#tDXFXgN*O3{7d}uv&o-G^e9rT*0d3 zFs5L&B*e&Jxm>Ox2`vFJlufXlB2l@9reFnyQ51#9HF64LNRTEW9tROhqaY!YBwb_p@!$dFRU2(ayJ>MZ&LqQ)lNPwtLhoqoj#(-E8Hjq*>9^y2B-QLDEVnbp5f- ztK0(bB(u?u6|uM1H6#YsK}FutvWu9k_RPXz>G}IJ$plH@fS|QpsB1{QA2als)b=iG zc|QF1nAgvT zeoOJCg4dqgE-ZZiqw*U2pWO-lVQgZmwX$!&?B>ID9r{amU1u!Ow0%GW9;EG19}XSK zI?x+qx4nAyT!(6In#-(&@TDhOyta)UcqG#|y!%Txe6jI8L7Ti69~xG+dzDJdkA59? zJ^!~Kd!G5^mlVy*NGU(HMHS=^@f9nIQ;t4frC&05u&!mn;=+xwZc8kSUJbToH-NG` z3mpndH@&G$Lq4}9E-%R1bh4=_y(GdV_mWk7W$&k>vB947=NGeIEXUcgZCZJ+!zr*@*-LJ^nlOv@0J1gJ_Yu7l@u2wXUkrPeZ4JK zQGiZ$b1}x8YrE`htX|<5p}bdrIyTO$riIlriNX@~5N3Bq=?Zi=q(!5a_JD!urNv$8 zyGLIn-5r(mO|Q)_uWCJ??pW9?80I7X(e}`|7jjQcb*=3d>_gAFw~elwI;7Ozh?VZH zn|RT;vVFa`rLJGseJaTQI1p;jH^~}{l{(skem=an-hb^~$E2RA-h0lXo=%<0NpHu3 z{QT3jSLt8-*VzAXy0Pr9LZfTBhehx>G}NKpXOdsv9?y5aw|+@snJxAeVb|R!A6NC> zf0E}nVR1GnsG0BDGq9m(Pnh4y6<^t(UJnfjRv*cvUHpp#GxOY<|LyOx{rjNkmz}M- ziF31FjtpT(3s3zTlU(@ZSZ$y3W{|hR>X^~dr^YUy`%^SGz0xD?WZ)EaVN55M(P+2p zMalV^j~fOR7y9Y4vMEa%#*m(ft?K8ib23ypt;376^<|mo&3<^*lh$1oubcyF>K%#{ zqmlFH|2Oj5w5sN_dy?1QJ+iLnpWM^@0Eb7?hxD5%Yl_aM4!};G*LIkE|1@^#ce&8j z`D5I5Lgtap2X*t-j@uvY=cSI^OPKM;h@Zz&rO&~WzCOWe6&<&ns;hojVOLOgWT9kx zaHF{7=KY>GKm8t>TRtfLvMFR#uwz$KLEbT<%|~2O^y$pQaItglvkP z^<;PCofFLurYl}$87tpXA?@L%V2c{TH1dDXpLFu#9`RB}sijwo$ycs-W)$MW_1 z*EcO}ZQIC~9|o+9 Lj*q&4Y$*CaVjPI+ literal 0 HcmV?d00001 diff --git a/e107_plugins/compliance_menu/images/vcss.png b/e107_plugins/compliance_menu/images/vcss.png new file mode 100644 index 0000000000000000000000000000000000000000..9b2f596e016533327216d98a0a927738fe17384f GIT binary patch literal 1134 zcmeAS@N?(olHy`uVBq!ia0vp^5kM@@!3-or#C~03U|`e?@Ck7Ra+Q_kdEDnlhI%!W zMb4c&_g;@{HxGAjZ*NM+!7cOCYk@#Y{Pps{+}zwx_wR4FlUu4N92*~!s#T`6W<+- zt4%e$w+9&~i2E*D*W)T9Bhx(p?A&_0|7X(X^Ya7IW>?MPDaUzu zczTO0wr<^e|Jf%QG42CClNSR6E4d`dFZlmw6q^`8Jh0FrC=HPY3SEXN1j@jH0f@DT z;lF?am<8g&3^agg*jyz(n}LC8qNj^vNX4zUQ)`1SI|v-Rel?4G(T!h0t6h3r9Tx_% z{GPN=z+e1GN8qGw>eHn5|8FmNua|o1m5;W_zoO+QbMz<2znfQG#(ynM{=I#{0V!X> zqF)tO-~TK+p#QH~U+~Uxw*7OC?@4lzU=MuwAfY=*I-PyJf}6|jF4ry6#nK@bObtKJ z{jpr)a7XQvK=_v<_kY&OUtDf7N2Y`!=sAP5DASo0{WX7G;uf&=`Gs|Enroa;cP#bwBZgT0Vk8}Ij!pi@+JzOex~wA_|LQI>iZ4KOPMZj@RJmq z{=ckJgo`sg=^ee+rLf!@|1r#|1Qou-tz zozY_28jcOAqH_ZHT>9G+6r2tD{%tx^c*pF4-nNSOH_A#)UvDaE^>6pwzeB^b1utmshBn2mW1YZ#q&(r+Ne9lLHSPV z;lJMu*6nF1eX&Vu#au@n)2h{;1^hB;>x|=8`0r4N5Dq`3W>NpNuIHfS-r}72x2dtZ z|1vypS3P_!s?6%3q3f=mrP_V^@twUAXY`EwoTZxX&st-k^Kye`&fdVV(2iA`qSwCa zO3SD?y)^LM2F^-1=1_^hVN1d%c)e7=87<81^0{cK;`g>k^UAjGxu$SW%#%-OqR3cMOS7CD$Nw90jSF7TjZ+3b%7?`))PKP%lew!LZ} z9@4ntXMQ2~DY0cQL^+Gz9jsW~FI2w%Uw?1i^C{7@K5}j{esbPgg&e IbxsLQ074N#oB#j- literal 0 HcmV?d00001 diff --git a/e107_plugins/compliance_menu/languages/English.php b/e107_plugins/compliance_menu/languages/English.php new file mode 100644 index 000000000..badf88705 --- /dev/null +++ b/e107_plugins/compliance_menu/languages/English.php @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/e107_plugins/content/admin_content_config.php b/e107_plugins/content/admin_content_config.php new file mode 100644 index 000000000..7a295a299 --- /dev/null +++ b/e107_plugins/content/admin_content_config.php @@ -0,0 +1,566 @@ + db_Select($plugintable, "content_id,content_heading,content_parent", "content_id = '$del_id' "); + list($content_id, $content_heading, $content_parent) = $sql -> db_Fetch(); + + $checkarray = $aa -> getCategoryTree("", $content_id, TRUE); + unset($agc); //unset the globalised getCategoryTree array + $checkvalidparent = implode(",", array_keys($checkarray)); + $checkqry = " content_parent REGEXP '".$aa -> CONTENTREGEXP($checkvalidparent)."' "; + + //check if subcats present + if(count($array) > 1){ + //subcategories found don't delete + $checkermsg .= CONTENT_ADMIN_CAT_LAN_36."
    "; + $checksubcat = TRUE; + }else{ + $checkermsg .= CONTENT_ADMIN_CAT_LAN_39."
    "; + $checksubcat = FALSE; + } + + //check if items present + if($sql -> db_Count($plugintable, "(*)", "WHERE ".$checkqry." ")){ + //items found, don't delete + $checkermsg .= CONTENT_ADMIN_CAT_LAN_37."
    "; + $checkitems = TRUE; + }else{ + $checkermsg .= CONTENT_ADMIN_CAT_LAN_38."
    "; + $checkitems = FALSE; + } + + if($checksubcat == FALSE && $checkitems == FALSE){ + if($sql -> db_Delete($plugintable, "content_id='$del_id' ")){ + @unlink(e_PLUGIN."content/menus/content_".$content_heading."_menu.php"); + $message = CONTENT_ADMIN_CAT_LAN_23."
    "; + } + }else{ + $message = $checkermsg; + } +} + +if(isset($delete) && $delete == 'content'){ + if($sql -> db_Delete($plugintable, "content_id='$del_id' ")){ + $e107cache->clear($plugintable); + $message = CONTENT_ADMIN_ITEM_LAN_3; + } +} + +if(isset($delete) && $delete == 'submitted'){ + if($sql -> db_Delete($plugintable, "content_id='$del_id' ")){ + $e107cache->clear($plugintable); + $message = CONTENT_ADMIN_SUBMIT_LAN_8; + } +} + +//update options +if(isset($_POST['updateoptions'])){ + $content_pref = $aa -> UpdateContentPref($_POST['options_type']); + $message = CONTENT_ADMIN_CAT_LAN_22."

    "; + if($_POST['options_type'] != "0"){ + $message .= $aa -> CreateParentMenu($_POST['options_type']); + } + $e107cache->clear($plugintable); +} + +//update the inheritance of options +if(isset($_POST['updateinherit'])){ + foreach($_POST['id'] as $k=>$v){ + //get current + $sql -> db_Select($plugintable, "content_pref", "content_id='".intval($k)."' "); + $row = $sql -> db_Fetch(); + $content_pref = $eArrayStorage->ReadArray($row['content_pref']); + //assign or remove inherit option + if(isset($_POST['content_inherit']) && isset($_POST['content_inherit'][$k]) ){ + $content_pref['content_inherit'] = "1"; + }else{ + unset($content_pref['content_inherit']); + } + //update + $tmp = $eArrayStorage->WriteArray($content_pref); + $sql2 -> db_Update($plugintable, "content_pref='{$tmp}' WHERE content_id='".intval($k)."' "); + } + $message = CONTENT_ADMIN_CAT_LAN_22."

    "; + $e107cache->clear($plugintable); +} + +//update manager classes into preferences +if(isset($_POST['update_manager'])){ + $content_pref = $aa -> UpdateContentPref($_POST['options_type']); + $message = CONTENT_ADMIN_CAT_LAN_22."

    "; + $e107cache->clear($plugintable); +} + +//update page restriction classes into preferences +if(isset($_POST['update_restrict'])){ + $content_pref = $aa -> UpdateContentPref($_POST['options_type']); + $message = CONTENT_ADMIN_CAT_LAN_22."

    "; + $e107cache->clear($plugintable); +} + + +//pre-upload a new category icon in the create/edit category form +if(isset($_POST['uploadcaticon'])){ + + $pref['upload_storagetype'] = "1"; + require_once(e_HANDLER."upload_handler.php"); + $pathiconlarge = $_POST['iconpathlarge']; + $pathiconsmall = $_POST['iconpathsmall']; + $uploaded = file_upload($pathiconlarge); + + $icon = ""; + if($uploaded) { + $icon = $uploaded[0]['name']; + require_once(e_HANDLER."resize_handler.php"); + resize_image($pathiconlarge.$icon, $pathiconlarge.$icon, '48', "nocopy"); + resize_image($pathiconlarge.$icon, $pathiconsmall.$icon, '16', "copy"); + rename($pathiconsmall."thumb_".$icon , $pathiconsmall.$icon); + } + $message = ($icon ? CONTENT_ADMIN_CAT_LAN_58 : CONTENT_ADMIN_CAT_LAN_59); + +} + +if(isset($_POST['create_category'])){ + if($_POST['cat_heading'] && $_POST['parent'] != "none"){ + $adb -> dbCategory("create"); + }else{ + $message = CONTENT_ADMIN_ITEM_LAN_0; + } +} + +if(isset($_POST['update_category'])){ + if($_POST['cat_heading'] && $_POST['parent'] != "none"){ + $adb -> dbCategory("update"); + }else{ + $message = CONTENT_ADMIN_ITEM_LAN_0; + } +} + +if(isset($_POST['create_content'])){ + if($_POST['content_text'] && $_POST['content_heading'] && $_POST['content_author_name'] && $_POST['parent'] != "none"){ + //$adb -> dbContentCreate("admin"); + $adb -> dbContent("create", ""); + }else{ + $message = CONTENT_ADMIN_ITEM_LAN_0; + } +} + +if(isset($_POST['update_content'])){ + if($_POST['content_text'] && $_POST['content_heading'] && $_POST['content_author_name'] && $_POST['content_heading'] && $_POST['parent'] != "none"){ + //$adb -> dbContentUpdate("admin"); + $adb -> dbContent("update", ""); + }else{ + $message = CONTENT_ADMIN_ITEM_LAN_0; + } +} + +if(isset($_POST['update_order'])){ + if(isset($qs[1])){ + if(isset($qs[2])){ + $message = $adb -> dbSetOrder("all", "ci", $_POST['order']); + }else{ + $message = $adb -> dbSetOrder("all", "ai", $_POST['order']); + } + }else{ + $message = $adb -> dbSetOrder("all", "cc", $_POST['order']); + } +} + +if(isset($message)){ + $ns -> tablerender("", "
    ".$message."
    "); +} + +// ##### End -------------------------------------------------------------------------------------- + +if(!e_QUERY){ //show main categories + $aform -> show_manage_content("", "", ""); + require_once(e_ADMIN."footer.php"); + exit; +}else{ + $qs = explode(".", e_QUERY); + + //manage content items + if($qs[0] == "content" && is_numeric($qs[1]) ){ + $aform -> show_manage_content("", "", ""); + + //edit content item + }elseif($qs[0] == "content" && $qs[1] == "edit" && is_numeric($qs[2]) ){ + $newqs = array_reverse($qs); + if($newqs[0] == "cu"){ //item; update redirect + $mainparent = $aa -> getMainParent($qs[2]); + $message = CONTENT_ADMIN_ITEM_LAN_2."

    "; + $message .= CONTENT_ADMIN_ITEM_LAN_88." ".CONTENT_ADMIN_ITEM_LAN_90."
    "; + $message .= CONTENT_ADMIN_ITEM_LAN_89." ".CONTENT_ADMIN_ITEM_LAN_90."
    "; + $message .= CONTENT_ADMIN_ITEM_LAN_91." ".CONTENT_ADMIN_ITEM_LAN_90."
    "; + $message .= CONTENT_ADMIN_ITEM_LAN_124." ".CONTENT_ADMIN_ITEM_LAN_90.""; + + $ns -> tablerender("", "
    ".$message."
    "); + require_once(e_ADMIN."footer.php"); + exit; + } + $aform -> show_create_content("admin", $userid="", $username=""); + + //post submitted content item + }elseif($qs[0] == "content" && $qs[1] == "sa" && is_numeric($qs[2]) ){ + $newqs = array_reverse($qs); + if($newqs[0] == "cu"){ //item; submit post / update redirect + $mainparent = $aa -> getMainParent($qs[2]); + $message = CONTENT_ADMIN_ITEM_LAN_117."

    "; + $message .= CONTENT_ADMIN_ITEM_LAN_88." ".CONTENT_ADMIN_ITEM_LAN_90."
    "; + $message .= CONTENT_ADMIN_ITEM_LAN_89." ".CONTENT_ADMIN_ITEM_LAN_90."
    "; + $message .= CONTENT_ADMIN_ITEM_LAN_91." ".CONTENT_ADMIN_ITEM_LAN_90."
    "; + $message .= CONTENT_ADMIN_ITEM_LAN_124." ".CONTENT_ADMIN_ITEM_LAN_90.""; + $ns -> tablerender("", "
    ".$message."
    "); + require_once(e_ADMIN."footer.php"); + exit; + } + $aform -> show_create_content("sa", $userid="", $username=""); + + //create content item + }elseif($qs[0] == "content" && $qs[1] == "create" ){ + $newqs = array_reverse($qs); + if($newqs[0] == "cc"){ //item; create redirect + $mainparent = $aa -> getMainParent($qs[2]); + $message = CONTENT_ADMIN_ITEM_LAN_1."

    "; + $message .= CONTENT_ADMIN_ITEM_LAN_88." ".CONTENT_ADMIN_ITEM_LAN_90."
    "; + $message .= CONTENT_ADMIN_ITEM_LAN_89." ".CONTENT_ADMIN_ITEM_LAN_90."
    "; + $ns -> tablerender("", "
    ".$message."
    "); + require_once(e_ADMIN."footer.php"); + exit; + } + $aform -> show_create_content("admin", $userid="", $username=""); + + + + //order : view categories + }elseif($qs[0] == "order" && !isset($qs[1])){ + $aform -> show_order(); + + //order global items of parent='2' + }elseif($qs[0] == "order" && is_numeric($qs[1]) && !isset($qs[2]) ){ + $aform -> show_content_order("ai"); + + //increase order of global items + }elseif($qs[0] == "order" && is_numeric($qs[1]) && $qs[2] == "inc" && isset($qs[3]) ){ + $message = $adb -> dbSetOrder("inc", "ai", $qs[3]); + $ns -> tablerender("", "
    ".$message."
    "); + $aform -> show_content_order("ai"); + + //decrease order of global items + }elseif($qs[0] == "order" && is_numeric($qs[1]) && $qs[2] == "dec" && isset($qs[3]) ){ + $message = $adb -> dbSetOrder("dec", "ai", $qs[3]); + $ns -> tablerender("", "
    ".$message."
    "); + $aform -> show_content_order("ai"); + + //order items with parent=2 or category='5' + }elseif($qs[0] == "order" && is_numeric($qs[1]) && is_numeric($qs[2]) && !isset($qs[3]) ){ + $aform -> show_content_order("ci"); + + //increase order of items in category + }elseif($qs[0] == "order" && is_numeric($qs[1]) && is_numeric($qs[2]) && $qs[3] == "inc" && isset($qs[4]) ){ + $message = $adb -> dbSetOrder("inc", "ci", $qs[4]); + $ns -> tablerender("", "
    ".$message."
    "); + $aform -> show_content_order("ci"); + + //decrease order of items in category + }elseif($qs[0] == "order" && is_numeric($qs[1]) && is_numeric($qs[2]) && $qs[3] == "dec" && isset($qs[4]) ){ + $message = $adb -> dbSetOrder("dec", "ci", $qs[4]); + $ns -> tablerender("", "
    ".$message."
    "); + $aform -> show_content_order("ci"); + + //increase category order + }elseif($qs[0] == "order" && $qs[1] == "inc" && isset($qs[2]) ){ + $message = $adb -> dbSetOrder("inc", "cc", $qs[2]); + $ns -> tablerender("", "
    ".$message."
    "); + $aform -> show_order("admin"); + + //decrease category order + }elseif($qs[0] == "order" && $qs[1] == "dec" && isset($qs[2]) ){ + $message = $adb -> dbSetOrder("dec", "cc", $qs[2]); + $ns -> tablerender("", "
    ".$message."
    "); + $aform -> show_order("admin"); + + + + + }elseif($qs[0] == "submitted" && !isset($qs[1]) ){ + $aform -> show_submitted(); + + + + + }elseif($qs[0] == "option" && !isset($qs[1]) ){ + $aform -> show_options(); + + }elseif($qs[0] == "option" && isset($qs[1]) && (is_numeric($qs[1]) || $qs[1] == "default") ){ + $aform -> show_options_cat(); + + + + + //category content manager : choose category + }elseif($qs[0] == "manager" && !isset($qs[1]) ){ + if(!getperms("0")){ header("location:".e_SELF); exit; } + //$aform -> show_admin_contentmanager(); + $aform -> manager(); + + //category content manager : view contentmanager + }elseif($qs[0] == "manager" && isset($qs[1]) && is_numeric($qs[1]) ){ + if(!getperms("0")){ header("location:".e_SELF); exit; } + if(isset($qs[2])){ + $message = $adb -> dbAssignAdmins("admin", intval($qs[1]), $qs[2]); + $ns -> tablerender("", "
    ".$message."
    "); + } + $aform -> manager_category(); + + + + + //overview all categories + }elseif($qs[0] == "cat" && !isset($qs[1]) ){ + $aform -> manage_cat(); + + //create category + }elseif($qs[0] == "cat" && $qs[1] == "create" ){ + $newqs = array_reverse($qs); + if($newqs[0] == "pc"){ //category; create redirect + $message = CONTENT_ADMIN_CAT_LAN_11."

    "; + $message .= "

    ".CONTENT_ADMIN_CAT_LAN_50."

    "; + $message .= " + ".CONTENT_ADMIN_CAT_LAN_44." ".CONTENT_ADMIN_CAT_LAN_43."
    + ".CONTENT_ADMIN_CAT_LAN_42." ".CONTENT_ADMIN_CAT_LAN_43."
    + "; + $ns -> tablerender("", "
    ".$message."
    "); + require_once(e_ADMIN."footer.php"); + exit; + } + $aform -> show_create_category(); + + //edit category + }elseif($qs[0] == "cat" && $qs[1] == "edit" && is_numeric($qs[2]) ){ + $newqs = array_reverse($qs); + if($newqs[0] == "pu"){ //category; update redirect + $message = CONTENT_ADMIN_CAT_LAN_12."

    + ".CONTENT_ADMIN_CAT_LAN_42." ".CONTENT_ADMIN_CAT_LAN_43."
    + ".CONTENT_ADMIN_CAT_LAN_53." ".CONTENT_ADMIN_CAT_LAN_43."
    "; + $ns -> tablerender("", "
    ".$message."
    "); + require_once(e_ADMIN."footer.php"); + exit; + } + $aform -> show_create_category(); + + + + //restrict : choose category + }elseif($qs[0] == "restrict" && !isset($qs[1]) ){ + //if(!getperms("0")){ header("location:".e_SELF); exit; } + $aform -> restrict(); + + //restrict : view restrict for main parent + }elseif($qs[0] == "restrict" && isset($qs[1]) && is_numeric($qs[1]) ){ + //if(!getperms("0")){ header("location:".e_SELF); exit; } + $aform -> restrict_category(); + } + +} + +// ##### End -------------------------------------------------------------------------------------- + + +// ##### Display options -------------------------------------------------------------------------- +function admin_content_config_adminmenu(){ + + global $sql, $plugintable, $aa; + + //toggle to show categories in admin right hand menu + $showadmincat = TRUE; + + if(e_QUERY){ + $qs = explode(".", e_QUERY); + } + + if(isset($qs[0]) && $qs[0] == "cat" && isset($qs[1]) && $qs[1] == "create"){ + $act = $qs[0].".".$qs[1]; + + }elseif(isset($qs[0]) && $qs[0] == "content" && isset($qs[1]) && $qs[1] == "create"){ + $act = $qs[0].".".$qs[1]; + + }else{ + $act = (isset($qs[0]) ? $qs[0] : ""); + } + + if($act==""){$act="content";} + + $var['content']['text'] = CONTENT_ADMIN_MENU_LAN_0; + $var['content']['link'] = e_SELF; + + $var['content.create']['text'] = CONTENT_ADMIN_MENU_LAN_1; + $var['content.create']['link'] = e_SELF."?content.create"; + + $var['cat']['text'] = CONTENT_ADMIN_MENU_LAN_2; + $var['cat']['link'] = e_SELF."?cat"; + + $var['cat.create']['text'] = CONTENT_ADMIN_MENU_LAN_3; + $var['cat.create']['link'] = e_SELF."?cat.create"; + + $var['order']['text'] = CONTENT_ADMIN_MENU_LAN_15; + $var['order']['link'] = e_SELF."?order"; + + $var['option']['text'] = CONTENT_ADMIN_MENU_LAN_6; + $var['option']['link'] = e_SELF."?option"; + + if(getperms("0")){ + $var['manager']['text'] = CONTENT_ADMIN_MENU_LAN_17; + $var['manager']['link'] = e_SELF."?manager"; + } + + if($submittedcontents = $sql -> db_Count($plugintable, "(*)", "WHERE content_refer ='sa' ")){ + $var['submitted']['text'] = CONTENT_ADMIN_MENU_LAN_4." (".$submittedcontents.")"; + $var['submitted']['link'] = e_SELF."?submitted"; + } + + show_admin_menu(CONTENT_ADMIN_MENU_LAN_6, $act,$var); + + if(isset($qs[0]) && $qs[0] == "option" && isset($qs[1])){ + unset($var); + $var=array(); + $var['creation']['text'] = CONTENT_ADMIN_MENU_LAN_7; + $var['catcreation']['text'] = CONTENT_ADMIN_MENU_LAN_23; + $var['submission']['text'] = CONTENT_ADMIN_MENU_LAN_8; + $var['paththeme']['text'] = CONTENT_ADMIN_MENU_LAN_9; + $var['general']['text'] = CONTENT_ADMIN_MENU_LAN_10; + $var['menu']['text'] = CONTENT_ADMIN_MENU_LAN_14; + + $sql = new db; + $category_total = $sql -> db_Select($plugintable, "content_heading", "content_id='".$qs[1]."' "); + list($content_heading) = $sql -> db_Fetch(); + + show_admin_menu(CONTENT_ADMIN_MENU_LAN_6.": ".$content_heading."", $act, $var, TRUE); + + unset($var); + $var=array(); + $var['recentpages']['text'] = CONTENT_ADMIN_MENU_LAN_11; + $var['catpages']['text'] = CONTENT_ADMIN_MENU_LAN_12; + $var['contentpages']['text'] = CONTENT_ADMIN_MENU_LAN_13; + $var['authorpage']['text'] = CONTENT_ADMIN_MENU_LAN_18; + $var['archivepage']['text'] = CONTENT_ADMIN_MENU_LAN_16; + $var['toppage']['text'] = CONTENT_ADMIN_MENU_LAN_20; + $var['scorepage']['text'] = CONTENT_ADMIN_MENU_LAN_22; + show_admin_menu(CONTENT_ADMIN_MENU_LAN_21.": ".$content_heading."", $act, $var, TRUE); + + }else{ + + if($showadmincat){ + $sql2 = new db; + if($category_total = $sql2 -> db_Select($plugintable, "content_id, content_heading", "content_parent='0' ")){ + while($row = $sql2 -> db_Fetch()){ + + unset($var); + $var=array(); + + $array = $aa -> getCategoryTree("", $row['content_id'], FALSE); //get all categories from each main parent + $newarray = array_merge_recursive($array); + + $newparent=array(); + for($a=0;$a $value){ + $var['c'.$key]['text'] = $value; + $var['c'.$key]['link'] = e_SELF."?content.".$key; + } + if( isset($qs[0]) && $qs[0] == "content" && isset($qs[1]) && $qs[1] == "create"){ + $act = ""; + }elseif( isset($qs[0]) && $qs[0] == "cat" && isset($qs[1]) && ($qs[1] == "create" || $qs[1] == "edit") ){ + $act = ""; + }elseif( isset($qs[0]) && $qs[0] == "order" ){ + $act = ""; + }elseif( isset($qs[0]) && $qs[0] == "manager" ){ + $act = ""; + }else{ + if(isset($qs[0]) && isset($qs[1]) ){ + $act = "c".$qs[1]; + }else{ + $act = "c"; + } + } + + show_admin_menu(CONTENT_ADMIN_MENU_LAN_5." : ".$row['content_heading']."", $act, $var); + } + } + } + } + +} +// ##### End -------------------------------------------------------------------------------------- + +require_once(e_ADMIN."footer.php"); + +?> \ No newline at end of file diff --git a/e107_plugins/content/content.js b/e107_plugins/content/content.js new file mode 100644 index 000000000..e69de29bb diff --git a/e107_plugins/content/content.php b/e107_plugins/content/content.php new file mode 100644 index 000000000..100e2be25 --- /dev/null +++ b/e107_plugins/content/content.php @@ -0,0 +1,1470 @@ + setPageTitle(); + +require_once(HEADERF); + +//post comment +if(isset($_POST['commentsubmit'])){ + if(!is_object($sql)){ $sql = new db; } + if(!$sql -> db_Select($plugintable, "content_comment", "content_id='".intval($qs[1])."' ")){ + header("location:".e_BASE."index.php"); exit; + }else{ + $row = $sql -> db_Fetch(); + if(ANON === TRUE || USER === TRUE){ + //enter_comment($author_name, $comment, $table, $id, $pid, $subject) + $author = ($_POST['author_name'] ? $_POST['author_name'] : USERNAME); + $pid = "0"; + $rated = (isset($_POST['rateindex']) ? $_POST['rateindex'] : ""); + $cobj -> enter_comment($author, $_POST['comment'], $plugintable, $qs[1], $pid, $_POST['subject'], $rated); + if($qs[0] == "content" && is_numeric($qs[1])){ + if(!isset($qs[2])){ $cacheid = 1; }else{ $cacheid = $qs[2]; } + $e107cache->clear("comment.$plugintable.$qs[1].$cacheid"); + $e107cache->clear("$plugintable.content.$qs[1].$cacheid"); + } + if($qs[0] == "cat" && is_numeric($qs[1])){ + $e107cache->clear("comment.$plugintable.$qs[1]"); + } + $main = $aa -> getMainParent( (is_numeric($qs[1]) ? $qs[1] : $qs[2]) ); + $e107cache->clear("$plugintable.recent.$main"); + $e107cache->clear("$plugintable.cat.list.$main"); + $e107cache->clear("$plugintable.cat.$main"); + $e107cache->clear("$plugintable.author.$main"); + $e107cache->clear("$plugintable.top.$main"); + $e107cache->clear("$plugintable.score.$main"); + } + } +} + +//check active keyword search +$resultmenu = FALSE; +$searchfieldname = "searchfield_page"; +$searchfieldmenuname = "searchfieldmenu_menu"; +if(isset($_POST['searchsubmit']) || isset($_POST[$searchfieldname]) || isset($_POST[$searchfieldmenuname])){ //if active keyword search + if(isset($_POST[$searchfieldname]) && $_POST[$searchfieldname] != "" && $_POST[$searchfieldname] != CONTENT_LAN_18){ + $resultmenu = TRUE; + $searchkeyword = $_POST[$searchfieldname]; + } + if(isset($_POST[$searchfieldmenuname]) && $_POST[$searchfieldmenuname] != "" && $_POST[$searchfieldmenuname] != CONTENT_LAN_18){ + $resultmenu = TRUE; + $searchkeyword = $_POST[$searchfieldmenuname]; + } + //show search results + if($resultmenu == TRUE){ show_content_search_result($searchkeyword); } +} + +// ##### REDIRECTION MANAGEMENT ------------------------------------------------------- +//parent overview +if(!e_QUERY){ + show_content(); +}else{ + //recent of parent='X' + if( $qs[0] == "recent" && is_numeric($qs[1]) && intval($qs[1])>0 && ( !isset($qs[2]) || substr($qs[2],0,5) == "order" ) ){ + show_content_recent(); + + //item + }elseif( $qs[0] == "content" && is_numeric($qs[1]) && intval($qs[1])>0 ){ + show_content_item(); + + //all categories of parent='X' + }elseif( $qs[0] == "cat" && $qs[1] == "list" && is_numeric($qs[2]) && intval($qs[2])>0 && !isset($qs[3]) ){ + show_content_cat_all(); + + //category of parent='X' + }elseif( $qs[0] == "cat" && is_numeric($qs[1]) && intval($qs[1])>0 && (!isset($qs[2]) || $qs[2] == "view" || $qs[2] == "comment" || substr($qs[2],0,5) == "order") ){ + + if( isset($qs[2]) && $qs[2] == "comment" ){ + show_content_cat("comment"); + }elseif( isset($qs[2]) && $qs[2] == "view" ){ + show_content_cat('view'); + }else{ + show_content_cat(); + } + + //top rated of parent='X' + }elseif( $qs[0] == "top" && is_numeric($qs[1]) && intval($qs[1])>0 && !isset($qs[2]) ){ + show_content_top(); + + //top score of parent='X' + }elseif( $qs[0] == "score" && is_numeric($qs[1]) && intval($qs[1])>0 ){ + // && !isset($qs[2]) + show_content_score(); + + //authorlist of parent='X' + }elseif( $qs[0] == "author" && $qs[1] == "list" && is_numeric($qs[2]) && intval($qs[2])>0 && ( !isset($qs[3]) || substr($qs[3],0,5) == "order" ) ){ + show_content_author_all(); + + //authorlist of content_id='X' + }elseif( $qs[0] == "author" && is_numeric($qs[1]) && intval($qs[1])>0 && (!isset($qs[2]) || substr($qs[2],0,5) == "order") ){ + show_content_author(); + + //archive of parent='X' + }elseif( $qs[0] == "list" && is_numeric($qs[1]) && intval($qs[1])>0 ){ + show_content_archive(); + }else{ + //js_location(e_SELF); + header("location:".e_SELF); + } +} +// ##### ------------------------------------------------------------------------------ + +// ##### CONTENT SEARCH MENU ---------------------------- +function show_content_search_menu($mode, $mainparent){ + global $qs, $plugindir, $content_shortcodes, $tp, $ns, $rs, $aa; + global $plugintable, $gen, $content_pref; + global $CONTENT_SEARCH_TABLE_SELECT, $CONTENT_SEARCH_TABLE_ORDER, $CONTENT_SEARCH_TABLE_KEYWORD; + + if( (isset($content_pref["content_navigator_{$mode}"]) && $content_pref["content_navigator_{$mode}"]) || (isset($content_pref["content_search_{$mode}"]) && $content_pref["content_search_{$mode}"]) || (isset($content_pref["content_ordering_{$mode}"]) && $content_pref["content_ordering_{$mode}"]) ){ + + if(!isset($CONTENT_SEARCH_TABLE)){ + if(!$content_pref["content_theme"]){ + require_once($plugindir."templates/default/content_search_template.php"); + }else{ + if(is_readable($tp->replaceConstants($content_pref["content_theme"])."content_search_template.php")){ + require_once($tp->replaceConstants($content_pref["content_theme"])."content_search_template.php"); + }else{ + require_once($plugindir."templates/default/content_search_template.php"); + } + } + } + if(isset($content_pref["content_navigator_{$mode}"]) && $content_pref["content_navigator_{$mode}"]){ + $CONTENT_SEARCH_TABLE_SELECT = $aa -> showOptionsSelect("page", $mainparent); + } + if(isset($content_pref["content_search_{$mode}"]) && $content_pref["content_search_{$mode}"]){ + $CONTENT_SEARCH_TABLE_KEYWORD = $aa -> showOptionsSearch("page", $mainparent); + } + if(isset($content_pref["content_ordering_{$mode}"]) && $content_pref["content_ordering_{$mode}"]){ + $CONTENT_SEARCH_TABLE_ORDER = $aa -> showOptionsOrder("page", $mainparent); + } + + $text = $tp -> parseTemplate($CONTENT_SEARCH_TABLE, FALSE, $content_shortcodes); + + if($content_pref["content_searchmenu_rendertype"] == "2"){ + $caption = CONTENT_LAN_77; + $ns -> tablerender($caption, $text); + }else{ + echo $text; + } + } + return TRUE; + +} + +function show_content_search_result($searchkeyword){ + global $row, $qs, $content_shortcodes, $ns, $rs, $tp, $plugindir, $plugintable, $gen, $aa, $content_pref, $datequery, $gen, $mainparent, $content_icon_path; + + $mainparent = $aa -> getMainParent( (is_numeric($qs[1]) ? $qs[1] : intval($qs[2])) ); + $content_pref = $aa -> getContentPref($mainparent); + $array = $aa -> getCategoryTree("", intval($qs[1]), TRUE); + $validparent = implode(",", array_keys($array)); + $qry = " content_parent REGEXP '".$aa -> CONTENTREGEXP($validparent)."' "; + $searchkeyword = $tp -> toDB($searchkeyword); + $qry .= " AND (content_heading REGEXP '".$searchkeyword."' OR content_subheading REGEXP '".$searchkeyword."' OR content_summary REGEXP '".$searchkeyword."' OR content_text REGEXP '".$searchkeyword."' ) "; + $content_icon_path = $tp -> replaceConstants($content_pref["content_icon_path"]); + + $sqlsr = ""; + if(!is_object($sqlsr)){ $sqlsr = new db; } + if(!$sqlsr -> db_Select($plugintable, "content_id, content_heading, content_subheading, content_text, content_author, content_icon, content_datestamp", " ".$qry." ".$datequery." ORDER BY content_heading")){ + $textsr = "
    ".CONTENT_SEARCH_LAN_0."
    "; + }else{ + if(!isset($CONTENT_SEARCHRESULT_TABLE)){ + if(!$content_pref["content_theme"]){ + require_once($plugindir."templates/default/content_searchresult_template.php"); + }else{ + if(is_readable($tp->replaceConstants($content_pref["content_theme"])."content_searchresult_template.php")){ + require_once($tp->replaceConstants($content_pref["content_theme"])."content_searchresult_template.php"); + }else{ + require_once($plugindir."templates/default/content_searchresult_template.php"); + } + } + } + $content_searchresult_table_string = ""; + if(!is_object($gen)){ $gen = new convert; } + while($row = $sqlsr -> db_Fetch()){ + + $row['content_heading'] = parsesearch($row['content_heading'], $searchkeyword, "full"); + $row['content_subheading'] = parsesearch($row['content_subheading'], $searchkeyword, "full"); + $row['content_text'] = parsesearch($row['content_text'], $searchkeyword, ""); + + $content_searchresult_table_string .= $tp -> parseTemplate($CONTENT_SEARCHRESULT_TABLE, FALSE, $content_shortcodes); + } + $textsr = $CONTENT_SEARCHRESULT_TABLE_START.$content_searchresult_table_string.$CONTENT_SEARCHRESULT_TABLE_END; + } + $caption = CONTENT_LAN_20; + $ns -> tablerender($caption, $textsr); + require_once(FOOTERF); + exit; +} + +function parsesearch($text, $match, $amount){ + $text = strip_tags($text); + $temp = stristr($text,$match); + $pos = strlen($text)-strlen($temp); + + if($amount == "full"){ + }else{ + if($pos < 140){ + $text = "...".substr($text, 0, 140)."..."; + }else{ + $text = "...".substr($text, ($pos-140), 280)."..."; + } + } + $text = preg_replace("/".$match."/i", "$match", $text); + return($text); +} + +// ##### CONTENT CACHE PRE ------------------------------ +function CachePre($cachestring=''){ + global $e107cache; + if($cache = $e107cache->retrieve($cachestring)){ + return $cache; + }else{ + ob_start(); + } +} +// ##### CONTENT CACHE POST ------------------------------ +function CachePost($cachestring=''){ + global $pref, $e107cache; + if($pref['cachestatus']){ + $cache = ob_get_contents(); + $e107cache->set($cachestring, $cache); + } + ob_end_flush(); // dump collected data +} + +// ##### CONTENT TYPE LIST ------------------------------ +function show_content(){ + global $qs, $content_shortcodes, $ns, $plugintable, $sql, $aa, $e107cache, $tp, $pref, $content_pref, $content_cat_icon_path_large, $content_cat_icon_path_small, $datequery, $content_icon_path, $eArrayStorage, $contenttotal, $row; + + if(is_readable(e_THEME.$pref['sitetheme']."/content/content_type_template.php")){ + require_once(e_THEME.$pref['sitetheme']."/content/content_type_template.php"); + }else{ + require_once(e_PLUGIN."content/templates/content_type_template.php"); + } + + $cachestr = "$plugintable.typelist"; + $cachecheck = CachePre($cachestr); + if($cachecheck){ + echo $cachecheck; + return; + } + if(!is_object($sql)){ $sql = new db; } + if(!$sql -> db_Select($plugintable, "*", "content_parent = '0' AND content_class REGEXP '".e_CLASS_REGEXP."' ".$datequery." ORDER BY round(content_order)")){ + $text .= "
    ".CONTENT_LAN_21."
    "; + }else{ + + $sql2 = ""; + $content_type_table_string = ""; + $plist = $sql->db_getList(); + foreach($plist as $row) + { + if(!is_object($sql2)){ $sql2 = new db; } + + $content_pref = $eArrayStorage->ReadArray($row['content_pref']); + $content_pref["content_cat_icon_path_large"] = ($content_pref["content_cat_icon_path_large"] ? $content_pref["content_cat_icon_path_large"] : "{e_PLUGIN}content/images/cat/48/" ); + $content_pref["content_cat_icon_path_small"] = ($content_pref["content_cat_icon_path_small"] ? $content_pref["content_cat_icon_path_small"] : "{e_PLUGIN}content/images/cat/16/" ); + $content_cat_icon_path_large = $tp->replaceConstants($content_pref["content_cat_icon_path_large"]); + $content_cat_icon_path_small = $tp->replaceConstants($content_pref["content_cat_icon_path_small"]); + $content_icon_path = $tp->replaceConstants($content_pref["content_icon_path"]); + + $array = $aa -> getCategoryTree("", $row['content_id'], TRUE); + $validparent = implode(",", array_keys($array)); + $qry = " content_parent REGEXP '".$aa -> CONTENTREGEXP($validparent)."' "; + $contenttotal = $sql2 -> db_Count($plugintable, "(*)", "WHERE content_refer != 'sa' AND ".$qry." ".$datequery." AND content_class REGEXP '".e_CLASS_REGEXP."'" ); + $content_type_table_string .= $tp -> parseTemplate($CONTENT_TYPE_TABLE, FALSE, $content_shortcodes); + } + + $SUBMIT_LINE = FALSE; + $submit = FALSE; + $sql3 = ""; + if(!is_object($sql3)){ $sql3 = new db; } + if($sql3 -> db_Select($plugintable, "content_id, content_pref", "content_parent = '0' ".$datequery." ORDER BY content_parent")){ + while($row = $sql3 -> db_Fetch()){ + if(isset($row['content_pref']) && $row['content_pref']){ + $content_pref = $eArrayStorage->ReadArray($row['content_pref']); + } + if($content_pref["content_submit"] && check_class($content_pref["content_submit_class"])){ + $submit = TRUE; + break; + } + } + if($submit === TRUE){ + $content_type_table_string .= $CONTENT_TYPE_TABLE_LINE; + $content_type_table_string .= $tp -> parseTemplate($CONTENT_TYPE_TABLE_SUBMIT, FALSE, $content_shortcodes); + $SUBMIT_LINE = TRUE; + } + } + + if(USERID){ + $personalmanagercheck = FALSE; + $array = $aa -> getCategoryTree("", "", TRUE); + $catarray = array_keys($array); + $qry = ""; + foreach($catarray as $catid){ + $qry .= " content_id='".$catid."' || "; + } + $qry = substr($qry,0,-3); + if($sql -> db_Select($plugintable, "content_id, content_heading, content_pref", " ".$qry." ")){ + while($row = $sql -> db_Fetch()){ + if(isset($row['content_pref']) && $row['content_pref']){ + $content_pref = $eArrayStorage->ReadArray($row['content_pref']); + } + if( (isset($content_pref["content_manager_approve"]) && check_class($content_pref["content_manager_approve"])) || (isset($content_pref["content_manager_personal"]) && check_class($content_pref["content_manager_personal"])) || (isset($content_pref["content_manager_category"]) && check_class($content_pref["content_manager_category"])) ){ + $personalmanagercheck = TRUE; + break; + } + } + } + if($personalmanagercheck == TRUE){ + if($SUBMIT_LINE != TRUE){ + $content_type_table_string .= $CONTENT_TYPE_TABLE_LINE; + } + $content_type_table_string .= $tp -> parseTemplate($CONTENT_TYPE_TABLE_MANAGER, FALSE, $content_shortcodes); + } + } + $text = $CONTENT_TYPE_TABLE_START.$content_type_table_string.$CONTENT_TYPE_TABLE_END; + } + $caption = CONTENT_LAN_22; + $ns -> tablerender($caption, $text); + $cachecheck = CachePost($cachestr); +} + +// ##### CONTENT ARCHIVE ------------------------------------------ +function show_content_archive(){ + global $row, $ns, $plugindir, $plugintable, $sql, $aa, $rs, $e107cache, $tp, $pref, $content_pref, $cobj; + global $qs, $searchkeyword, $nextprevquery, $from, $number, $mainparent, $content_shortcodes; + global $CONTENT_ARCHIVE_TABLE, $CONTENT_ARCHIVE_TABLE_START, $datequery, $CONTENT_ARCHIVE_TABLE_LETTERS; + global $CONTENT_SEARCH_TABLE_SELECT, $CONTENT_SEARCH_TABLE_ORDER, $CONTENT_SEARCH_TABLE_KEYWORD, $CONTENT_ARCHIVE_TABLE_AUTHOR; + + $mainparent = $aa -> getMainParent(intval($qs[1])); + $content_pref = $aa -> getContentPref($mainparent); + + show_content_search_menu("archive", $mainparent); //show navigator/search/order menu + + if(!isset($CONTENT_ARCHIVE_TABLE)){ + if(!$content_pref["content_theme"]){ + require_once($plugindir."templates/default/content_archive_template.php"); + }else{ + if(is_readable($tp->replaceConstants($content_pref["content_theme"])."content_archive_template.php")){ + require_once($tp->replaceConstants($content_pref["content_theme"])."content_archive_template.php"); + }else{ + require_once($plugindir."templates/default/content_archive_template.php"); + } + } + } + + $cachestr = "$plugintable.archive.$qs[1]"; + $cachecheck = CachePre($cachestr); + if($cachecheck){ + echo $cachecheck; + return; + } + $text = ""; + $array = $aa -> getCategoryTree("", $mainparent, TRUE); + $validparent = implode(",", array_keys($array)); + $qry = " content_parent REGEXP '".$aa -> CONTENTREGEXP($validparent)."' "; + $number = (isset($content_pref["content_archive_nextprev_number"]) && $content_pref["content_archive_nextprev_number"] ? $content_pref["content_archive_nextprev_number"] : "30"); + $order = $aa -> getOrder(); + $nextprevquery = (isset($content_pref["content_archive_nextprev"]) && $content_pref["content_archive_nextprev"] ? "LIMIT ".intval($from).",".intval($number) : ""); + $sql1 = new db; + + if(isset($content_pref["content_archive_letterindex"]) && $content_pref["content_archive_letterindex"]){ + $distinctfirstletter = $sql -> db_Select($plugintable, " DISTINCT(content_heading) ", "content_refer != 'sa' AND ".$qry." ".$datequery." AND content_class REGEXP '".e_CLASS_REGEXP."' ORDER BY content_heading ASC "); + while($row = $sql -> db_Fetch()){ + $head = $tp->toHTML($row['content_heading'], TRUE); + if(ord($head) < 128) { + $head_sub = strtoupper(substr($head,0,1)); + }else{ + $head_sub = substr($head,0,2); + } + $arrletters[] = $head_sub; + } + $arrletters = array_unique($arrletters); + $arrletters = array_values($arrletters); + sort($arrletters); + + if ($distinctfirstletter > 1){ + $CONTENT_ARCHIVE_TABLE_LETTERS = "
    "; + $int=TRUE; + for($i=0;$i0-9 "; + } + $int=FALSE; + }else{ + if(isset($qs[2]) && strtoupper($qs[2]) == strtoupper($arrletters[$i])){ + $class = 'nextprev_current'; + }else{ + $class = 'nextprev_link'; + } + $CONTENT_ARCHIVE_TABLE_LETTERS .= "".strtoupper($arrletters[$i])." "; + } + } + if(!isset($qs[2]) || (isset($qs[2]) && strtolower($qs[2])=='all') ){ + $class = 'nextprev_current'; + }else{ + $class = 'nextprev_link'; + } + $CONTENT_ARCHIVE_TABLE_LETTERS .= "ALL "; + $CONTENT_ARCHIVE_TABLE_LETTERS .= ""; + } + //check letter + if(isset($qs[2])){ + if($qs[2] == 'all'){ + $qry .= ''; + }elseif(strlen($qs[2]) == 1 && $qs[2] == '0'){ + $qry .= " AND content_heading NOT REGEXP '^[[:alpha:]]' "; + }elseif(strlen($qs[2]) == 1 && !is_numeric($qs[2]) ){ + $qry .= " AND content_heading LIKE '".$tp->toDB($qs[2])."%' "; + }else{ + $qry .= ''; + } + } + } + $CONTENT_ARCHIVE_TABLE_START = $tp -> parseTemplate($CONTENT_ARCHIVE_TABLE_START, FALSE, $content_shortcodes); + + $contenttotal = $sql1 -> db_Count($plugintable, "(*)", "WHERE content_refer !='sa' AND ".$qry." ".$datequery." AND content_class REGEXP '".e_CLASS_REGEXP."' "); + if($from > $contenttotal-1){ header("location:".e_SELF); exit; } + + if($item = $sql1 -> db_Select($plugintable, "*", "content_refer !='sa' AND ".$qry." ".$datequery." AND content_class REGEXP '".e_CLASS_REGEXP."' ".$order." ".$nextprevquery )){ + $content_archive_table_string = ""; + while($row = $sql1 -> db_Fetch()){ + $CONTENT_ARCHIVE_TABLE_AUTHOR = $aa -> prepareAuthor("archive", $row['content_author'], $row['content_id']); + $content_archive_table_string .= $tp -> parseTemplate($CONTENT_ARCHIVE_TABLE, FALSE, $content_shortcodes); + } + $text .= $CONTENT_ARCHIVE_TABLE_START.$content_archive_table_string.$CONTENT_ARCHIVE_TABLE_END; + } + $text = $aa -> getCrumbPage("archive", $array, $mainparent).$text; + //$caption = CONTENT_LAN_84; + $caption = $content_pref['content_archive_caption']; + $ns->tablerender($caption, $text); + $aa -> ShowNextPrev("archive", $from, $number, $contenttotal); + $cachecheck = CachePost($cachestr); +} + +//this function renders the preview of a content_item +//used in recent list, view author list, category items list +function displayPreview($qry){ + global $qs, $array, $row, $gen, $rater, $aa, $sql2, $tp, $plugintable, $plugindir, $content_shortcodes, $content_pref, $mainparent, $CONTENT_RECENT_TABLE_AUTHORDETAILS; + global $CONTENT_RECENT_TABLE_START, $CONTENT_RECENT_TABLE_END, $CONTENT_RECENT_TABLE, $CONTENT_RECENT_TABLE_INFOPRE, $CONTENT_RECENT_TABLE_INFOPOST; + + if(!isset($CONTENT_RECENT_TABLE)){ + if(!$content_pref["content_theme"]){ + require_once($plugindir."templates/default/content_recent_template.php"); + }else{ + if(is_readable($tp->replaceConstants($content_pref["content_theme"])."content_recent_template.php")){ + require_once($tp->replaceConstants($content_pref["content_theme"])."content_recent_template.php"); + }else{ + require_once($plugindir."templates/default/content_recent_template.php"); + } + } + } + if($resultitem = $sql2 -> db_Select($plugintable, "*", $qry )){ + $content_recent_table_string = ""; + while($row = $sql2 -> db_Fetch()){ + $CONTENT_RECENT_TABLE_AUTHORDETAILS = $aa -> prepareAuthor("list", $row['content_author'], $row['content_id']); + $rdate = $tp -> parseTemplate('{CONTENT_RECENT_TABLE_DATE}', FALSE, $content_shortcodes); + $rauth = $tp -> parseTemplate('{CONTENT_RECENT_TABLE_AUTHORDETAILS}', FALSE, $content_shortcodes); + $rep = $tp -> parseTemplate('{CONTENT_RECENT_TABLE_EPICONS}', FALSE, $content_shortcodes); + $rpar = $tp -> parseTemplate('{CONTENT_RECENT_TABLE_PARENT}', FALSE, $content_shortcodes); + $redi = $tp -> parseTemplate('{CONTENT_RECENT_TABLE_EDITICON}', FALSE, $content_shortcodes); + $CONTENT_RECENT_TABLE_INFOPRE = FALSE; + $CONTENT_RECENT_TABLE_INFOPOST = FALSE; + if ($rdate!="" || $rauth!="" || $rep!="" || $rpar!="" || $redi!="" ) { + $CONTENT_RECENT_TABLE_INFOPRE = TRUE; + $CONTENT_RECENT_TABLE_INFOPOST = TRUE; + } + + $content_recent_table_string .= $tp -> parseTemplate($CONTENT_RECENT_TABLE, FALSE, $content_shortcodes); + } + } + $text = $CONTENT_RECENT_TABLE_START.$content_recent_table_string.$CONTENT_RECENT_TABLE_END; + + return $text; +} + +// ##### RECENT LIST ------------------------------------ +function show_content_recent(){ + global $qs, $sql2, $plugindir, $ns, $plugintable, $sql, $aa, $e107cache, $tp, $pref, $content_pref, $cobj; + global $nextprevquery, $from, $number, $mainparent, $datequery, $content_icon_path, $CONTENT_RECENT_TABLE; + + $mainparent = $aa -> getMainParent(intval($qs[1])); + $content_pref = $aa -> getContentPref($mainparent); + + show_content_search_menu("recent", $mainparent); //show navigator/search/order menu + + $cachestr = "$plugintable.recent.$qs[1]"; + $cachecheck = CachePre($cachestr); + if($cachecheck){ + echo $cachecheck; + return; + } + $content_icon_path = $tp -> replaceConstants($content_pref["content_icon_path"]); + $array = $aa -> getCategoryTree("", intval($qs[1]), TRUE); + $validparent = implode(",", array_keys($array)); + $order = $aa -> getOrder(); + $number = ($content_pref["content_nextprev_number"] ? $content_pref["content_nextprev_number"] : "5"); + $nextprevquery = ($content_pref["content_nextprev"] ? "LIMIT ".intval($from).",".intval($number) : ""); + $qry = " content_parent REGEXP '".$aa -> CONTENTREGEXP($validparent)."' "; + + $contenttotal = $sql2 -> db_Count($plugintable, "(*)", "WHERE content_refer != 'sa' AND ".$qry." ".$datequery." AND content_class REGEXP '".e_CLASS_REGEXP."' " ); + + if($from > $contenttotal-1){ js_location(e_SELF); } + + $recentqry = "content_refer !='sa' AND ".$qry." ".$datequery." AND content_class REGEXP '".e_CLASS_REGEXP."' ".$order." ".$nextprevquery; + $text = displayPreview($recentqry); + $text = $aa -> getCrumbPage("recent", $array, $mainparent).$text; + $caption = $content_pref['content_list_caption']; + if(isset($content_pref['content_list_caption_append_name']) && $content_pref['content_list_caption_append_name']){ + $caption .= " ".$array[intval($qs[1])][1]; + } + $ns -> tablerender($caption, $text); + $aa -> ShowNextPrev("", $from, $number, $contenttotal); + $cachecheck = CachePost($cachestr); +} + +// ##### CATEGORY LIST ------------------------------------ +function show_content_cat_all(){ + global $qs, $plugindir, $content_shortcodes, $ns, $plugintable, $aa, $e107cache, $tp, $pref, $content_pref, $totalitems; + global $sql, $datequery, $amount, $from, $content_cat_icon_path_large, $content_icon_path, $n, $mainparent, $CONTENT_CAT_TABLE, $CONTENT_CAT_TABLE_AUTHORDETAILS; + global $row, $datestamp, $comment_total, $gen, $authordetails, $rater, $crumb; + global $CONTENT_CAT_TABLE_INFO_PRE, $CONTENT_CAT_TABLE_INFO_POST, $CONTENT_CAT_LIST_TABLE_INFO_PRE, $CONTENT_CAT_LIST_TABLE_INFO_POST; + + unset($text); + + $mainparent = $aa -> getMainParent(intval($qs[2])); + $content_pref = $aa -> getContentPref($mainparent); + + show_content_search_menu("catall", $mainparent); //show navigator/search/order menu + + if(!isset($CONTENT_CAT_TABLE)){ + if(!$content_pref["content_theme"]){ + require_once($plugindir."templates/default/content_cat_template.php"); + }else{ + if(is_readable($tp->replaceConstants($content_pref["content_theme"])."content_cat_template.php")){ + require_once($tp->replaceConstants($content_pref["content_theme"])."content_cat_template.php"); + }else{ + require_once($plugindir."templates/default/content_cat_template.php"); + } + } + } + + $cachestr = "$plugintable.cat.list.$qs[2]"; + $cachecheck = CachePre($cachestr); + if($cachecheck){ + echo $cachecheck; + return; + } + $content_cat_icon_path_large = $tp -> replaceConstants($content_pref["content_cat_icon_path_large"]); + $content_icon_path = $tp -> replaceConstants($content_pref["content_icon_path"]); + $array = $aa -> getCategoryTree("", $mainparent, TRUE); + $validparent = implode(",", array_keys($array)); + $order = $aa -> getOrder(); + $number = (isset($content_pref["content_nextprev_number"]) && $content_pref["content_nextprev_number"] ? $content_pref["content_nextprev_number"] : "5"); + $nextprevquery = (isset($content_pref["content_nextprev"]) && $content_pref["content_nextprev"] ? "LIMIT ".intval($from).",".intval($number) : ""); + $qry = " content_parent REGEXP '".$aa -> CONTENTREGEXP($validparent)."' "; + + $content_cat_table_string = ""; + $newarray = array_merge_recursive($array); + for($a=0;$a $value){ + $totalitems = $aa -> countCatItems($key); + $sql -> db_Select($plugintable, "*", "content_id = '".$key."' "); + $row = $sql -> db_Fetch(); + + $date = $tp -> parseTemplate('{CONTENT_CAT_TABLE_DATE}', FALSE, $content_shortcodes); + $auth = $tp -> parseTemplate('{CONTENT_CAT_TABLE_AUTHORDETAILS}', FALSE, $content_shortcodes); + $ep = $tp -> parseTemplate('{CONTENT_CAT_TABLE_EPICONS}', FALSE, $content_shortcodes); + $com = $tp -> parseTemplate('{CONTENT_CAT_TABLE_COMMENT}', FALSE, $content_shortcodes); + $CONTENT_CAT_TABLE_INFO_PRE = FALSE; + $CONTENT_CAT_TABLE_INFO_POST = FALSE; + if ($date!="" || $auth!="" || $ep!="" || $com!="" ) { + $CONTENT_CAT_TABLE_INFO_PRE = TRUE; + $CONTENT_CAT_TABLE_INFO_POST = TRUE; + } + $CONTENT_CAT_TABLE_AUTHORDETAILS = $aa -> prepareAuthor("catall", $row['content_author'], $row['content_id']); + $content_cat_table_string .= $tp -> parseTemplate($CONTENT_CAT_TABLE, FALSE, $content_shortcodes); + + } + $text = $CONTENT_CAT_TABLE_START.$content_cat_table_string.$CONTENT_CAT_TABLE_END; + $text = $aa -> getCrumbPage("catall", $array, $mainparent).$text; + $caption = $content_pref['content_catall_caption']; + $ns -> tablerender($caption, $text); + $cachecheck = CachePost($cachestr); +} + +function show_content_cat($mode=""){ + global $qs, $plugindir, $content_shortcodes, $ns, $plugintable, $sql, $aa, $e107cache, $tp, $pref, $content_pref, $cobj, $datequery, $from; + global $CONTENT_RECENT_TABLE, $CONTENT_CAT_LIST_TABLE, $CONTENT_CAT_LISTSUB_TABLE_START, $CONTENT_CAT_LISTSUB_TABLE, $CONTENT_CAT_LISTSUB_TABLE_END, $CONTENT_CAT_LIST_TABLE_AUTHORDETAILS, $CONTENT_CAT_LIST_TABLE_INFO_PRE, $CONTENT_CAT_LIST_TABLE_INFO_POST; + global $content_cat_icon_path_small, $content_cat_icon_path_large, $content_icon_path, $mainparent, $totalparent, $totalsubcat; + global $row, $datestamp, $comment_total, $gen, $authordetails, $rater, $crumb, $amount; + + $mainparent = $aa -> getMainParent(intval($qs[1])); + $content_pref = $aa -> getContentPref($mainparent); + + $array = $aa -> getCategoryTree("", $mainparent, TRUE); + $validparent = "0,0.".implode(",0.", array_keys($array)); + $qry = " content_id = '".intval($qs[1])."' AND content_refer !='sa' AND content_parent REGEXP '".$aa -> CONTENTREGEXP($validparent)."' ".$datequery." AND content_class REGEXP '".e_CLASS_REGEXP."' "; + + show_content_search_menu("cat", $mainparent); //show navigator/search/order menu + + if(!isset($CONTENT_CAT_LIST_TABLE)){ + if(!$content_pref["content_theme"]){ + require_once($plugindir."templates/default/content_cat_template.php"); + }else{ + if(is_readable($tp->replaceConstants($content_pref["content_theme"])."content_cat_template.php")){ + require_once($tp->replaceConstants($content_pref["content_theme"])."content_cat_template.php"); + }else{ + require_once($plugindir."templates/default/content_cat_template.php"); + } + } + } + + $content_cat_icon_path_large = $tp -> replaceConstants($content_pref["content_cat_icon_path_large"]); + $content_cat_icon_path_small = $tp -> replaceConstants($content_pref["content_cat_icon_path_small"]); + $content_icon_path = $tp -> replaceConstants($content_pref["content_icon_path"]); + $order = $aa -> getOrder(); + $number = (isset($content_pref["content_nextprev_number"]) && $content_pref["content_nextprev_number"] ? $content_pref["content_nextprev_number"] : "5"); + $nextprevquery = (isset($content_pref["content_nextprev"]) && $content_pref["content_nextprev"] ? "LIMIT ".intval($from).",".intval($number) : ""); + $capqs = array_reverse($array[intval($qs[1])]); + $caption = $content_pref['content_cat_caption']; + if(isset($content_pref['content_cat_caption_append_name']) && $content_pref['content_cat_caption_append_name']){ + $caption .= " ".$capqs[0]; + } + + // parent article + if(isset($content_pref["content_cat_showparent"]) && $content_pref["content_cat_showparent"]){ + if(!$resultparent = $sql -> db_Select($plugintable, "*", $qry )){ + header("location:".e_SELF."?cat.list.".$mainparent); exit; + }else{ + //if 'view' override the items pref to show only limited text adn show full catetgory text instead + if($mode=='view' || $mode=='comment'){ + $content_pref['content_cat_text_char'] = 'all'; + } + $row = $sql -> db_Fetch(); + $date = $tp -> parseTemplate('{CONTENT_CAT_LIST_TABLE_DATE}', FALSE, $content_shortcodes); + $auth = $tp -> parseTemplate('{CONTENT_CAT_LIST_TABLE_AUTHORDETAILS}', FALSE, $content_shortcodes); + $ep = $tp -> parseTemplate('{CONTENT_CAT_LIST_TABLE_EPICONS}', FALSE, $content_shortcodes); + $com = $tp -> parseTemplate('{CONTENT_CAT_LIST_TABLE_COMMENT}', FALSE, $content_shortcodes); + if ($date!="" || $auth!="" || $ep!="" || $com!="" ) { + $CONTENT_CAT_LIST_TABLE_INFO_PRE = TRUE; + $CONTENT_CAT_LIST_TABLE_INFO_POST = TRUE; + } + $totalparent = $aa -> countCatItems($row['content_id']); + $CONTENT_CAT_LIST_TABLE_AUTHORDETAILS = $aa -> prepareAuthor("cat", $row['content_author'], $row['content_id']); + $textparent = $tp -> parseTemplate($CONTENT_CAT_LIST_TABLE, FALSE, $content_shortcodes); + } + } + + $cachestr = "$plugintable.cat.$qs[1]"; + $cachecheck = CachePre($cachestr); + if($cachecheck){ + echo $cachecheck; + return; + } + + if(!$mode || $mode == "" || $mode=='view'){ + $check = (isset($qs[1]) && is_numeric($qs[1]) ? intval($qs[1]) : intval($mainparent)); + $array1 = $aa -> getCategoryTree("", $check, TRUE); + $newarray = array_merge_recursive($array1); + $levels = 0; + if(isset($content_pref['content_cat_levels']) && is_numeric($content_pref['content_cat_levels']) && $content_pref['content_cat_levels']>0){ + $levels = intval($content_pref['content_cat_levels']) + 1; + } + if($levels>0){ + for($a=0;$a CONTENTREGEXP($validsub)."' ".$datequery." AND content_class REGEXP '".e_CLASS_REGEXP."' "; + + //list subcategories + if(isset($content_pref["content_cat_showparentsub"]) && $content_pref["content_cat_showparentsub"]){ + + $content_cat_listsub_table_string = ""; + for($i=0;$i db_Select($plugintable, "content_id, content_heading, content_subheading, content_icon, content_parent", " content_id = '".$subparent[$i]."' AND ".$subqry." " )){ + while($row = $sql -> db_Fetch()){ + $totalsubcat = $aa -> countCatItems($row['content_id']); + $content_cat_listsub_table_string .= $tp -> parseTemplate($CONTENT_CAT_LISTSUB_TABLE, FALSE, $content_shortcodes); + } + $textsubparent = $CONTENT_CAT_LISTSUB_TABLE_START.$content_cat_listsub_table_string.$CONTENT_CAT_LISTSUB_TABLE_END; + $captionsubparent = $content_pref['content_cat_sub_caption']; + } + } + } + + //list all contents within this category + unset($text); + + //also show content items of subcategories of this category ? + if(isset($content_pref["content_cat_listtype"]) && $content_pref["content_cat_listtype"]){ + $validitem = implode(",", $subparent); + $qrycat = " content_parent REGEXP '".$aa -> CONTENTREGEXP($validitem)."' "; + }else{ + $qrycat = " content_parent = '".intval($qs[1])."' "; + } + $qrycat = " content_refer !='sa' ".$datequery." AND content_class REGEXP '".e_CLASS_REGEXP."' AND ".$qrycat." "; + $contenttotal = $sql -> db_Count($plugintable, "(*)", "WHERE ".$qrycat); + $childqry = $qrycat." ".$order." ".$nextprevquery; + $textchild = displayPreview($childqry); + $captionchild = $content_pref['content_cat_item_caption']; + + $crumbpage = $aa -> getCrumbPage("cat", $array, $qs[1]); + if(isset($textparent)){ + $textparent = $crumbpage.$textparent; + }else{ + $textchild = $crumbpage.$textchild; + } + if(isset($content_pref["content_cat_menuorder"]) && $content_pref["content_cat_menuorder"] == "1"){ + if(isset($content_pref["content_cat_rendertype"]) && $content_pref["content_cat_rendertype"] == "1"){ + if(isset($textparent)){ $ns -> tablerender($caption, $textparent); } + if(isset($textsubparent)){ $ns -> tablerender($captionsubparent, $textsubparent); } + if(isset($textchild)){ $ns -> tablerender($captionchild, $textchild); } + }else{ + $ns -> tablerender($caption, (isset($textparent) ? $textparent : "").(isset($textsubparent) ? $textsubparent : "").$textchild); + } + if(isset($content_pref["content_nextprev"]) && $content_pref["content_nextprev"]){ + $aa->ShowNextPrev(FALSE, $from, $number, $contenttotal); + } + }else{ + if(isset($content_pref["content_cat_rendertype"]) && $content_pref["content_cat_rendertype"] == "1"){ + if(isset($textchild)){ $ns -> tablerender($captionchild, $textchild); } + if(isset($content_pref["content_nextprev"]) && $content_pref["content_nextprev"]){ + $aa->ShowNextPrev(FALSE, $from, $number, $contenttotal); + } + if(isset($textparent)){ $ns -> tablerender($caption, $textparent); } + if(isset($textsubparent)){ $ns -> tablerender($captionsubparent, $textsubparent); } + }else{ + if(isset($textchild)){ $ns -> tablerender($captionchild, $textchild); } + if(isset($content_pref["content_nextprev"]) && $content_pref["content_nextprev"]){ + $aa->ShowNextPrev(FALSE, $from, $number, $contenttotal); + } + $ns -> tablerender($caption, (isset($textparent) ? $textparent : "").(isset($textsubparent) ? $textsubparent : "")); + } + } + } + $cachecheck = CachePost($cachestr); + + if($mode == "comment"){ + $textparent = $aa -> getCrumbPage("cat", $array, $mainparent).$textparent; + if(isset($textparent)){ $ns -> tablerender($caption, $textparent); } + + if($resultitem = $sql -> db_Select($plugintable, "*", $qry )){ + $row = $sql -> db_Fetch(); + if($row['content_comment']){ + $cachestr = "comment.$plugintable.$qs[1]"; + $cachecheck = CachePre($cachestr); + if($cachecheck){ + echo $cachecheck; + return; + } + if( (isset($content_pref["content_cat_rating_all"]) && $content_pref["content_cat_rating_all"]) || (isset($content_pref["content_cat_rating"]) && $content_pref["content_cat_rating"] && $row['content_rate'])){ + $showrate = TRUE; + }else{ + $showrate = FALSE; + } + $cobj->compose_comment($plugintable, "comment", $qs[1], $width, $row['content_heading'], $showrate); + $cachecheck = CachePost($cachestr); + } + } + } +} + +// ##### AUTHOR LIST -------------------------------------- +function show_content_author_all(){ + global $qs, $plugindir, $content_shortcodes, $ns, $plugintable, $from, $sql, $aa, $e107cache, $tp, $pref, $mainparent, $content_pref, $cobj, $datequery, $authordetails, $i, $gen, $totalcontent, $row, $CONTENT_AUTHOR_TABLE, $CONTENT_AUTHOR_TABLE_START, $CONTENT_AUTHOR_TABLE_END, $CONTENT_AUTHOR_TABLE_DATE, $CONTENT_AUTHOR_TABLE_HEADING; + + $mainparent = $aa -> getMainParent(intval($qs[2])); + $content_pref = $aa -> getContentPref($mainparent); + + show_content_search_menu("authorall", $mainparent); //show navigator/search/order menu + + if(!isset($CONTENT_AUTHOR_TABLE)){ + if(!$content_pref["content_theme"]){ + require_once($plugindir."templates/default/content_author_template.php"); + }else{ + if(is_readable($tp->replaceConstants($content_pref["content_theme"])."content_author_template.php")){ + require_once($tp->replaceConstants($content_pref["content_theme"])."content_author_template.php"); + }else{ + require_once($plugindir."templates/default/content_author_template.php"); + } + } + } + + $cachestr = "$plugintable.author.list.$qs[2]"; + $cachecheck = CachePre($cachestr); + if($cachecheck){ + echo $cachecheck; + return; + } + $array = $aa -> getCategoryTree("", $mainparent, TRUE); + $validparent = implode(",", array_keys($array)); + $number = (isset($content_pref["content_author_nextprev_number"]) && $content_pref["content_author_nextprev_number"] ? $content_pref["content_author_nextprev_number"] : "5"); + $nextprevquery = (isset($content_pref["content_author_nextprev"]) && $content_pref["content_author_nextprev"] ? "LIMIT ".intval($from).",".intval($number) : ""); + $qry = " p.content_parent REGEXP '".$aa -> CONTENTREGEXP($validparent)."' "; + $dateqry = "AND p.content_datestamp < ".time()." AND (p.content_enddate=0 || p.content_enddate>".time().")"; + + $sql1 = new db; $sql2 = new db; + $contenttotal = $sql1 -> db_Select($plugintable." AS p", "DISTINCT(p.content_author)", "p.content_refer !='sa' AND ".$qry." ".$datequery." AND p.content_class REGEXP '".e_CLASS_REGEXP."'"); + + $query = " + SELECT DISTINCT(p.content_author) + FROM #$plugintable AS p + WHERE p.content_refer !='sa' AND ".$qry." ".$dateqry." AND p.content_class REGEXP '".e_CLASS_REGEXP."' + ORDER BY p.content_author"; + + $arr = array(); + $arr2 = array(); + if (!$sql1->db_Select_gen($query)){ + $text = CONTENT_LAN_15; + }else{ + while($row1 = $sql1 -> db_Fetch()){ + //parse db field and retrieve user info -> array($author_id, $author_name, $author_email, $content_author); + $arr[] = $aa->getAuthor($row1['content_author']); + } + //combine unique authors + for($i=0;$i$value){ + $db=''; + //prepare db field for author comparison + if(count($arr2[$key])==1){ + $db = " p.content_author='".$arr2[$key][0][3]."' "; + }else{ + for($k=0;$kdb_Count($plugintable." as p", "(*)", "WHERE ".$db ); + + $query = " + SELECT p.content_id, p.content_heading, p.content_datestamp + FROM #$plugintable AS p + WHERE (".$db.") AND p.content_refer !='sa' AND ".$qry." ".$dateqry." AND p.content_class REGEXP '".e_CLASS_REGEXP."' + ORDER BY p.content_datestamp ASC, p.content_author LIMIT 0,1"; + + //query to retrieve last created item for each author + if ($sql2->db_Select_gen($query)){ + while($row2 = $sql2 -> db_Fetch()){ + $arr3[] = array($key, $row2['content_id'], $row2['content_heading'], $row2['content_datestamp'], $amount); + } + } + } + } + + function cmp($a, $b) + { + $posa = strrpos($a[0], " "); + if($posa == TRUE){ + $la = substr($a[0], $posa); + }elseif($posa == FALSE){ + $la = $a[0]; + } + + $posb = strrpos($b[0], " "); + if($posb == TRUE){ + $lb = substr($b[0], $posb); + }elseif($posb == FALSE){ + $lb = $b[0]; + } + + if ($la == $lb) { + return 0; + } + return strcasecmp ($la, $lb); + } + //do an alpha ordering on the author (if 'firstname lastname', lastname is the comparison factor) + usort($arr3, "cmp"); + + $string = ""; + //only display number of records for nextprev + $max = $from+$number; + for($i=$from;$i<$max;$i++){ + if(is_array($arr3[$i])){ + $authordetails[$i][1] = $arr3[$i][0]; + $row['content_id'] = $arr3[$i][1]; + $row['content_heading'] = $arr3[$i][2]; + $row['content_datestamp'] = $arr3[$i][3]; + $totalcontent = $arr3[$i][4]; + $string .= $tp -> parseTemplate($CONTENT_AUTHOR_TABLE, FALSE, $content_shortcodes); + } + } + $text = $CONTENT_AUTHOR_TABLE_START.$string.$CONTENT_AUTHOR_TABLE_END; + $text = $aa -> getCrumbPage("authorall", $array, $mainparent).$text; + } + $caption = $content_pref['content_author_index_caption']; + $ns -> tablerender($caption, $text); + $aa -> ShowNextPrev("author", $from, $number, $contenttotal); + $cachecheck = CachePost($cachestr); +} + + +function show_content_author(){ + global $qs, $plugindir, $content_shortcodes, $ns, $plugintable, $sql, $aa, $e107cache, $tp, $pref, $content_pref, $cobj; + global $nextprevquery, $from, $number, $content_icon_path; + global $CONTENT_RECENT_TABLE, $datequery, $crumb, $mainparent; + + $mainparent = $aa -> getMainParent(intval($qs[1])); + $content_pref = $aa -> getContentPref($mainparent); + + show_content_search_menu("author", $mainparent); //show navigator/search/order menu + + $cachestr = "$plugintable.author.$qs[1]"; + $cachecheck = CachePre($cachestr); + if($cachecheck){ + echo $cachecheck; + return; + } + $content_icon_path = $tp -> replaceConstants($content_pref["content_icon_path"]); + $array = $aa -> getCategoryTree("", $mainparent, TRUE); + if(array_key_exists($qs[1], $array)){ + $validparent = "0,0.".implode(",0.", array_keys($array)); + }else{ + $validparent = implode(",", array_keys($array)); + } + $order = $aa -> getOrder(); + $number = (isset($content_pref["content_nextprev_number"]) && $content_pref["content_nextprev_number"] ? $content_pref["content_nextprev_number"] : "5"); + $nextprevquery = (isset($content_pref["content_nextprev"]) && $content_pref["content_nextprev"] ? "LIMIT ".intval($from).",".intval($number) : ""); + $qry = " content_parent REGEXP '".$aa -> CONTENTREGEXP($validparent)."' "; + $sqla = ""; + if(!is_object($sqla)){ $sqla = new db; } + if(!$author = $sqla -> db_Select($plugintable, "content_author", "content_refer !='sa' AND ".$qry." ".$datequery." AND content_id = '".intval($qs[1])."' AND content_class REGEXP '".e_CLASS_REGEXP."' ")){ + header("location:".e_SELF."?author.list.".$mainparent); exit; + }else{ + list($content_author) = $sqla -> db_Fetch(); + $sqlb = new db; + $authordetails = $aa -> getAuthor($content_author); + $query = " content_author = '".$authordetails[3]."' || content_author REGEXP '^".$authordetails[1]."^' ".(is_numeric($content_author) ? " || content_author = '".$authordetails[0]."' " : "")." "; + $validparent = implode(",", array_keys($array)); + $qry = " content_refer !='sa' AND content_parent REGEXP '".$aa -> CONTENTREGEXP($validparent)."' ".$datequery." AND content_class REGEXP '".e_CLASS_REGEXP."' AND (".$query.") "; + $contenttotal = $sqlb -> db_Count($plugintable, "(*)", "WHERE ".$qry." "); + $authorqry = $qry." ".$order." ".$nextprevquery; + $text = displayPreview($authorqry); + $text = $aa -> getCrumbPage("author", $array, $mainparent).$text; + $caption = $content_pref['content_author_caption']; + if(isset($content_pref['content_author_caption_append_name']) && $content_pref['content_author_caption_append_name']){ + $caption .= " ".$authordetails[1]; + } + $ns -> tablerender($caption, $text); + $aa -> ShowNextPrev("", $from, $number, $contenttotal); + } + $cachecheck = CachePost($cachestr); +} + +// ##### TOP RATED LIST ----------------------------------- +function show_content_top(){ + global $qs, $plugindir, $content_shortcodes, $ns, $plugintable, $sql, $aa, $e107cache, $tp, $pref, $cobj, $content_icon_path; + global $from, $datequery, $content_pref, $mainparent; + global $CONTENT_TOP_TABLE_AUTHOR, $authordetails, $row; + + $mainparent = $aa -> getMainParent(intval($qs[1])); + $content_pref = $aa -> getContentPref($mainparent); + + show_content_search_menu("top", $mainparent); //show navigator/search/order menu + + if(!isset($CONTENT_TOP_TABLE)){ + if(!$content_pref["content_theme"]){ + require_once($plugindir."templates/default/content_top_template.php"); + }else{ + if(is_readable($tp->replaceConstants($content_pref["content_theme"])."content_top_template.php")){ + require_once($tp->replaceConstants($content_pref["content_theme"])."content_top_template.php"); + }else{ + require_once($plugindir."templates/default/content_top_template.php"); + } + } + } + $cachestr = "$plugintable.top.$qs[1]"; + $cachecheck = CachePre($cachestr); + if($cachecheck){ + echo $cachecheck; + return; + } + $content_icon_path = $tp -> replaceConstants($content_pref["content_icon_path"]); + $array = $aa -> getCategoryTree("", intval($qs[1]), TRUE); + $validparent = implode(",", array_keys($array)); + $datequery1 = " AND p.content_datestamp < ".time()." AND (p.content_enddate=0 || p.content_enddate>".time().") "; + $qry = " p.content_parent REGEXP '".$aa -> CONTENTREGEXP($validparent)."' "; + $number = (isset($content_pref["content_nextprev_number"]) && $content_pref["content_nextprev_number"] ? $content_pref["content_nextprev_number"] : ""); + $np = ($number ? " LIMIT ".intval($from).", ".intval($number) : ""); + + $qry1 = " + SELECT p.*, r.*, (r.rate_rating / r.rate_votes) as rate_avg + FROM #rate AS r + LEFT JOIN #pcontent AS p ON p.content_id = r.rate_itemid + WHERE p.content_refer !='sa' AND ".$qry." ".$datequery1." AND p.content_class REGEXP '".e_CLASS_REGEXP."' AND r.rate_table='pcontent' + ORDER BY rate_avg DESC "; + $qry2 = $qry1." ".$np; + + if(!is_object($sql)){ $sql = new db; } + $total = $sql -> db_Select_gen($qry1); + if($sql->db_Select_gen($qry2)){ + while($row = $sql -> db_Fetch()){ + $CONTENT_TOP_TABLE_AUTHOR = $aa -> prepareAuthor("top", $row['content_author'], $row['content_id']); + $content_top_table_string .= $tp -> parseTemplate($CONTENT_TOP_TABLE, FALSE, $content_shortcodes); + } + $content_top_table_string = $aa -> getCrumbPage("top", $array, $mainparent).$content_top_table_string; + $text = $CONTENT_TOP_TABLE_START.$content_top_table_string.$CONTENT_TOP_TABLE_END; + $caption = $content_pref['content_top_caption']; + if(isset($content_pref['content_top_caption_append_name']) && $content_pref['content_top_caption_append_name']){ + $caption .= " ".$array[intval($qs[1])][1]; + } + $ns -> tablerender($caption, $text); + $aa -> ShowNextPrev("", $from, $number, $total); + } + $cachecheck = CachePost($cachestr); + unset($qry, $qry1, $qry2, $array, $validparent, $datequery); +} + + +// ##### TOP SCORE LIST ----------------------------------- +function show_content_score(){ + global $qs, $plugindir, $content_shortcodes, $ns, $plugintable, $sql, $aa, $e107cache, $tp, $pref, $cobj, $content_icon_path; + global $from, $datequery, $content_pref, $mainparent, $eArrayStorage, $CONTENT_SCORE_TABLE_SCORE, $CONTENT_SCORE_TABLE_AUTHOR, $authordetails, $row, $thisratearray; + + $mainparent = $aa -> getMainParent(intval($qs[1])); + $content_pref = $aa -> getContentPref($mainparent); + show_content_search_menu("score", $mainparent); //show navigator/search/order menu + + if(!isset($CONTENT_SCORE_TABLE)){ + if(!$content_pref["content_theme"]){ + require_once($plugindir."templates/default/content_score_template.php"); + }else{ + if(is_readable($tp->replaceConstants($content_pref["content_theme"])."content_score_template.php")){ + require_once($tp->replaceConstants($content_pref["content_theme"])."content_score_template.php"); + }else{ + require_once($plugindir."templates/default/content_score_template.php"); + } + } + } + + $cachestr = "$plugintable.score.$qs[1]"; + $cachecheck = CachePre($cachestr); + if($cachecheck){ + echo $cachecheck; + return; + } + $content_icon_path = $tp -> replaceConstants($content_pref["content_icon_path"]); + $array = $aa -> getCategoryTree("", intval($qs[1]), TRUE); + $validparent = implode(",", array_keys($array)); + $qry = " content_score != '0' AND content_score != '' AND content_parent REGEXP '".$aa -> CONTENTREGEXP($validparent)."' ".$datequery." AND content_class REGEXP '".e_CLASS_REGEXP."' "; + $number = (isset($content_pref["content_nextprev_number"]) && $content_pref["content_nextprev_number"] ? $content_pref["content_nextprev_number"] : "5"); + + if(!is_object($sql)){ $sql = new db; } + $contenttotal = $sql -> db_Count($plugintable, "(*)", "WHERE ".$qry." "); + if(!$sql -> db_Select($plugintable, "content_id, content_heading, content_author, content_icon, content_score", " ".$qry." ORDER BY content_score DESC LIMIT ".$from.",".$number." ")){ + $content_score_table_string = CONTENT_LAN_88; + }else{ + while($row = $sql -> db_Fetch()){ + $CONTENT_SCORE_TABLE_AUTHOR = $aa -> prepareAuthor("score", $row['content_author'], $row['content_id']); + $content_score_table_string .= $tp -> parseTemplate($CONTENT_SCORE_TABLE, FALSE, $content_shortcodes); + } + } + $content_score_table_string = $aa -> getCrumbPage("score", $array, $mainparent).$content_score_table_string; + $text = $CONTENT_SCORE_TABLE_START.$content_score_table_string.$CONTENT_SCORE_TABLE_END; + $caption = $content_pref['content_score_caption']; + if(isset($content_pref['content_score_caption_append_name']) && $content_pref['content_score_caption_append_name']){ + $caption .= " ".$array[intval($qs[1])][1]; + } + $ns -> tablerender($caption, $text); + $aa -> ShowNextPrev("", $from, $number, $contenttotal); + $cachecheck = CachePost($cachestr); +} + +// ##### CONTENT ITEM ------------------------------------------ +function show_content_item(){ + global $pref, $content_pref, $content_icon_path, $content_image_path, $content_file_path, $custom, $plugindir, $plugintable, $array, $content_shortcodes, $datequery, $order, $nextprevquery, $from, $number, $row, $qs, $gen, $sql, $aa, $tp, $rs, $cobj, $e107, $e107cache, $eArrayStorage, $ns, $rater, $ep, $row, $authordetails, $mainparent; + global $CONTENT_CONTENT_TABLE_TEXT, $CONTENT_CONTENT_TABLE_PAGENAMES, $CONTENT_CONTENT_TABLE_SUMMARY, $CONTENT_CONTENT_TABLE_CUSTOM_TAGS, $CONTENT_CONTENT_TABLE_PARENT, $CONTENT_CONTENT_TABLE_INFO_PRE, $CONTENT_CONTENT_TABLE_INFO_POST, $CONTENT_CONTENT_TABLE_AUTHORDETAILS, $CONTENT_CONTENT_TABLE_INFO_PRE_HEADDATA, $CONTENT_CONTENT_TABLE_INFO_POST_HEADDATA; + global $CONTENT_CONTENT_TABLE_PREV_PAGE, $CONTENT_CONTENT_TABLE_NEXT_PAGE; + + $mainparent = $aa -> getMainParent(intval($qs[1])); + $content_pref = $aa -> getContentPref($mainparent); + + show_content_search_menu("item", $mainparent); //show navigator/search/order menu + $array = $aa -> getCategoryTree("", $mainparent, TRUE); + $validparent = implode(",", array_keys($array)); + $qry = "content_id='".intval($qs[1])."' AND content_refer !='sa' AND content_parent REGEXP '".$aa -> CONTENTREGEXP($validparent)."' ".$datequery." AND content_class REGEXP '".e_CLASS_REGEXP."' "; + + if(!$resultitem = $sql -> db_Select($plugintable, "*", $qry)){ + header("location:".e_SELF."?recent.".$mainparent); exit; + }else{ + $row = $sql -> db_Fetch(); + + //update refer count outside of cache (count visits ^ count unique ips) + if(isset($content_pref["content_log"]) && $content_pref["content_log"]){ + $ip = $e107->getip(); + $self = e_SELF; + $refertmp = explode("^", $row['content_refer']); + if(strpos($self, "admin") === FALSE){ + if(strpos($refertmp[1], $ip) === FALSE){ + $referiplist = ($refertmp[1] ? $refertmp[1]."-".$ip : $ip ); + $contentrefernew = ($refertmp[0]+1)."^".$referiplist; + }else{ + $contentrefernew = ($refertmp[0]+1)."^".$refertmp[1]; + } + $sql = new db; + $sql -> db_Update($plugintable, "content_refer='".$contentrefernew."' WHERE content_id='".intval($qs[1])."' "); + + $e107cache->clear("$plugintable.content.$qs[1]"); + $e107cache->clear("$plugintable.recent.$mainparent"); + $e107cache->clear("$plugintable.cat.list.$mainparent"); + $e107cache->clear("$plugintable.cat.$mainparent"); + $e107cache->clear("$plugintable.author.$mainparent"); + $e107cache->clear("$plugintable.top.$mainparent"); + } + } + + if(!isset($qs[2])){ $cacheid = 1; }else{ $cacheid = $qs[2]; } + $cachestr = "$plugintable.content.$qs[1].$cacheid"; + $cachecheck = CachePre($cachestr); + if($cachecheck){ + echo $cachecheck; + return; + } + $content_pref["content_cat_icon_path_large"] = ($content_pref["content_cat_icon_path_large"] ? $content_pref["content_cat_icon_path_large"] : "{e_PLUGIN}content/images/cat/48/" ); + $content_pref["content_cat_icon_path_small"] = ($content_pref["content_cat_icon_path_small"] ? $content_pref["content_cat_icon_path_small"] : "{e_PLUGIN}content/images/cat/16/" ); + $content_pref["content_icon_path"] = ($content_pref["content_icon_path"] ? $content_pref["content_icon_path"] : "{e_PLUGIN}content/images/icon/" ); + $content_pref["content_image_path"] = ($content_pref["content_image_path"] ? $content_pref["content_image_path"] : "{e_PLUGIN}content/images/image/" ); + $content_pref["content_file_path"] = ($content_pref["content_file_path"] ? $content_pref["content_file_path"] : "{e_PLUGIN}content/images/file/" ); + $content_cat_icon_path_large = $tp -> replaceConstants($content_pref["content_cat_icon_path_large"]); + $content_cat_icon_path_small = $tp -> replaceConstants($content_pref["content_cat_icon_path_small"]); + $content_icon_path = $tp -> replaceConstants($content_pref["content_icon_path"]); + $content_image_path = $tp -> replaceConstants($content_pref["content_image_path"]); + $content_file_path = $tp -> replaceConstants($content_pref["content_file_path"]); + $number = (isset($content_pref["content_nextprev_number"]) && $content_pref["content_nextprev_number"] ? $content_pref["content_nextprev_number"] : "5"); + $nextprevquery = (isset($content_pref["content_nextprev"]) && $content_pref["content_nextprev"] ? "LIMIT ".intval($from).",".intval($number) : ""); + + $CONTENT_CONTENT_TABLE_AUTHORDETAILS = $aa -> prepareAuthor("content", $row['content_author'], $row['content_id']); + $CONTENT_CONTENT_TABLE_TEXT = $row['content_text']; + + $CONTENT_CONTENT_TABLE_PREV_PAGE = FALSE; + $CONTENT_CONTENT_TABLE_NEXT_PAGE = FALSE; + $lastpage = FALSE; //boolean whether or not the current page is the last page + if(preg_match_all("/\[newpage.*?]/si", $row['content_text'], $matches)){ + //remove html bbcode (since we're splitting the text, the html bbcode would not be parsed) + $row['content_text'] = preg_replace("/\\[html\](.*?)\[\/html\]/si", '\1', $row['content_text']); + //split newpage + $pages = preg_split("/\[newpage.*?]/si", $row['content_text'], -1, PREG_SPLIT_NO_EMPTY); + $pages = array_values($pages); + + //remove empty values + if(trim($pages[0]) == ""){ + unset($pages[0]); + } + $pages = array_values($pages); + + if(count($pages) == count($matches[0])){ + }elseif(count($pages) > count($matches[0])){ + $matches[0] = array_pad($matches[0], -count($pages), "[newpage]"); + }elseif(count($pages) < count($matches[0])){ + } + + $CONTENT_CONTENT_TABLE_TEXT = $pages[(!$qs[2] ? 0 : $qs[2]-1)]; + $options = ""; + for ($i=0; $i < count($pages); $i++) { + if(!isset($qs[2])){ $idp = 1; }else{ $idp = $qs[2]; } + if($idp == $i+1){ $pre = CONTENT_LAN_92; }else{ $pre = ""; } + if($matches[0][$i] == "[newpage]"){ + $pagename[$i] = CONTENT_LAN_78; + }else{ + $arrpagename = explode("[newpage=", $matches[0][$i]); + $pagename[$i] = substr($arrpagename[1],0,-1); + } + if(isset($content_pref["content_content_pagenames_nextprev"]) && $content_pref["content_content_pagenames_nextprev"]){ + if($idp>1){ + if(isset($content_pref["content_content_pagenames_nextprev_prevhead"]) && $content_pref["content_content_pagenames_nextprev_prevhead"]){ + $cap = $content_pref["content_content_pagenames_nextprev_prevhead"]; + $cap = str_replace("{PAGETITLE}", $pagename[$idp-2], $cap); + }else{ + $cap = CONTENT_LAN_90; + } + $CONTENT_CONTENT_TABLE_PREV_PAGE = "".$cap.""; + }else{ + $CONTENT_CONTENT_TABLE_PREV_PAGE = ' '; + } + if($idp".$cap.""; + }else{ + $CONTENT_CONTENT_TABLE_NEXT_PAGE = ' '; + } + } + + //0:normal links, 1:selectbox + //$content_pref["content_content_pagenames_rendertype"] = "1"; + if(isset($content_pref["content_content_pagenames_rendertype"]) && $content_pref["content_content_pagenames_rendertype"] == "1"){ + $page = CONTENT_LAN_79." ".($i+1)." ".$pre." ".$pagename[$i]; + $url = e_SELF."?".$qs[0].".".$qs[1].".".($i+1); + $options .= $rs -> form_option($page, ($idp == ($i+1) ? "1" : "0"), $url , ""); + }else{ + $options .= CONTENT_LAN_79." ".($i+1)." ".$pre." : ".$pagename[$i]."
    "; + } + + if($idp==1){ + $CONTENT_CONTENT_TABLE_SUMMARY = (isset($content_pref["content_content_summary"]) && $content_pref["content_content_summary"] && $row['content_summary'] ? $tp -> toHTML($row['content_summary'], TRUE, "") : ""); + $CONTENT_CONTENT_TABLE_SUMMARY = $tp -> replaceConstants($CONTENT_CONTENT_TABLE_SUMMARY); + }else{ + $CONTENT_CONTENT_TABLE_SUMMARY = ""; + } + //render custom/preset on first page + if(isset($content_pref['content_content_multipage_preset']) && $content_pref['content_content_multipage_preset']){ + if($idp == '1'){ + $lastpage = TRUE; + } + //render custom/preset on last page + }else{ + if($idp == count($pages)){ + $lastpage = TRUE; + } + } + } + if($content_pref["content_content_pagenames_rendertype"] == "1"){ + $selectjs = "onchange=\"if(this.options[this.selectedIndex].value != 'none'){ return document.location=this.options[this.selectedIndex].value; }\""; + $CONTENT_CONTENT_TABLE_PAGENAMES = $rs -> form_select_open("pagenames", $selectjs).$rs -> form_option(CONTENT_LAN_89, "1", "none" , "").$options.$rs -> form_select_close(); + }else{ + $CONTENT_CONTENT_TABLE_PAGENAMES = $options; + } + + }else{ + $CONTENT_CONTENT_TABLE_SUMMARY = (isset($content_pref["content_content_summary"]) && $content_pref["content_content_summary"] && $row['content_summary'] ? $tp -> toHTML($row['content_summary'], TRUE, "") : ""); + $CONTENT_CONTENT_TABLE_SUMMARY = $tp -> replaceConstants($CONTENT_CONTENT_TABLE_SUMMARY); + $lastpage = TRUE; + } + + $CONTENT_CONTENT_TABLE_TEXT = $tp -> replaceConstants($CONTENT_CONTENT_TABLE_TEXT); + $CONTENT_CONTENT_TABLE_TEXT = $tp -> toHTML($CONTENT_CONTENT_TABLE_TEXT, TRUE, ""); + + $custom = $eArrayStorage->ReadArray($row['content_pref']); + + $date = $tp -> parseTemplate('{CONTENT_CONTENT_TABLE_DATE}', FALSE, $content_shortcodes); + $auth = $tp -> parseTemplate('{CONTENT_CONTENT_TABLE_AUTHORDETAILS}', FALSE, $content_shortcodes); + $ep = $tp -> parseTemplate('{CONTENT_CONTENT_TABLE_EPICONS}', FALSE, $content_shortcodes); + $edit = $tp -> parseTemplate('{CONTENT_CONTENT_TABLE_EDITICON}', FALSE, $content_shortcodes); + $par = $tp -> parseTemplate('{CONTENT_CONTENT_TABLE_PARENT}', FALSE, $content_shortcodes); + $com = $tp -> parseTemplate('{CONTENT_CONTENT_TABLE_COMMENT}', FALSE, $content_shortcodes); + $score = $tp -> parseTemplate('{CONTENT_CONTENT_TABLE_SCORE}', FALSE, $content_shortcodes); + $ref = $tp -> parseTemplate('{CONTENT_CONTENT_TABLE_REFER}', FALSE, $content_shortcodes); + $ico = $tp -> parseTemplate('{CONTENT_CONTENT_TABLE_ICON}', FALSE, $content_shortcodes); + $sub = $tp -> parseTemplate('{CONTENT_CONTENT_TABLE_SUBHEADING}', FALSE, $content_shortcodes); + $rat = $tp -> parseTemplate('{CONTENT_CONTENT_TABLE_RATING}', FALSE, $content_shortcodes); + $fil = $tp -> parseTemplate('{CONTENT_CONTENT_TABLE_FILE}', FALSE, $content_shortcodes); + + $CONTENT_CONTENT_TABLE_INFO_PRE_HEADDATA = FALSE; + $CONTENT_CONTENT_TABLE_INFO_POST_HEADDATA = FALSE; + $CONTENT_CONTENT_TABLE_INFO_PRE = FALSE; + $CONTENT_CONTENT_TABLE_INFO_POST = FALSE; + + if ($date!="" || $auth!="" || $ep!="" || $edit!="" || $par!="" || $com!="" || $score!="" || $ref!="" || $sub!="" || $rat!="" || $fil!="") { + $CONTENT_CONTENT_TABLE_INFO_PRE = TRUE; + $CONTENT_CONTENT_TABLE_INFO_POST = TRUE; + } + if($CONTENT_CONTENT_TABLE_INFO_PRE || $ico==''){ + $CONTENT_CONTENT_TABLE_INFO_PRE_HEADDATA = TRUE; + $CONTENT_CONTENT_TABLE_INFO_POST_HEADDATA = TRUE; + } + + if(!isset($CONTENT_CONTENT_TABLE)){ + //if no theme has been set, use default theme + if(!$content_pref["content_theme"]){ + + //if custom layout is set + if($row['content_layout']){ + //if custom layout file exists + if(is_readable($plugindir."templates/default/".$row['content_layout'])){ + require_once($plugindir."templates/default/".$row['content_layout']); + }else{ + require_once($plugindir."templates/default/content_content_template.php"); + } + }else{ + require_once($plugindir."templates/default/content_content_template.php"); + } + }else{ + //if custom layout is set + if($row['content_layout']){ + //if custom layout file exists + if(is_readable($tp->replaceConstants($content_pref["content_theme"]).$row['content_layout'])){ + require_once($tp->replaceConstants($content_pref["content_theme"]).$row['content_layout']); + }else{ + //if default layout from the set theme exists + if(is_readable($tp->replaceConstants($content_pref["content_theme"])."content_content_template.php")){ + require_once($tp->replaceConstants($content_pref["content_theme"])."content_content_template.php"); + //else use default theme, default layout + }else{ + require_once($plugindir."templates/default/content_content_template.php"); + } + } + //if no custom layout is set + }else{ + //if default layout from the set theme exists + if(is_readable($tp->replaceConstants($content_pref["content_theme"])."content_content_template.php")){ + require_once($tp->replaceConstants($content_pref["content_theme"])."content_content_template.php"); + //else use default theme, default layout + }else{ + require_once($plugindir."templates/default/content_content_template.php"); + } + } + } + } + + $months = array(CONTENT_ADMIN_DATE_LAN_0, CONTENT_ADMIN_DATE_LAN_1, CONTENT_ADMIN_DATE_LAN_2, CONTENT_ADMIN_DATE_LAN_3, CONTENT_ADMIN_DATE_LAN_4, CONTENT_ADMIN_DATE_LAN_5, CONTENT_ADMIN_DATE_LAN_6, CONTENT_ADMIN_DATE_LAN_7, CONTENT_ADMIN_DATE_LAN_8, CONTENT_ADMIN_DATE_LAN_9, CONTENT_ADMIN_DATE_LAN_10, CONTENT_ADMIN_DATE_LAN_11); + + $CONTENT_CONTENT_TABLE_CUSTOM_TAGS = ""; + $CUSTOM_TAGS = FALSE; + if($lastpage === TRUE && !empty($custom)){ + $CONTENT_CONTENT_TABLE_CUSTOM_PRE = ""; + $CONTENT_CONTENT_TABLE_CUSTOM_TAGS = ""; + //ksort($custom); + foreach($custom as $k => $v){ + if($k == "content_custom_presettags"){ + if(isset($content_pref["content_content_presettags"]) && $content_pref["content_content_presettags"]){ + foreach($v as $ck => $cv){ + if(is_array($cv)){ //date + if(!($cv['day']=="" && $cv['month']=="" && $cv['year']=="")){ + $vv = $cv['day']." ".$months[($cv['month']-1)]." ".$cv['year']; + } + }else{ + $vv = $cv; + } + if( isset($ck) && $ck != "" && isset($vv) && $vv!="" ){ + $CUSTOM_TAGS = TRUE; + $CONTENT_CONTENT_TABLE_CUSTOM_KEY = $tp->toHTML($ck, true); + $CONTENT_CONTENT_TABLE_CUSTOM_VALUE = $tp->toHTML($vv, true); + $CONTENT_CONTENT_TABLE_CUSTOM_TAGS .= preg_replace("/\{(.*?)\}/e", '$\1', $CONTENT_CONTENT_TABLE_CUSTOM); + } + } + } + }else{ + if(isset($content_pref["content_content_customtags"]) && $content_pref["content_content_customtags"]){ + $key = substr($k,15); + if( isset($key) && $key != "" && isset($v) && $v!="" ){ + $CUSTOM_TAGS = TRUE; + $CONTENT_CONTENT_TABLE_CUSTOM_KEY = $tp->toHTML($key, true); + $CONTENT_CONTENT_TABLE_CUSTOM_VALUE = $tp->toHTML($v, true); + $CONTENT_CONTENT_TABLE_CUSTOM_TAGS .= preg_replace("/\{(.*?)\}/e", '$\1', $CONTENT_CONTENT_TABLE_CUSTOM); + } + } + } + } + if($CUSTOM_TAGS === TRUE){ + $CONTENT_CONTENT_TABLE_CUSTOM_TAGS = $CONTENT_CONTENT_TABLE_CUSTOM_START.$CONTENT_CONTENT_TABLE_CUSTOM_TAGS.$CONTENT_CONTENT_TABLE_CUSTOM_END; + } + } + $text = $tp -> parseTemplate($CONTENT_CONTENT_TABLE, FALSE, $content_shortcodes); + $text = $aa -> getCrumbPage("item", $array, $row['content_parent']).$text; + $caption = $row['content_heading']; + $ns -> tablerender($caption, $text); + $cachecheck = CachePost($cachestr); + + //recheck some thing when caching is enabled + $pages = preg_split("/\[newpage.*?]/si", $row['content_text'], -1, PREG_SPLIT_NO_EMPTY); + $pages = array_values($pages); + $cachestr = "comment.$plugintable.$qs[1].$cacheid"; + if(count($pages) == 0){ + $lastpage = TRUE; + }else{ + if($cacheid == count($pages)){ + $lastpage = TRUE; + } + } + if($lastpage && ($row['content_comment'] || (isset($content_pref["content_content_comment_all"]) && $content_pref["content_content_comment_all"]))){ + $cachecheck = CachePre($cachestr); + if($cachecheck){ + echo $cachecheck; + return; + } + if((isset($content_pref["content_content_rating"]) && $content_pref["content_content_rating"] && $row['content_rate']) || (isset($content_pref["content_content_rating_all"]) && $content_pref["content_content_rating_all"]) ){ + $showrate = TRUE; + }else{ + $showrate = FALSE; + } + $width = 0; + $cobj->compose_comment($plugintable, "comment", $qs[1], $width, $row['content_heading'], $showrate); + $cachecheck = CachePost($cachestr); + } + } //close sql +} + +require_once(FOOTERF); + +?> \ No newline at end of file diff --git a/e107_plugins/content/content_manager.php b/e107_plugins/content/content_manager.php new file mode 100644 index 000000000..ec09281b1 --- /dev/null +++ b/e107_plugins/content/content_manager.php @@ -0,0 +1,179 @@ + setPageTitle(); + +//if(preg_match("#(.*?)_delete_(\d+)#",$deltest[$tp->toJS("delete")],$matches)){ +// $delete = $matches[1]; +// $del_id = $matches[2]; +//} + +if(isset($_POST['delete'])){ + $tmp = array_pop(array_flip($_POST['delete'])); + list($delete, $del_id) = explode("_", $tmp); +} + +//these have to be set for the tinymce wysiwyg +$e_wysiwyg = "content_text"; +//if(check_class($pref['post_html']) && $pref['wysiwyg'] && $e_wysiwyg == TRUE){ +if($pref['wysiwyg'] && $e_wysiwyg == TRUE){ + require_once(e_HANDLER."tiny_mce/wysiwyg.php"); + define("e_WYSIWYG",TRUE); + $tiny = wysiwyg($e_wysiwyg); +}else{ + define("e_WYSIWYG",FALSE); +} + +//include js +function headerjs(){ + global $tiny; + echo "\n"; + echo $tiny; +} +// ##### DB --------------------------------------------------------------------------------------- + +require_once(HEADERF); + +if(isset($_POST['create_content'])){ + if($_POST['content_text'] && $_POST['content_heading'] && $_POST['parent'] != "none"){ + $adb -> dbContent("create", "contentmanager"); + }else{ + $message = CONTENT_ADMIN_ITEM_LAN_0; + } +} + +if(isset($_POST['update_content'])){ + if($_POST['content_text'] && $_POST['content_heading'] && $_POST['parent'] != "none"){ + $adb -> dbContent("update", "contentmanager"); + }else{ + $message = CONTENT_ADMIN_ITEM_LAN_0; + } +} + +if($delete == 'content' && is_numeric($del_id)){ + if($sql -> db_Delete($plugintable, "content_id='$del_id' ")){ + $message = CONTENT_ADMIN_ITEM_LAN_3; + $e107cache->clear("content"); + } +} + +if(isset($message)){ + $ns -> tablerender("", "
    ".$message."
    "); +} + +if(!e_QUERY){ + if(USERID){ + $aform -> show_contentmanager("edit", USERID, USERNAME); + require_once(FOOTERF); + exit; + }else{ + header("location:".$plugindir."content.php"); exit; + } +}else{ + + if($qs[0] == "c"){ + $message = CONTENT_ADMIN_ITEM_LAN_1."

    ".CONTENT_ADMIN_ITEM_LAN_55; + $ns -> tablerender("", "
    ".$message."
    "); + require_once(FOOTERF); + exit; + + }elseif($qs[0] == "u"){ + $message = CONTENT_ADMIN_ITEM_LAN_2."

    ".CONTENT_ADMIN_ITEM_LAN_55; + $ns -> tablerender("", "
    ".$message."
    "); + require_once(FOOTERF); + exit; + + //show list of items in this category + }elseif($qs[0] == "content" && is_numeric($qs[1])){ + $aform -> show_manage_content("contentmanager", USERID, USERNAME); + + //create new item + }elseif($qs[0] == "content" && $qs[1] == "create" && is_numeric($qs[2])){ + $aform -> show_create_content("contentmanager", USERID, USERNAME); + + //edit item + }elseif($qs[0] == "content" && $qs[1] == "edit" && is_numeric($qs[2])){ + $aform -> show_create_content("contentmanager", USERID, USERNAME); + + //manage submitted + }elseif($qs[0] == "content" && $qs[1] == "submitted" && is_numeric($qs[2])){ + //$aform -> show_submitted("contentmanager", USERID, USERNAME, $qs[2]); + $aform -> show_submitted($qs[2]); + + //post submitted content item + }elseif($qs[0] == "content" && $qs[1] == "sa" && is_numeric($qs[2]) ){ + $newqs = array_reverse($qs); + if($newqs[0] == "cu"){ //item; submit post / update redirect + $mainparent = $aa -> getMainParent($qs[2]); + $message = CONTENT_ADMIN_ITEM_LAN_117."

    "; + $message .= CONTENT_ADMIN_ITEM_LAN_88." ".CONTENT_ADMIN_ITEM_LAN_90."
    "; + $message .= CONTENT_ADMIN_ITEM_LAN_89." ".CONTENT_ADMIN_ITEM_LAN_90."
    "; + $message .= CONTENT_ADMIN_ITEM_LAN_91." ".CONTENT_ADMIN_ITEM_LAN_90."
    "; + $message .= CONTENT_ADMIN_ITEM_LAN_124." ".CONTENT_ADMIN_ITEM_LAN_90.""; + $ns -> tablerender("", "
    ".$message."
    "); + require_once(e_ADMIN."footer.php"); + exit; + } + $aform -> show_create_content("sa", USERID, USERNAME); + + }else{ + header("location:".e_SELF); exit; + } +} + + +require_once(FOOTERF); + + + +?> \ No newline at end of file diff --git a/e107_plugins/content/content_shortcodes.php b/e107_plugins/content/content_shortcodes.php new file mode 100644 index 000000000..db979c5d6 --- /dev/null +++ b/e107_plugins/content/content_shortcodes.php @@ -0,0 +1,1030 @@ + e_sc -> parse_scbatch(__FILE__); +/* + +SC_BEGIN CONTENT_NEXTPREV +global $CONTENT_NEXTPREV; +return $CONTENT_NEXTPREV; +SC_END + +// CONTENT_TYPE_TABLE ------------------------------------------------ +SC_BEGIN CONTENT_TYPE_TABLE_TOTAL +global $contenttotal; +return $contenttotal." ".($contenttotal == 1 ? CONTENT_LAN_53 : CONTENT_LAN_54); +SC_END + +SC_BEGIN CONTENT_TYPE_TABLE_HEADING +global $CONTENT_TYPE_TABLE_HEADING, $contenttotal, $row, $tp; +$row['content_heading'] = $tp -> toHTML($row['content_heading'], TRUE, "emotes_off, no_make_clickable"); +return ($contenttotal != "0" ? "".$row['content_heading']."" : $row['content_heading'] ); +SC_END + +SC_BEGIN CONTENT_TYPE_TABLE_LINK +global $row, $tp; +$text = " +[".CONTENT_TYPE_LAN_0."] +[".CONTENT_TYPE_LAN_1."] +[".CONTENT_TYPE_LAN_2."] +[".CONTENT_TYPE_LAN_3."] +[".CONTENT_TYPE_LAN_4."] +[".CONTENT_TYPE_LAN_5."]"; +return $text; +SC_END + + +SC_BEGIN CONTENT_TYPE_TABLE_SUBHEADING +global $CONTENT_TYPE_TABLE_SUBHEADING, $contenttotal, $row, $tp; +$row['content_subheading'] = $tp -> toHTML($row['content_subheading'], TRUE, "emotes_off, no_make_clickable"); +return ($row['content_subheading'] ? $row['content_subheading'] : ""); +SC_END + +SC_BEGIN CONTENT_TYPE_TABLE_ICON +global $CONTENT_TYPE_TABLE_ICON, $contenttotal, $row, $aa, $content_cat_icon_path_large, $content_pref; +if($contenttotal != "0"){ + $CONTENT_TYPE_TABLE_ICON = $aa -> getIcon("catlarge", $row['content_icon'], $content_cat_icon_path_large, "cat.".$row['content_id'], "", $content_pref["content_blank_caticon"]); +}else{ + $CONTENT_TYPE_TABLE_ICON = $aa -> getIcon("catlarge", $row['content_icon'], $content_cat_icon_path_large, "", "", $content_pref["content_blank_caticon"]); +} +return $CONTENT_TYPE_TABLE_ICON; +SC_END + +// CONTENT_TYPE_TABLE_SUBMIT ------------------------------------------------ +SC_BEGIN CONTENT_TYPE_TABLE_SUBMIT_ICON +global $CONTENT_TYPE_TABLE_SUBMIT_ICON, $plugindir; +return "".CONTENT_ICON_SUBMIT.""; +SC_END + +SC_BEGIN CONTENT_TYPE_TABLE_SUBMIT_HEADING +global $CONTENT_TYPE_TABLE_SUBMIT_HEADING, $plugindir; +return "".CONTENT_LAN_65.""; +SC_END + +SC_BEGIN CONTENT_TYPE_TABLE_SUBMIT_SUBHEADING +global $CONTENT_TYPE_TABLE_SUBMIT_SUBHEADING; +return CONTENT_LAN_66; +SC_END + +// CONTENT_TYPE_TABLE_MANAGER ------------------------------------------------ +SC_BEGIN CONTENT_TYPE_TABLE_MANAGER_ICON +global $CONTENT_TYPE_TABLE_MANAGER_ICON, $plugindir; +return "".CONTENT_ICON_CONTENTMANAGER.""; +SC_END + +SC_BEGIN CONTENT_TYPE_TABLE_MANAGER_HEADING +global $CONTENT_TYPE_TABLE_MANAGER_HEADING, $plugindir; +return "".CONTENT_LAN_67.""; +SC_END + +SC_BEGIN CONTENT_TYPE_TABLE_MANAGER_SUBHEADING +global $CONTENT_TYPE_TABLE_MANAGER_SUBHEADING; +return CONTENT_LAN_68; +SC_END + +// CONTENT_TOP_TABLE ------------------------------------------------ +SC_BEGIN CONTENT_TOP_TABLE_HEADING +global $CONTENT_TOP_TABLE_HEADING, $row, $qs; +return "".$row['content_heading'].""; +SC_END + +SC_BEGIN CONTENT_TOP_TABLE_ICON +global $CONTENT_TOP_TABLE_ICON, $aa, $row, $content_pref, $content_icon_path, $qs, $mainparent; +if($content_pref["content_top_icon"]){ +$width = (isset($content_pref["content_upload_icon_size"]) && $content_pref["content_upload_icon_size"] ? $content_pref["content_upload_icon_size"] : "100"); +$width = (isset($content_pref["content_top_icon_width"]) && $content_pref["content_top_icon_width"] ? $content_pref["content_top_icon_width"] : $width); +return $aa -> getIcon("item", $row['content_icon'], $content_icon_path, "content.".$row['content_id'], $width, $content_pref["content_blank_icon"]); +} +SC_END + +SC_BEGIN CONTENT_TOP_TABLE_AUTHOR +global $CONTENT_TOP_TABLE_AUTHOR; +return $CONTENT_TOP_TABLE_AUTHOR; +SC_END + +SC_BEGIN CONTENT_TOP_TABLE_RATING +global $CONTENT_TOP_TABLE_RATING, $row; +$row['rate_avg'] = round($row['rate_avg'], 1); +$row['rate_avg'] = (strlen($row['rate_avg'])>1 ? $row['rate_avg'] : $row['rate_avg'].".0"); +$tmp = explode(".", $row['rate_avg']); +$rating = ""; +$rating .= $row['rate_avg']." "; +for($c=1; $c<= $tmp[0]; $c++){ + $rating .= ""; +} +if($tmp[0] < 10){ + for($c=9; $c>=$tmp[0]; $c--){ + $rating .= ""; + } +} +$rating .= ""; +return $rating; +SC_END + +// CONTENT_SCORE_TABLE ------------------------------------------------ +SC_BEGIN CONTENT_SCORE_TABLE_HEADING +global $CONTENT_SCORE_TABLE_HEADING, $row, $qs; +return "".$row['content_heading'].""; +SC_END + +SC_BEGIN CONTENT_SCORE_TABLE_ICON +global $CONTENT_SCORE_TABLE_ICON, $aa, $row, $content_pref, $content_icon_path, $qs, $mainparent; +if(isset($content_pref["content_score_icon"]) && $content_pref["content_score_icon"]){ +$width = (isset($content_pref["content_upload_icon_size"]) && $content_pref["content_upload_icon_size"] ? $content_pref["content_upload_icon_size"] : "100"); +$width = (isset($content_pref["content_score_icon_width"]) && $content_pref["content_score_icon_width"] ? $content_pref["content_score_icon_width"] : $width); +return $aa -> getIcon("item", $row['content_icon'], $content_icon_path, "content.".$row['content_id'], $width, $content_pref["content_blank_icon"]); +} +SC_END + +SC_BEGIN CONTENT_SCORE_TABLE_AUTHOR +global $CONTENT_SCORE_TABLE_AUTHOR; +return $CONTENT_SCORE_TABLE_AUTHOR; +SC_END + +SC_BEGIN CONTENT_SCORE_TABLE_SCORE +global $CONTENT_SCORE_TABLE_SCORE, $row; +$score = $row['content_score']; +$height = "height:8px;"; +$img = ""; +$img .= ""; +$img .= ""; +$img .= ""; +if($score < 100){ + $empty = 100-$score; + $img .= ""; +} +$img .= ""; +return $score."/100 ".$img; +SC_END + +// CONTENT_SUBMIT_TYPE_TABLE ------------------------------------------------ +SC_BEGIN CONTENT_SUBMIT_TYPE_TABLE_HEADING +global $CONTENT_SUBMIT_TYPE_TABLE_HEADING, $row; +return "".$row['content_heading'].""; +SC_END + +SC_BEGIN CONTENT_SUBMIT_TYPE_TABLE_SUBHEADING +global $CONTENT_SUBMIT_TYPE_TABLE_SUBHEADING, $row; +return ($row['content_subheading'] ? $row['content_subheading'] : ""); +SC_END + +SC_BEGIN CONTENT_SUBMIT_TYPE_TABLE_ICON +global $CONTENT_SUBMIT_TYPE_TABLE_ICON, $aa, $row, $content_cat_icon_path_large, $content_pref; +return $aa -> getIcon("catlarge", $row['content_icon'], $content_cat_icon_path_large, "content.submit.".$row['content_id'], "", $content_pref["content_blank_caticon"]); +SC_END + +// CONTENT_CONTENT_TABLEMANAGER ------------------------------------------------ +SC_BEGIN CONTENT_CONTENTMANAGER_CATEGORY +global $CONTENT_CONTENTMANAGER_CATEGORY, $row, $content_pref; +if( (isset($content_pref["content_manager_personal"]) && check_class($content_pref["content_manager_personal"])) || (isset($content_pref["content_manager_category"]) && check_class($content_pref["content_manager_category"])) || (isset($content_pref["content_manager_approve"]) && check_class($content_pref["content_manager_approve"])) ){ +return "".$row['content_heading'].""; +} +SC_END + +SC_BEGIN CONTENT_CONTENTMANAGER_ICONNEW +global $CONTENT_CONTENTMANAGER_ICONNEW, $row, $content_pref; +if( (isset($content_pref["content_manager_personal"]) && check_class($content_pref["content_manager_personal"])) || (isset($content_pref["content_manager_category"]) && check_class($content_pref["content_manager_category"])) ){ +return "".CONTENT_ICON_NEW.""; +//return ""; +} +SC_END + +SC_BEGIN CONTENT_CONTENTMANAGER_ICONEDIT +global $CONTENT_CONTENTMANAGER_ICONEDIT, $row, $content_pref; +if( (isset($content_pref["content_manager_personal"]) && check_class($content_pref["content_manager_personal"])) || (isset($content_pref["content_manager_category"]) && check_class($content_pref["content_manager_category"])) ){ +return "".CONTENT_ICON_EDIT.""; +//return ""; +} +SC_END + +SC_BEGIN CONTENT_CONTENTMANAGER_ICONSUBM +global $CONTENT_CONTENTMANAGER_ICONSUBM, $row, $content_pref, $plugintable; +if(isset($content_pref["content_manager_approve"]) && check_class($content_pref["content_manager_approve"])){ + if(!is_object($sqls)){ $sqls = new db; } + $num = $sqls -> db_Count($plugintable, "(*)", "WHERE content_refer = 'sa' AND content_parent='".intval($row['content_id'])."' "); + if($num>0){ + return "".CONTENT_ICON_SUBMIT_SMALL.""; + } +} +SC_END + + +// CONTENT_AUTHOR_TABLE ------------------------------------------------ +SC_BEGIN CONTENT_AUTHOR_TABLE_NAME +global $CONTENT_AUTHOR_TABLE_NAME, $authordetails, $i, $qs, $row; +$name = ($authordetails[$i][1] == "" ? "... ".CONTENT_LAN_29." ..." : $authordetails[$i][1]); +$authorlink = "".$name.""; +return $authorlink; +SC_END + +SC_BEGIN CONTENT_AUTHOR_TABLE_ICON +global $CONTENT_AUTHOR_TABLE_ICON, $qs, $row; +return "".CONTENT_ICON_AUTHORLIST.""; +SC_END + +SC_BEGIN CONTENT_AUTHOR_TABLE_TOTAL +global $CONTENT_AUTHOR_TABLE_TOTAL, $totalcontent, $mainparent, $content_pref; +if($content_pref["content_author_amount"]){ +$CONTENT_AUTHOR_TABLE_TOTAL = $totalcontent." ".($totalcontent==1 ? CONTENT_LAN_53 : CONTENT_LAN_54); +return $CONTENT_AUTHOR_TABLE_TOTAL; +} +SC_END + +SC_BEGIN CONTENT_AUTHOR_TABLE_LASTITEM +global $CONTENT_AUTHOR_TABLE_LASTITEM, $gen, $row, $mainparent, $content_pref; +if($content_pref["content_author_lastitem"]){ +if(!is_object($gen)){ $gen = new convert; } +$CONTENT_AUTHOR_TABLE_LASTITEM = preg_replace("# -.*#", "", $gen -> convert_date($row['content_datestamp'], "short")); +$CONTENT_AUTHOR_TABLE_LASTITEM .= " : ".$row['content_heading'].""; +return $CONTENT_AUTHOR_TABLE_LASTITEM; +} +SC_END + +// CONTENT_CAT_TABLE ------------------------------------------------ +SC_BEGIN CONTENT_CAT_TABLE_INFO_PRE +global $CONTENT_CAT_TABLE_INFO_PRE; +if($CONTENT_CAT_TABLE_INFO_PRE === TRUE){ +$CONTENT_CAT_TABLE_INFO_PRE = " "; +return $CONTENT_CAT_TABLE_INFO_PRE; +} +SC_END +SC_BEGIN CONTENT_CAT_TABLE_INFO_POST +global $CONTENT_CAT_TABLE_INFO_POST; +if($CONTENT_CAT_TABLE_INFO_POST === TRUE){ +$CONTENT_CAT_TABLE_INFO_POST = " "; +return $CONTENT_CAT_TABLE_INFO_POST; +} +SC_END + +SC_BEGIN CONTENT_CAT_TABLE_ICON +global $CONTENT_CAT_TABLE_ICON, $aa, $totalitems, $row, $content_pref, $qs, $content_cat_icon_path_large, $mainparent; +if(isset($content_pref["content_catall_icon"]) && $content_pref["content_catall_icon"]){ + //$qry = ($totalitems > 0 ? "cat.".$row['content_id'] : ""); + $qry = "cat.".$row['content_id']; + return $aa -> getIcon("catlarge", $row['content_icon'], $content_cat_icon_path_large, $qry, "", $content_pref["content_blank_caticon"]); +} +SC_END + +SC_BEGIN CONTENT_CAT_TABLE_HEADING +global $CONTENT_CAT_TABLE_HEADING, $row, $totalitems, $tp; +//return ($totalitems > 0 ? "".$tp -> toHTML($row['content_heading'], TRUE, "")."" : $tp -> toHTML($row['content_heading'], TRUE, "") ); +return "".$tp -> toHTML($row['content_heading'], TRUE, "").""; +SC_END + +SC_BEGIN CONTENT_CAT_TABLE_AMOUNT +global $CONTENT_CAT_TABLE_AMOUNT, $aa, $row, $totalitems, $mainparent, $content_pref; +if(isset($content_pref["content_catall_amount"]) && $content_pref["content_catall_amount"]){ +$n = $totalitems; +$CONTENT_CAT_TABLE_AMOUNT = $n." ".($n == "1" ? CONTENT_LAN_53 : CONTENT_LAN_54); +return $CONTENT_CAT_TABLE_AMOUNT; +} +SC_END + +SC_BEGIN CONTENT_CAT_TABLE_SUBHEADING +global $CONTENT_CAT_TABLE_SUBHEADING, $row, $tp, $mainparent, $content_pref; +if(isset($content_pref["content_catall_subheading"]) && $content_pref["content_catall_subheading"]){ +return ($row['content_subheading'] ? $tp -> toHTML($row['content_subheading'], TRUE, "") : ""); +} +SC_END + +SC_BEGIN CONTENT_CAT_TABLE_DATE +global $CONTENT_CAT_TABLE_DATE, $gen, $row, $mainparent, $content_pref, $gen; +if(isset($content_pref["content_catall_date"]) && $content_pref["content_catall_date"]){ +if(!is_object($gen)){ $gen = new convert; } +$datestamp = preg_replace("# -.*#", "", $gen -> convert_date($row['content_datestamp'], "long")); +$DATE = ($datestamp != "" ? $datestamp : ""); +return $DATE; +} +SC_END + +SC_BEGIN CONTENT_CAT_TABLE_AUTHORDETAILS +global $CONTENT_CAT_TABLE_AUTHORDETAILS; +return $CONTENT_CAT_TABLE_AUTHORDETAILS; +SC_END + +SC_BEGIN CONTENT_CAT_TABLE_EPICONS +global $CONTENT_CAT_TABLE_EPICONS, $row, $tp, $mainparent, $content_pref; +$EPICONS = ""; +if($row['content_pe'] && isset($content_pref["content_catall_peicon"]) && $content_pref["content_catall_peicon"]){ + $EPICONS = $tp -> parseTemplate("{EMAIL_ITEM=".CONTENT_LAN_69." ".CONTENT_LAN_72."^plugin:content.".$row['content_id']."}"); + $EPICONS .= " ".$tp -> parseTemplate("{PRINT_ITEM=".CONTENT_LAN_70." ".CONTENT_LAN_72."^plugin:content.".$row['content_id']."}"); + $EPICONS .= " ".$tp -> parseTemplate("{PDF=".CONTENT_LAN_76." ".CONTENT_LAN_71."^plugin:content.".$row['content_id']."}"); +return $EPICONS; +} +SC_END + +SC_BEGIN CONTENT_CAT_TABLE_COMMENT +global $CONTENT_CAT_TABLE_COMMENT, $row, $qs, $comment_total, $mainparent, $content_pref, $plugintable; +if($row['content_comment'] && isset($content_pref["content_catall_comment"]) && $content_pref["content_catall_comment"]){ +$sqlc = new db; +$comment_total = $sqlc -> db_Select("comments", "*", "comment_item_id='".$row['content_id']."' AND comment_type='".$plugintable."' AND comment_pid='0' "); +return "".CONTENT_LAN_57." ".$comment_total.""; +} +SC_END + +SC_BEGIN CONTENT_CAT_TABLE_TEXT +global $CONTENT_CAT_TABLE_TEXT, $row, $tp, $mainparent, $content_pref; +if($row['content_text'] && isset($content_pref["content_catall_text"]) && $content_pref["content_catall_text"] && ($content_pref["content_catall_text_char"] > 0 || $content_pref["content_catall_text_char"] == 'all')){ + if($content_pref["content_catall_text_char"] == 'all'){ + $CONTENT_CAT_TABLE_TEXT = $row['content_text']; + }else{ + $rowtext = preg_replace("/\[newpage.*?]/si", " ", $row['content_text']); + $rowtext = $tp->toHTML($rowtext, TRUE, "nobreak"); + + $rowtext = strip_tags($rowtext); + $words = explode(" ", $rowtext); + $CONTENT_CAT_TABLE_TEXT = implode(" ", array_slice($words, 0, $content_pref["content_catall_text_char"])); + if($content_pref["content_catall_text_link"]){ + $CONTENT_CAT_TABLE_TEXT .= " ".$content_pref["content_catall_text_post"].""; + }else{ + $CONTENT_CAT_TABLE_TEXT .= " ".$content_pref["content_catall_text_post"]; + } + } +return $CONTENT_CAT_TABLE_TEXT; +} +SC_END + +SC_BEGIN CONTENT_CAT_TABLE_RATING +global $CONTENT_CAT_TABLE_RATING, $row, $rater, $mainparent, $content_pref, $plugintable; +$RATING = ""; +if($row['content_rate'] && isset($content_pref["content_catall_rating"]) && $content_pref["content_catall_rating"]){ +return $rater->composerating($plugintable, $row['content_id'], $enter=TRUE, $userid=FALSE); +} +return $RATING; +SC_END + +// CONTENT_CAT_LIST_TABLE ------------------------------------------------ +SC_BEGIN CONTENT_CAT_LIST_TABLE_INFO_PRE +global $CONTENT_CAT_LIST_TABLE_INFO_PRE; +if($CONTENT_CAT_LIST_TABLE_INFO_PRE === TRUE){ +$CONTENT_CAT_LIST_TABLE_INFO_PRE = " "; +return $CONTENT_CAT_LIST_TABLE_INFO_PRE; +} +SC_END +SC_BEGIN CONTENT_CAT_LIST_TABLE_INFO_POST +global $CONTENT_CAT_LIST_TABLE_INFO_POST; +if($CONTENT_CAT_LIST_TABLE_INFO_POST === TRUE){ +$CONTENT_CAT_LIST_TABLE_INFO_POST = " "; +return $CONTENT_CAT_LIST_TABLE_INFO_POST; +} +SC_END + +SC_BEGIN CONTENT_CAT_LIST_TABLE_ICON +global $CONTENT_CAT_LIST_TABLE_ICON, $aa, $row, $qs, $content_pref, $content_cat_icon_path_large, $mainparent; +if(isset($content_pref["content_cat_icon"]) && $content_pref["content_cat_icon"]){ +return $aa -> getIcon("catlarge", $row['content_icon'], $content_cat_icon_path_large, "", "", $content_pref["content_blank_caticon"]);; +} +SC_END + +SC_BEGIN CONTENT_CAT_LIST_TABLE_HEADING +global $CONTENT_CAT_LIST_TABLE_HEADING, $tp, $row, $totalparent, $tp; +return ($totalparent > 0 ? "".$tp -> toHTML($row['content_heading'], TRUE, "")."" : $tp -> toHTML($row['content_heading'], TRUE, "") ); +SC_END + +SC_BEGIN CONTENT_CAT_LIST_TABLE_SUMMARY +global $CONTENT_CAT_LIST_TABLE_SUMMARY, $tp, $row, $mainparent; +return ($row['content_summary'] ? $tp -> toHTML($row['content_summary'], TRUE, "") : ""); +SC_END + +SC_BEGIN CONTENT_CAT_LIST_TABLE_TEXT +global $CONTENT_CAT_LIST_TABLE_TEXT, $tp, $row, $mainparent, $content_pref; +if($row['content_text'] && isset($content_pref["content_cat_text"]) && $content_pref["content_cat_text"] && ($content_pref["content_cat_text_char"] > 0 || $content_pref["content_cat_text_char"] == 'all')){ + if($content_pref["content_cat_text_char"] == 'all'){ + //$CONTENT_CAT_LIST_TABLE_TEXT = $row['content_text']; + $CONTENT_CAT_LIST_TABLE_TEXT = $tp->toHTML($row['content_text'], TRUE, "constants"); + }else{ + $rowtext = preg_replace("/\[newpage.*?]/si", " ", $row['content_text']); + $rowtext = $tp->toHTML($rowtext, TRUE, "nobreak constants"); + + $rowtext = strip_tags($rowtext); + $words = explode(" ", $rowtext); + $CONTENT_CAT_LIST_TABLE_TEXT = implode(" ", array_slice($words, 0, $content_pref["content_cat_text_char"])); + if($content_pref["content_cat_text_link"]){ + $CONTENT_CAT_LIST_TABLE_TEXT .= " ".$content_pref["content_cat_text_post"].""; + }else{ + $CONTENT_CAT_LIST_TABLE_TEXT .= " ".$content_pref["content_cat_text_post"]; + } + } +return $CONTENT_CAT_LIST_TABLE_TEXT; +} +SC_END + +SC_BEGIN CONTENT_CAT_LIST_TABLE_AMOUNT +global $CONTENT_CAT_LIST_TABLE_AMOUNT, $aa, $row, $mainparent, $content_pref, $totalparent; +if(isset($content_pref["content_cat_amount"]) && $content_pref["content_cat_amount"]){ +$n = $totalparent; +$n = $n." ".($n == "1" ? CONTENT_LAN_53 : CONTENT_LAN_54); +return $n; +} +SC_END + +SC_BEGIN CONTENT_CAT_LIST_TABLE_SUBHEADING +global $CONTENT_CAT_LIST_TABLE_SUBHEADING, $tp, $row, $mainparent, $content_pref; +if(isset($content_pref["content_cat_subheading"]) && $content_pref["content_cat_subheading"]){ +return ($row['content_subheading'] ? $tp -> toHTML($row['content_subheading'], TRUE, "") : ""); +} +SC_END + +SC_BEGIN CONTENT_CAT_LIST_TABLE_DATE +global $CONTENT_CAT_LIST_TABLE_DATE, $row, $gen, $mainparent, $content_pref, $gen; +if(isset($content_pref["content_cat_date"]) && $content_pref["content_cat_date"]){ +if(!is_object($gen)){ $gen = new convert; } +$datestamp = preg_replace("# -.*#", "", $gen -> convert_date($row['content_datestamp'], "long")); +return ($datestamp != "" ? $datestamp : ""); +} +SC_END + +SC_BEGIN CONTENT_CAT_LIST_TABLE_AUTHORDETAILS +global $CONTENT_CAT_LIST_TABLE_AUTHORDETAILS; +return $CONTENT_CAT_LIST_TABLE_AUTHORDETAILS; +SC_END + +SC_BEGIN CONTENT_CAT_LIST_TABLE_EPICONS +global $CONTENT_CAT_LIST_TABLE_EPICONS, $row, $tp, $qs, $mainparent, $content_pref; +$EPICONS = ""; +if( (isset($content_pref["content_cat_peicon"]) && $content_pref["content_cat_peicon"] && $row['content_pe']) || (isset($content_pref["content_cat_peicon_all"]) && $content_pref["content_cat_peicon_all"])){ + $EPICONS = $tp -> parseTemplate("{EMAIL_ITEM=".CONTENT_LAN_69." ".CONTENT_LAN_72."^plugin:content.$qs[1]}"); + $EPICONS .= " ".$tp -> parseTemplate("{PRINT_ITEM=".CONTENT_LAN_70." ".CONTENT_LAN_72."^plugin:content.$qs[1]}"); + $EPICONS .= " ".$tp -> parseTemplate("{PDF=".CONTENT_LAN_76." ".CONTENT_LAN_71."^plugin:content.$qs[1]}"); +return $EPICONS; +} +SC_END + +SC_BEGIN CONTENT_CAT_LIST_TABLE_COMMENT +global $CONTENT_CAT_LIST_TABLE_COMMENT, $qs, $row, $comment_total, $mainparent, $content_pref, $sql, $plugintable; +if($row['content_comment'] && isset($content_pref["content_cat_comment"]) && $content_pref["content_cat_comment"]){ + $comment_total = $sql -> db_Count("comments", "(*)", "WHERE comment_item_id='".intval($qs[1])."' AND comment_type='".$plugintable."' AND comment_pid='0' "); + return "".CONTENT_LAN_57." ".$comment_total.""; +} +SC_END + +SC_BEGIN CONTENT_CAT_LIST_TABLE_RATING +global $CONTENT_CAT_LIST_TABLE_RATING, $row, $rater, $content_pref, $mainparent, $plugintable; +$RATING = ""; +if( (isset($content_pref["content_cat_rating_all"]) && $content_pref["content_cat_rating_all"]) || (isset($content_pref["content_cat_rating"]) && $content_pref["content_cat_rating"] && $row['content_rate'])){ + return $rater->composerating($plugintable, $row['content_id'], $enter=TRUE, $userid=FALSE); +} +return $RATING; +SC_END + +// CONTENT_CAT_LISTSUB ------------------------------------------------ +SC_BEGIN CONTENT_CAT_LISTSUB_TABLE_ICON +global $CONTENT_CAT_LISTSUB_TABLE_ICON, $aa, $row, $content_pref, $qs, $mainparent, $content_cat_icon_path_small; +if(isset($content_pref["content_catsub_icon"]) && $content_pref["content_catsub_icon"]){ +return $aa -> getIcon("catsmall", $row['content_icon'], $content_cat_icon_path_small, "cat.".$row['content_id'], "", $content_pref["content_blank_caticon"]); +} +SC_END + +SC_BEGIN CONTENT_CAT_LISTSUB_TABLE_HEADING +global $CONTENT_CAT_LISTSUB_TABLE_HEADING, $tp, $row, $totalsubcat, $tp; +return ($totalsubcat > 0 ? "".$tp -> toHTML($row['content_heading'], TRUE, "")."" : $tp -> toHTML($row['content_heading'], TRUE, "") ); +SC_END + +SC_BEGIN CONTENT_CAT_LISTSUB_TABLE_AMOUNT +global $CONTENT_CAT_LISTSUB_TABLE_AMOUNT, $aa, $row, $content_pref, $mainparent, $totalsubcat; +if(isset($content_pref["content_catsub_amount"]) && $content_pref["content_catsub_amount"]){ +$n = $totalsubcat; +$n = $n." ".($n == "1" ? CONTENT_LAN_53 : CONTENT_LAN_54); +return $n; +} +SC_END + +SC_BEGIN CONTENT_CAT_LISTSUB_TABLE_SUBHEADING +global $CONTENT_CAT_LISTSUB_TABLE_SUBHEADING, $row, $tp, $content_pref, $mainparent; +if(isset($content_pref["content_catsub_subheading"]) && $content_pref["content_catsub_subheading"]){ +return ($row['content_subheading'] ? $tp -> toHTML($row['content_subheading'], TRUE, "") : ""); +} +SC_END + +// CONTENT_SEARCH_TABLE ------------------------------------------------ +SC_BEGIN CONTENT_SEARCH_TABLE_SELECT +global $CONTENT_SEARCH_TABLE_SELECT; +return $CONTENT_SEARCH_TABLE_SELECT; +SC_END + +SC_BEGIN CONTENT_SEARCH_TABLE_ORDER +global $CONTENT_SEARCH_TABLE_ORDER; +return $CONTENT_SEARCH_TABLE_ORDER; +SC_END + +SC_BEGIN CONTENT_SEARCH_TABLE_KEYWORD +global $CONTENT_SEARCH_TABLE_KEYWORD; +return $CONTENT_SEARCH_TABLE_KEYWORD; +SC_END + +// CONTENT_SEARCHRESULT_TABLE ------------------------------------------------ +SC_BEGIN CONTENT_SEARCHRESULT_TABLE_ICON +global $CONTENT_SEARCHRESULT_TABLE_ICON, $aa, $row, $content_icon_path, $qs, $content_pref, $mainparent; +$width = (isset($content_pref["content_upload_icon_size"]) && $content_pref["content_upload_icon_size"] ? $content_pref["content_upload_icon_size"] : "100"); +return $aa -> getIcon("item", $row['content_icon'], $content_icon_path, "content.".$row['content_id'], $width, $content_pref["content_blank_icon"]); +SC_END + +SC_BEGIN CONTENT_SEARCHRESULT_TABLE_HEADING +global $CONTENT_SEARCHRESULT_TABLE_HEADING, $row, $qs, $tp; +return ($row['content_heading'] ? "".$tp -> toHTML($row['content_heading'], TRUE, "")."" : ""); +SC_END + +SC_BEGIN CONTENT_SEARCHRESULT_TABLE_SUBHEADING +global $CONTENT_SEARCHRESULT_TABLE_SUBHEADING, $row, $tp; +return ($row['content_subheading'] ? $tp -> toHTML($row['content_subheading'], TRUE, "") : ""); +SC_END + +SC_BEGIN CONTENT_SEARCHRESULT_TABLE_AUTHORDETAILS +global $CONTENT_SEARCHRESULT_TABLE_AUTHORDETAILS, $qs, $aa, $row; +$authordetails = $aa -> getAuthor($row['content_author']); +$CONTENT_SEARCHRESULT_TABLE_AUTHORDETAILS = $authordetails[1]; +if(USER){ + if(is_numeric($authordetails[3])){ + $CONTENT_SEARCHRESULT_TABLE_AUTHORDETAILS .= " ".CONTENT_ICON_USER.""; + }else{ + $CONTENT_SEARCHRESULT_TABLE_AUTHORDETAILS .= " ".CONTENT_ICON_USER; + } +}else{ + $CONTENT_SEARCHRESULT_TABLE_AUTHORDETAILS .= " ".CONTENT_ICON_USER; +} +$CONTENT_SEARCHRESULT_TABLE_AUTHORDETAILS .= " ".CONTENT_ICON_AUTHORLIST.""; +return $CONTENT_SEARCHRESULT_TABLE_AUTHORDETAILS; +SC_END + +SC_BEGIN CONTENT_SEARCHRESULT_TABLE_DATE +global $CONTENT_SEARCHRESULT_TABLE_DATE, $gen, $row; +$datestamp = preg_replace("# -.*#", "", $gen -> convert_date($row['content_datestamp'], "short")); +return $datestamp; +SC_END + +SC_BEGIN CONTENT_SEARCHRESULT_TABLE_TEXT +global $CONTENT_SEARCHRESULT_TABLE_TEXT, $row, $tp; +return ($row['content_text'] ? $tp -> toHTML($row['content_text'], TRUE, "") : ""); +SC_END + +// CONTENT_RECENT_TABLE ------------------------------------------------ +SC_BEGIN CONTENT_RECENT_TABLE_INFOPRE +global $CONTENT_RECENT_TABLE_INFOPRE; +if($CONTENT_RECENT_TABLE_INFOPRE === TRUE){ +$CONTENT_RECENT_TABLE_INFOPRE = " "; +return $CONTENT_RECENT_TABLE_INFOPRE; +} +SC_END +SC_BEGIN CONTENT_RECENT_TABLE_INFOPOST +global $CONTENT_RECENT_TABLE_INFOPOST; +if($CONTENT_RECENT_TABLE_INFOPOST === TRUE){ +$CONTENT_RECENT_TABLE_INFOPOST = " "; +return $CONTENT_RECENT_TABLE_INFOPOST; +} +SC_END + +SC_BEGIN CONTENT_RECENT_TABLE_ICON +global $CONTENT_RECENT_TABLE_ICON, $aa, $row, $content_icon_path, $content_pref, $mainparent; +if(isset($content_pref["content_list_icon"]) && $content_pref["content_list_icon"]){ +$width = (isset($content_pref["content_upload_icon_size"]) && $content_pref["content_upload_icon_size"] ? $content_pref["content_upload_icon_size"] : "100"); +return $aa -> getIcon("item", $row['content_icon'], $content_icon_path, "content.".$row['content_id'], $width, $content_pref["content_blank_icon"]); +} +SC_END + +SC_BEGIN CONTENT_RECENT_TABLE_HEADING +global $CONTENT_RECENT_TABLE_HEADING, $row, $tp; +return ($row['content_heading'] ? "".$tp->toHTML($row['content_heading'], TRUE, "")."" : ""); +SC_END + +SC_BEGIN CONTENT_RECENT_TABLE_SUBHEADING +global $CONTENT_RECENT_TABLE_SUBHEADING, $tp, $content_pref, $qs, $row, $mainparent; +if (isset($content_pref["content_list_subheading"]) && $content_pref["content_list_subheading"] && $row['content_subheading'] && $content_pref["content_list_subheading_char"] && $content_pref["content_list_subheading_char"] != "" && $content_pref["content_list_subheading_char"] != "0"){ + if(strlen($row['content_subheading']) > $content_pref["content_list_subheading_char"]) { + $row['content_subheading'] = substr($row['content_subheading'], 0, $content_pref["content_list_subheading_char"]).$content_pref["content_list_subheading_post"]; + } + $CONTENT_RECENT_TABLE_SUBHEADING = ($row['content_subheading'] != "" && $row['content_subheading'] != " " ? $row['content_subheading'] : ""); +}else{ + $CONTENT_RECENT_TABLE_SUBHEADING = ($row['content_subheading'] ? $row['content_subheading'] : ""); +} +return $tp->toHTML($CONTENT_RECENT_TABLE_SUBHEADING, TRUE, ""); +SC_END + +SC_BEGIN CONTENT_RECENT_TABLE_SUMMARY +global $CONTENT_RECENT_TABLE_SUMMARY, $content_pref, $tp, $qs, $row, $mainparent; +if (isset($content_pref["content_list_summary"]) && $content_pref["content_list_summary"]){ + if($row['content_summary'] && $content_pref["content_list_summary_char"] && $content_pref["content_list_summary_char"] != "" && $content_pref["content_list_summary_char"] != "0"){ + if(strlen($row['content_summary']) > $content_pref["content_list_summary_char"]) { + $row['content_summary'] = substr($row['content_summary'], 0, $content_pref["content_list_summary_char"]).$content_pref["content_list_summary_post"]; + } + $CONTENT_RECENT_TABLE_SUMMARY = ($row['content_summary'] != "" && $row['content_summary'] != " " ? $row['content_summary'] : ""); + }else{ + $CONTENT_RECENT_TABLE_SUMMARY = ($row['content_summary'] ? $row['content_summary'] : ""); + } +return $tp->toHTML($CONTENT_RECENT_TABLE_SUMMARY, TRUE, ""); +} +SC_END + +SC_BEGIN CONTENT_RECENT_TABLE_TEXT +global $CONTENT_RECENT_TABLE_TEXT, $content_pref, $qs, $row, $mainparent, $tp; +if(isset($content_pref["content_list_text"]) && $content_pref["content_list_text"] && $content_pref["content_list_text_char"] > 0){ + $rowtext = preg_replace("/\[newpage.*?]/si", " ", $row['content_text']); + //$rowtext = str_replace ("
    ", " ", $rowtext); + $rowtext = $tp->toHTML($rowtext, TRUE, "nobreak"); + $rowtext = strip_tags($rowtext); + $words = explode(" ", $rowtext); + $CONTENT_RECENT_TABLE_TEXT = implode(" ", array_slice($words, 0, $content_pref["content_list_text_char"])); + if($CONTENT_RECENT_TABLE_TEXT){ + if($content_pref["content_list_text_link"]){ + $CONTENT_RECENT_TABLE_TEXT .= " ".$content_pref["content_list_text_post"].""; + }else{ + $CONTENT_RECENT_TABLE_TEXT .= " ".$content_pref["content_list_text_post"]; + } + } +} +return $CONTENT_RECENT_TABLE_TEXT; +SC_END + +SC_BEGIN CONTENT_RECENT_TABLE_DATE +global $CONTENT_RECENT_TABLE_DATE, $content_pref, $qs, $row, $mainparent; +if(isset($content_pref["content_list_date"]) && $content_pref["content_list_date"]){ +$datestyle = ($content_pref["content_list_datestyle"] ? $content_pref["content_list_datestyle"] : "%d %b %Y"); +return strftime($datestyle, $row['content_datestamp']); +} +SC_END + +SC_BEGIN CONTENT_RECENT_TABLE_EPICONS +global $CONTENT_RECENT_TABLE_EPICONS, $tp, $content_pref, $qs, $row, $mainparent; +$CONTENT_RECENT_TABLE_EPICONS = ""; +if(isset($content_pref["content_list_peicon"]) && $content_pref["content_list_peicon"]){ + if($row['content_pe'] || isset($content_pref["content_list_peicon_all"]) && $content_pref["content_list_peicon_all"]){ + $CONTENT_RECENT_TABLE_EPICONS = $tp -> parseTemplate("{EMAIL_ITEM=".CONTENT_LAN_69." ".CONTENT_LAN_71."^plugin:content.".$row['content_id']."}"); + $CONTENT_RECENT_TABLE_EPICONS .= " ".$tp -> parseTemplate("{PRINT_ITEM=".CONTENT_LAN_70." ".CONTENT_LAN_71."^plugin:content.".$row['content_id']."}"); + $CONTENT_RECENT_TABLE_EPICONS .= " ".$tp -> parseTemplate("{PDF=".CONTENT_LAN_76." ".CONTENT_LAN_71."^plugin:content.".$row['content_id']."}"); + } +} +return $CONTENT_RECENT_TABLE_EPICONS; +SC_END + +SC_BEGIN CONTENT_RECENT_TABLE_AUTHORDETAILS +global $CONTENT_RECENT_TABLE_AUTHORDETAILS; +return $CONTENT_RECENT_TABLE_AUTHORDETAILS; +SC_END + +SC_BEGIN CONTENT_RECENT_TABLE_EDITICON +global $CONTENT_RECENT_TABLE_EDITICON, $content_pref, $qs, $row, $mainparent, $plugindir; +if(ADMIN && getperms("P") && isset($content_pref["content_list_editicon"]) && $content_pref["content_list_editicon"]){ +return $CONTENT_RECENT_TABLE_EDITICON = "".CONTENT_ICON_EDIT.""; +} +SC_END + +SC_BEGIN CONTENT_RECENT_TABLE_REFER +global $CONTENT_RECENT_TABLE_REFER, $content_pref, $qs, $row, $mainparent; +if($content_pref["content_log"] && $content_pref["content_list_refer"]){ + $refercounttmp = explode("^", $row['content_refer']); + $CONTENT_RECENT_TABLE_REFER = ($refercounttmp[0] ? $refercounttmp[0] : "0"); + if($CONTENT_RECENT_TABLE_REFER > 0){ + return $CONTENT_RECENT_TABLE_REFER; + } +} +SC_END + +SC_BEGIN CONTENT_RECENT_TABLE_RATING +global $CONTENT_RECENT_TABLE_RATING, $rater, $row, $qs, $content_pref, $plugintable, $mainparent; +if($content_pref["content_list_rating"]){ + if($content_pref["content_list_rating_all"] || $row['content_rate']){ + return $rater->composerating($plugintable, $row['content_id'], $enter=FALSE, $userid=FALSE); + } +} +SC_END + +SC_BEGIN CONTENT_RECENT_TABLE_PARENT +global $CONTENT_RECENT_TABLE_PARENT, $content_pref, $mainparent, $row, $array, $aa; +if(isset($content_pref["content_list_parent"]) && $content_pref["content_list_parent"]){ +return $aa -> getCrumbItem($row['content_parent'], $array); +} +SC_END + +// CONTENT_ARCHIVE_TABLE ------------------------------------------------ +SC_BEGIN CONTENT_ARCHIVE_TABLE_LETTERS +global $CONTENT_ARCHIVE_TABLE_LETTERS, $content_pref, $mainparent; +if($content_pref["content_archive_letterindex"]){ +return $CONTENT_ARCHIVE_TABLE_LETTERS; +} +SC_END + +SC_BEGIN CONTENT_ARCHIVE_TABLE_HEADING +global $CONTENT_ARCHIVE_TABLE_HEADING, $row, $qs; +return "".$row['content_heading'].""; +SC_END + +SC_BEGIN CONTENT_ARCHIVE_TABLE_DATE +global $CONTENT_ARCHIVE_TABLE_DATE, $row, $content_pref, $qs, $mainparent; +if(isset($content_pref["content_archive_date"]) && $content_pref["content_archive_date"]){ +$datestyle = ($content_pref["content_archive_datestyle"] ? $content_pref["content_archive_datestyle"] : "%d %b %Y"); +return strftime($datestyle, $row['content_datestamp']); +} +SC_END + +SC_BEGIN CONTENT_ARCHIVE_TABLE_AUTHOR +global $CONTENT_ARCHIVE_TABLE_AUTHOR; +return $CONTENT_ARCHIVE_TABLE_AUTHOR; +SC_END + +// CONTENT_CONTENT_TABLE ------------------------------------------------ +SC_BEGIN CONTENT_CONTENT_TABLE_INFO_PRE +global $CONTENT_CONTENT_TABLE_INFO_PRE; +if($CONTENT_CONTENT_TABLE_INFO_PRE === TRUE){ +$CONTENT_CONTENT_TABLE_INFO_PRE = " "; +return $CONTENT_CONTENT_TABLE_INFO_PRE; +} +SC_END +SC_BEGIN CONTENT_CONTENT_TABLE_INFO_POST +global $CONTENT_CONTENT_TABLE_INFO_POST; +if($CONTENT_CONTENT_TABLE_INFO_POST === TRUE){ +$CONTENT_CONTENT_TABLE_INFO_POST = " "; +return $CONTENT_CONTENT_TABLE_INFO_POST; +} +SC_END + +SC_BEGIN CONTENT_CONTENT_TABLE_INFO_PRE_HEADDATA +global $CONTENT_CONTENT_TABLE_INFO_PRE_HEADDATA; +if($CONTENT_CONTENT_TABLE_INFO_PRE_HEADDATA === TRUE){ +$CONTENT_CONTENT_TABLE_INFO_PRE_HEADDATA = " "; +return $CONTENT_CONTENT_TABLE_INFO_PRE_HEADDATA; +} +SC_END +SC_BEGIN CONTENT_CONTENT_TABLE_INFO_POST_HEADDATA +global $CONTENT_CONTENT_TABLE_INFO_POST_HEADDATA; +if($CONTENT_CONTENT_TABLE_INFO_POST_HEADDATA === TRUE){ +$CONTENT_CONTENT_TABLE_INFO_POST_HEADDATA = " "; +return $CONTENT_CONTENT_TABLE_INFO_POST_HEADDATA; +} +SC_END + +SC_BEGIN CONTENT_CONTENT_TABLE_PARENT +global $CONTENT_CONTENT_TABLE_PARENT, $aa, $array, $row, $content_pref, $mainparent; +if(isset($content_pref["content_content_parent"]) && $content_pref["content_content_parent"]){ +return $aa -> getCrumbItem($row['content_parent'], $array); +} +SC_END + +SC_BEGIN CONTENT_CONTENT_TABLE_ICON +global $CONTENT_CONTENT_TABLE_ICON, $qs, $row, $aa, $content_pref, $content_icon_path, $mainparent; +if(isset($content_pref["content_content_icon"]) && $content_pref["content_content_icon"]){ +$width = (isset($content_pref["content_upload_icon_size"]) && $content_pref["content_upload_icon_size"] ? $content_pref["content_upload_icon_size"] : "100"); +return $aa -> getIcon("item", $row['content_icon'], $content_icon_path, "", $width, $content_pref["content_blank_icon"]); +} +SC_END + +SC_BEGIN CONTENT_CONTENT_TABLE_HEADING +global $CONTENT_CONTENT_TABLE_HEADING, $row, $tp; +$CONTENT_CONTENT_TABLE_HEADING = ($row['content_heading'] ? $tp -> toHTML($row['content_heading'], TRUE, "") : ""); +return $CONTENT_CONTENT_TABLE_HEADING; +SC_END + +SC_BEGIN CONTENT_CONTENT_TABLE_REFER +global $CONTENT_CONTENT_TABLE_REFER, $sql, $qs, $content_pref, $plugintable, $mainparent; +if(isset($content_pref["content_content_refer"]) && $content_pref["content_content_refer"]){ + $sql -> db_Select($plugintable, "content_refer", "content_id='".intval($qs[1])."' "); + list($content_refer) = $sql -> db_Fetch(); + $refercounttmp = explode("^", $content_refer); + $CONTENT_CONTENT_TABLE_REFER = ($refercounttmp[0] ? $refercounttmp[0] : ""); +return $CONTENT_CONTENT_TABLE_REFER; +} +SC_END + +SC_BEGIN CONTENT_CONTENT_TABLE_SUBHEADING +global $CONTENT_CONTENT_TABLE_SUBHEADING, $row, $tp, $content_pref, $qs, $mainparent; +$CONTENT_CONTENT_TABLE_SUBHEADING = ($content_pref["content_content_subheading"] && $row['content_subheading'] ? $tp -> toHTML($row['content_subheading'], TRUE, "") : ""); +return $CONTENT_CONTENT_TABLE_SUBHEADING; +SC_END + +SC_BEGIN CONTENT_CONTENT_TABLE_COMMENT +global $CONTENT_CONTENT_TABLE_COMMENT, $cobj, $qs, $content_pref, $mainparent, $row, $plugintable; +if((isset($content_pref["content_content_comment"]) && $content_pref["content_content_comment"] && $row['content_comment']) || $content_pref["content_content_comment_all"] ){ +return $cobj -> count_comments($plugintable, $qs[1]); +} +SC_END + +SC_BEGIN CONTENT_CONTENT_TABLE_DATE +global $CONTENT_CONTENT_TABLE_DATE, $gen, $row, $qs, $content_pref, $mainparent; +if(isset($content_pref["content_content_date"]) && $content_pref["content_content_date"]){ + $gen = new convert; + $datestamp = preg_replace("# -.*#", "", $gen -> convert_date($row['content_datestamp'], "long")); + $CONTENT_CONTENT_TABLE_DATE = ($datestamp != "" ? $datestamp : ""); +return $CONTENT_CONTENT_TABLE_DATE; +} +SC_END + +SC_BEGIN CONTENT_CONTENT_TABLE_AUTHORDETAILS +global $CONTENT_CONTENT_TABLE_AUTHORDETAILS; +return $CONTENT_CONTENT_TABLE_AUTHORDETAILS; +SC_END + +SC_BEGIN CONTENT_CONTENT_TABLE_EPICONS +global $CONTENT_CONTENT_TABLE_EPICONS, $content_pref, $qs, $row, $tp, $mainparent; +$CONTENT_CONTENT_TABLE_EPICONS = ""; +if(($content_pref["content_content_peicon"] && $row['content_pe']) || $content_pref["content_content_peicon_all"]){ + $CONTENT_CONTENT_TABLE_EPICONS = $tp -> parseTemplate("{EMAIL_ITEM=".CONTENT_LAN_69." ".CONTENT_LAN_71."^plugin:content.".$row['content_id']."}"); + $CONTENT_CONTENT_TABLE_EPICONS .= " ".$tp -> parseTemplate("{PRINT_ITEM=".CONTENT_LAN_70." ".CONTENT_LAN_71."^plugin:content.".$row['content_id']."}"); + $CONTENT_CONTENT_TABLE_EPICONS .= " ".$tp -> parseTemplate("{PDF=".CONTENT_LAN_76." ".CONTENT_LAN_71."^plugin:content.".$row['content_id']."}"); +return $CONTENT_CONTENT_TABLE_EPICONS; +} +SC_END + +SC_BEGIN CONTENT_CONTENT_TABLE_EDITICON +global $CONTENT_CONTENT_TABLE_EDITICON, $content_pref, $qs, $row, $plugindir, $mainparent; +if(ADMIN && getperms("P") && isset($content_pref["content_content_editicon"])){ + $CONTENT_CONTENT_TABLE_EDITICON = "".CONTENT_ICON_EDIT.""; +return $CONTENT_CONTENT_TABLE_EDITICON; +} +SC_END + +SC_BEGIN CONTENT_CONTENT_TABLE_RATING +global $CONTENT_CONTENT_TABLE_RATING, $content_pref, $qs, $row, $rater, $plugintable, $mainparent; +if(($content_pref["content_content_rating"] && $row['content_rate']) || $content_pref["content_content_rating_all"] ){ +return $rater->composerating($plugintable, $row['content_id'], $enter=TRUE, $userid=FALSE); +} +SC_END + +SC_BEGIN CONTENT_CONTENT_TABLE_FILE +global $CONTENT_CONTENT_TABLE_FILE, $row, $content_file_path, $content_pref, $mainparent; +if($content_pref["content_content_attach"]){ +$filestmp = explode("[file]", $row['content_file']); +foreach($filestmp as $key => $value) { + if($value == "") { + unset($filestmp[$key]); + } +} +$files = array_values($filestmp); +$content_files_popup_name = str_replace("'", "", $row['content_heading']); +$file = ""; +$filesexisting = "0"; +for($i=0;$i".CONTENT_ICON_FILE." "; + }else{ + $file .= " "; + } +} +$CONTENT_CONTENT_TABLE_FILE = ($filesexisting == "0" ? "" : CONTENT_LAN_41." ".($filesexisting == 1 ? CONTENT_LAN_42 : CONTENT_LAN_43)." ".$file." "); +return $CONTENT_CONTENT_TABLE_FILE; +} +SC_END + +SC_BEGIN CONTENT_CONTENT_TABLE_SCORE +global $CONTENT_CONTENT_TABLE_SCORE, $row; +$score = $row['content_score']; +if($score){ + $height = "height:8px;"; + $img = ""; + $img .= ""; + $img .= ""; + $img .= ""; + if($score < 100){ + $empty = 100-$score; + $img .= ""; + } + $img .= ""; + return $img." ".$score; +} +SC_END + +SC_BEGIN CONTENT_CONTENT_TABLE_SUMMARY +global $CONTENT_CONTENT_TABLE_SUMMARY; +return $CONTENT_CONTENT_TABLE_SUMMARY; +SC_END + +SC_BEGIN CONTENT_CONTENT_TABLE_TEXT +global $CONTENT_CONTENT_TABLE_TEXT; +return $CONTENT_CONTENT_TABLE_TEXT; +SC_END + +SC_BEGIN CONTENT_CONTENT_TABLE_IMAGES +global $CONTENT_CONTENT_TABLE_IMAGES, $row, $content_image_path, $aa, $tp, $authordetails, $content_pref, $mainparent; +if($content_pref["content_content_images"]){ +$authordetails = $aa -> getAuthor($row['content_author']); +$imagestmp = explode("[img]", $row['content_image']); +foreach($imagestmp as $key => $value) { + if($value == "") { + unset($imagestmp[$key]); + } +} +$images = array_values($imagestmp); +$content_image_popup_name = $row['content_heading']; +$CONTENT_CONTENT_TABLE_IMAGES = ""; +require_once(e_HANDLER."popup_handler.php"); +$pp = new popup; +$gen = new convert; +$datestamp = preg_replace("# -.*#", "", $gen -> convert_date($row['content_datestamp'], "long")); +for($i=0;$i toHTML($row['content_subheading'], TRUE); + $popupname = $tp -> toHTML($content_image_popup_name, TRUE); + $author = $tp -> toHTML($authordetails[1], TRUE); + $oTitle = $popupname." ".($i+1); + $oText = $popupname." ".($i+1)."
    ".$subheading."
    ".$author." (".$datestamp.")"; + $CONTENT_CONTENT_TABLE_IMAGES .= $pp -> popup($oSrc, $oSrcThumb, $oIconWidth, $oMaxWidth, $oTitle, $oText); +} +return $CONTENT_CONTENT_TABLE_IMAGES; +} +SC_END + +SC_BEGIN CONTENT_CONTENT_TABLE_CUSTOM_TAGS +global $CONTENT_CONTENT_TABLE_CUSTOM_TAGS; +return $CONTENT_CONTENT_TABLE_CUSTOM_TAGS; +SC_END + +SC_BEGIN CONTENT_CONTENT_TABLE_PAGENAMES +global $CONTENT_CONTENT_TABLE_PAGENAMES; +return $CONTENT_CONTENT_TABLE_PAGENAMES; +SC_END + +SC_BEGIN CONTENT_CONTENT_TABLE_NEXT_PAGE +global $CONTENT_CONTENT_TABLE_NEXT_PAGE; +return $CONTENT_CONTENT_TABLE_NEXT_PAGE; +SC_END + +SC_BEGIN CONTENT_CONTENT_TABLE_PREV_PAGE +global $CONTENT_CONTENT_TABLE_PREV_PAGE; +return $CONTENT_CONTENT_TABLE_PREV_PAGE; +SC_END + + + + +// PRINT PAGE ------------------------------------------------ + +//content images (from uploaded area) used in the print page +SC_BEGIN CONTENT_PRINT_IMAGES +global $CONTENT_PRINT_IMAGES, $row, $content_image_path, $tp, $content_pref, $mainparent; +if($content_pref["content_content_images"]){ +$imagestmp = explode("[img]", $row['content_image']); +foreach($imagestmp as $key => $value) { + if($value == "") { + unset($imagestmp[$key]); + } +} +$images = array_values($imagestmp); +$CONTENT_PRINT_IMAGES = ""; +for($i=0;$i

    "; + } +} +return $CONTENT_PRINT_IMAGES; +} +SC_END + + +// PDF PAGE ------------------------------------------------ + +//content images (from uploaded area) used in the pdf creation +SC_BEGIN CONTENT_PDF_IMAGES +global $CONTENT_PDF_IMAGES, $row, $content_image_path, $tp, $content_pref, $mainparent; +if($content_pref["content_content_images"]){ +$imagestmp = explode("[img]", $row['content_image']); +foreach($imagestmp as $key => $value) { + if($value == "") { + unset($imagestmp[$key]); + } +} +$images = array_values($imagestmp); +$CONTENT_PDF_IMAGES = ""; +for($i=0;$i"; + } +} +return $CONTENT_PDF_IMAGES; +} +SC_END + +*/ +?> diff --git a/e107_plugins/content/content_sql.php b/e107_plugins/content/content_sql.php new file mode 100644 index 000000000..de6714f14 --- /dev/null +++ b/e107_plugins/content/content_sql.php @@ -0,0 +1,51 @@ + +# Table structure for table `content` +# + +CREATE TABLE pcontent ( + content_id int(10) unsigned NOT NULL auto_increment, + content_heading varchar(255) NOT NULL default '', + content_subheading varchar(255) NOT NULL default '', + content_summary text NOT NULL, + content_text longtext NOT NULL, + content_author varchar(255) NOT NULL default '', + content_icon varchar(255) NOT NULL default '', + content_file text NOT NULL, + content_image text NOT NULL, + content_parent varchar(50) NOT NULL default '', + content_comment tinyint(1) unsigned NOT NULL default '0', + content_rate tinyint(1) unsigned NOT NULL default '0', + content_pe tinyint(1) unsigned NOT NULL default '0', + content_refer text NOT NULL, + content_datestamp int(10) unsigned NOT NULL default '0', + content_enddate int(10) unsigned NOT NULL default '0', + content_class varchar(255) NOT NULL default '', + content_pref text NOT NULL, + content_order varchar(10) NOT NULL default '0', + content_score tinyint(3) unsigned NOT NULL default '0', + content_meta text NOT NULL, + content_layout varchar(255) NOT NULL default '', + PRIMARY KEY (content_id) +) TYPE=MyISAM; +# -------------------------------------------------------- + diff --git a/e107_plugins/content/content_submit.php b/e107_plugins/content/content_submit.php new file mode 100644 index 000000000..e9611af3a --- /dev/null +++ b/e107_plugins/content/content_submit.php @@ -0,0 +1,145 @@ + setPageTitle(); + +require_once(HEADERF); + +if(isset($_POST['create_content'])){ + if($_POST['content_text'] && $_POST['content_heading'] && $_POST['parent'] != "none" && $_POST['content_author_name'] != "" && $_POST['content_author_email'] != ""){ + $adb -> dbContent("create", "submit"); + }else{ + $message = CONTENT_ADMIN_SUBMIT_LAN_4; + } +} + +if(isset($qs[0]) && $qs[0] == "s"){ + $message = CONTENT_ADMIN_SUBMIT_LAN_2."

    ".CONTENT_ADMIN_SUBMIT_LAN_5; + $ns -> tablerender("", "
    ".$message."
    "); + require_once(FOOTERF); + exit; +} +if(isset($qs[0]) && $qs[0] == "d"){ + $message = CONTENT_ADMIN_SUBMIT_LAN_3."

    ".CONTENT_ADMIN_SUBMIT_LAN_5; + $ns -> tablerender("", "
    ".$message."
    "); + require_once(FOOTERF); + exit; +} + +if(isset($message)){ + $ns -> tablerender("", "
    ".$message."
    "); +} + +if(!isset($qs[0])){ + if(!$sql -> db_Select($plugintable, "content_id, content_heading, content_subheading, content_icon, content_pref", "content_parent = '0' AND content_class REGEXP '".e_CLASS_REGEXP."' ORDER BY content_heading")){ + $text .= "
    ".CONTENT_ADMIN_SUBMIT_LAN_0."
    "; + }else{ + if(!isset($CONTENT_SUBMIT_TYPE_TABLE)){ + if(is_readable(e_THEME.$pref['sitetheme']."/content/content_submit_type_template.php")){ + require_once(e_THEME.$pref['sitetheme']."/content/content_submit_type_template.php"); + }else{ + require_once(e_PLUGIN."content/templates/content_submit_type_template.php"); + } + } + $sql2 = ""; + $content_submit_type_table_string = ""; + $count = "0"; + while($row = $sql -> db_Fetch()){ + if(!is_object($sql2)){ $sql2 = new db; } + + $content_pref = $eArrayStorage->ReadArray($row['content_pref']); + $content_pref["content_cat_icon_path_large"] = ($content_pref["content_cat_icon_path_large"] ? $content_pref["content_cat_icon_path_large"] : "{e_PLUGIN}content/images/cat/48/" ); + $content_pref["content_cat_icon_path_small"] = ($content_pref["content_cat_icon_path_small"] ? $content_pref["content_cat_icon_path_small"] : "{e_PLUGIN}content/images/cat/16/" ); + $content_cat_icon_path_large = $tp -> replaceConstants($content_pref["content_cat_icon_path_large"]); + $content_cat_icon_path_small = $tp -> replaceConstants($content_pref["content_cat_icon_path_small"]); + $content_icon_path = $tp -> replaceConstants($content_pref["content_icon_path"]); + if($content_pref["content_submit"] && check_class($content_pref["content_submit_class"])){ + $content_submit_type_table_string .= $tp -> parseTemplate($CONTENT_SUBMIT_TYPE_TABLE, FALSE, $content_shortcodes); + $count = $count + 1; + } + } + if($count == "0"){ + $text .= "
    ".CONTENT_ADMIN_SUBMIT_LAN_0."
    "; + }else{ + $text = $CONTENT_SUBMIT_TYPE_TABLE_START.$content_submit_type_table_string.$CONTENT_SUBMIT_TYPE_TABLE_END; + } + } + $caption = CONTENT_ADMIN_SUBMIT_LAN_1; + $ns -> tablerender($caption, $text); +} + +if(isset($qs[0]) && $qs[0]=="content" && $qs[1] == "submit" && is_numeric($qs[2]) && !isset($qs[3])){ + //check if valid categories exist for this main parent + $array = $aa -> getCategoryTree("", intval($qs[2]), TRUE); + $validparent = implode(",", array_keys($array)); + $qry = " content_parent REGEXP '".$aa -> CONTENTREGEXP($validparent)."' "; + $sql2 = new db; + //$contenttotal = $sql2 -> db_Count($plugintable, "(*)", "WHERE ".$qry." ".$datequery." AND content_class REGEXP '".e_CLASS_REGEXP."' " ); + $aform -> show_create_content("submit"); +} + +require_once(FOOTERF); + +?> diff --git a/e107_plugins/content/content_update.php b/e107_plugins/content/content_update.php new file mode 100644 index 000000000..57168dc80 --- /dev/null +++ b/e107_plugins/content/content_update.php @@ -0,0 +1,368 @@ +db_Select("plugin", "plugin_version", "plugin_path = 'content'")) +{ + $row = $sql->db_Fetch(); + $content_version = $row['plugin_version']; +} + +//create table if it doesn't exist +if(!$sql->db_Query("SHOW COLUMNS FROM ".MPREFIX."pcontent")) { + $query = "CREATE TABLE ".MPREFIX."pcontent ( + content_id int(10) unsigned NOT NULL auto_increment, + content_heading varchar(255) NOT NULL default '', + content_subheading varchar(255) NOT NULL default '', + content_summary text NOT NULL, + content_text longtext NOT NULL, + content_author varchar(255) NOT NULL default '', + content_icon varchar(255) NOT NULL default '', + content_file text NOT NULL, + content_image text NOT NULL, + content_parent varchar(50) NOT NULL default '', + content_comment tinyint(1) unsigned NOT NULL default '0', + content_rate tinyint(1) unsigned NOT NULL default '0', + content_pe tinyint(1) unsigned NOT NULL default '0', + content_refer text NOT NULL, + content_datestamp int(10) unsigned NOT NULL default '0', + content_enddate int(10) unsigned NOT NULL default '0', + content_class varchar(255) NOT NULL default '', + content_pref text NOT NULL, + content_order varchar(10) NOT NULL default '0', + content_score tinyint(3) unsigned NOT NULL default '0', + content_meta text NOT NULL, + content_layout varchar(255) NOT NULL default '', + PRIMARY KEY (content_id) + ) TYPE=MyISAM;"; + + $sql->db_Select_gen($query); +} + +$text = ""; +$main_convert = ""; +//main convert + +$newcontent = $sql -> db_Count($plugintable, "(*)", ""); +if($newcontent == 0){ + + unset($text); + + //possible database values + //content page: $content_parent == "1" && $content_type == "1" //added at 20051031 + //content page: $content_parent == "0" && $content_type == "1" + //review category: $content_parent == "0" && $content_type == "10" + //article category: $content_parent == "0" && $content_type == "6" + //review: $content_type == "3" || $content_type == "16" + //article: $content_type == "0" || $content_type == "15" + + // ##### STAGE 1 : ANALYSE OLD CONTENT -------------------------------------------------------- + $sql = new db; + $totaloldcontentrows = $sql -> db_Count("content"); + $totaloldrowscat_article = $sql -> db_Count("content", "(*)", "WHERE content_parent = '0' AND content_type = '6'"); + $totaloldrowscat_review = $sql -> db_Count("content", "(*)", "WHERE content_parent = '0' AND content_type = '10'"); + $totaloldrowsitem_content = $sql -> db_Count("content", "(*)", "WHERE (content_parent = '0' || content_parent = '1') AND content_type = '1'"); + $totaloldrowsitem_review = $sql -> db_Count("content", "(*)", "WHERE content_type = '3' || content_type = '16'"); + $totaloldrowsitem_article = $sql -> db_Count("content", "(*)", "WHERE content_type = '0' || content_type = '15'"); + + if($totaloldrowsitem_content == 0 && $totaloldrowsitem_article == 0 && $totaloldrowsitem_review == 0){ + $totaloldrowsitem_content = "1"; + $totaloldrowsitem_article = "1"; + $totaloldrowsitem_review = "1"; + + //if no old records exist, create a few default categories + $main_convert = create_defaults(); + }else{ + + //analyse unknown rows + $unknown_array = $ac -> analyse_unknown(); + + if($totaloldcontentrows == 0){ + $totaloldrowsitem_content = "1"; + $totaloldrowsitem_article = "1"; + $totaloldrowsitem_review = "1"; + } + + //create mainparent + $content_mainarray = $ac -> create_mainparent("content", $totaloldrowsitem_content, "1"); + $article_mainarray = $ac -> create_mainparent("article", $totaloldrowsitem_article, "2"); + $review_mainarray = $ac -> create_mainparent("review", $totaloldrowsitem_review, "3"); + + //convert categories + $article_cat_array = $ac -> convert_category("article", "content_parent = '0' AND content_type = '6'", "2"); + $review_cat_array = $ac -> convert_category("review", "content_parent = '0' AND content_type = '10'", "3"); + + //convert rows + $content_array = $ac -> convert_row("content", "(content_parent = '0' || content_parent = '1') AND content_type = '1'", "1"); + $article_array = $ac -> convert_row("article", "content_type = '0' || content_type = '15'", "2"); + $review_array = $ac -> convert_row("review", "content_type = '3' || content_type = '16'", "3"); + + //convert comments + $ac -> convert_comments(); + + //convert rating + $ac -> convert_rating(); + + $conversion_analyses_rows_total = $totaloldcontentrows; + + $conversion_analyses_rows_converted = (count($article_cat_array[1]) + count($review_cat_array[1]) + count($content_array[2]) + count($article_array[2]) + count($review_array[2])); + + $conversion_analyses_rows_warning = (count($content_array[4]) + count($content_array[5]) + count($article_array[4]) + count($article_array[5]) + count($review_array[4]) + count($review_array[5])); + + $conversion_analyses_rows_failed = (count($article_cat_array[2]) + count($review_cat_array[2]) + count($content_array[3]) + count($article_array[3]) + count($review_array[3]) + count($unknown_array[1])); + + + //only output detailed information if developer mode is set + if ($pref['developer']) { + showlink(); + $SPACER = " "; + $text = " + "; + + //conversion analysis + $text .= " + + + + "; + + $text .= $SPACER; + + //old content table : analysis + $text .= " + + + + "; + + $text .= $SPACER; + + //unknown rows + if(count($unknown_array[0]) > 0){ + $text .= ""; + $text .= " + + + + "; + } + + $text .= " + + ".$SPACER." + + ".$ac -> results_conversion_mainparent($content_mainarray, $review_mainarray, $article_mainarray)." + + ".$SPACER." + + + ".$ac -> results_conversion_row("content", $content_array, $totaloldrowsitem_content)." + + ".$SPACER." + + + ".$ac -> results_conversion_category("review", $review_cat_array, $totaloldrowscat_review)." + ".$ac -> results_conversion_row("review", $review_array, $totaloldrowsitem_review)." + + ".$SPACER." + + + ".$ac -> results_conversion_category("article", $article_cat_array, $totaloldrowscat_article)." + ".$ac -> results_conversion_row("article", $article_array, $totaloldrowsitem_article)." + + ".$SPACER." + +
    ".CONTENT_ADMIN_CONVERSION_LAN_11." + ".CONTENT_ADMIN_CONVERSION_LAN_48." + +
    ".CONTENT_ADMIN_CONVERSION_LAN_16." + ".CONTENT_ADMIN_CONVERSION_LAN_48." + +
    ".CONTENT_ADMIN_CONVERSION_LAN_51."
    ".CONTENT_ICON_ERROR." ".count($unknown_array[0])." ".CONTENT_ADMIN_CONVERSION_LAN_51." + ".CONTENT_ADMIN_CONVERSION_LAN_48." + +
    content : ".CONTENT_ADMIN_CONVERSION_LAN_27."
    review : ".CONTENT_ADMIN_CONVERSION_LAN_27."
    article : ".CONTENT_ADMIN_CONVERSION_LAN_27."
    "; + + $main_convert = array($caption, $text); + } + + } +} + +$text = ""; +//update to 1.1 parent values to new style +$upgrade_1_1 = FALSE; +if($thiscount = $sql -> db_Select("pcontent", "*", "ORDER BY content_id ", "mode=no_where" )){ + while($row = $sql -> db_Fetch()){ + if( strpos($row['content_parent'], ".") && substr($row['content_parent'],0,1) != "0"){ + //if item with old parent value exists, you need to upgrade to 1.1 + $upgrade_1_1 = TRUE; + } + } +} +if($upgrade_1_1 === TRUE){ + $text .= $ac -> upgrade_1_1(); +} + +//upgrade to 1.2 table structure (add score, meta, layout fields) +$text .= $ac -> upgrade_1_2(); + +//upgrade to 1.21 (update content_author fields) +$text .= $ac -> upgrade_1_21(); + +//upgrade to 1.22 (update preference storage method) +$text .= $ac -> upgrade_1_22(); + +//upgrade to 1.23 (update preference storage method) +$text .= $ac -> upgrade_1_23(); + +//upgrade to 1.24 (update custom theme) +$text .= $ac -> upgrade_1_24(); + +//render message +if(isset($text)){ + //only output detailed information if developer mode is set + if ($pref['developer']) { + $caption = CONTENT_ADMIN_CONVERSION_LAN_63; + $ns -> tablerender($caption, $text); + } +} + +//render primary conversion results +if(is_array($main_convert)){ + if(isset($main_convert[1])){ + //only output detailed information if developer mode is set + if ($pref['developer']) { + $ns -> tablerender($main_convert[0], $main_convert[1]); + } + } +} + +//finally set the new content plugin version number +set_content_version(); + + + + +//create default mainparent category for content, review and article +function create_defaults() +{ + global $ns, $ac, $plugindir; + + $plugindir = e_PLUGIN."content/"; + + if(!is_object($ac)){ + require_once($plugindir."handlers/content_convert_class.php"); + $ac = new content_convert; + } + + $content_mainarray = $ac -> create_mainparent("content", "1", "1"); + $article_mainarray = $ac -> create_mainparent("article", "1", "2"); + $review_mainarray = $ac -> create_mainparent("review", "1", "3"); + + $main_convert = ''; + //only output detailed information if developer mode is set + if ($pref['developer']) { + showlink(); + + $text = ""; + $text .= $ac -> results_conversion_mainparent($content_mainarray, $review_mainarray, $article_mainarray); + $text .= "
    "; + + $main_convert = array(CONTENT_ADMIN_CONVERSION_LAN_52, $text); + } + return $main_convert; +} + + + +//show link to start managing the content management plugin +function showlink() +{ + global $ns, $pref; + //only output detailed information if developer mode is set + if ($pref['developer']) { + $text = "
    ".CONTENT_ADMIN_CONVERSION_LAN_46."
    "; + $caption = CONTENT_ADMIN_CONVERSION_LAN_47; + $ns -> tablerender($caption, $text); + } +} + + + +//update content plugin version number +function set_content_version() +{ + global $sql, $pref; + $new_version = "1.24"; + $sql->db_Update('plugin',"plugin_version = '{$new_version}' WHERE plugin_path='content'"); + $text = ''; + //only output detailed information if developer mode is set + if ($pref['developer']) { + $text = CONTENT_ADMIN_CONVERSION_LAN_62." $new_version
    "; + } + return $text; +} + +?> \ No newline at end of file diff --git a/e107_plugins/content/content_update_check.php b/e107_plugins/content/content_update_check.php new file mode 100644 index 000000000..95c2cb559 --- /dev/null +++ b/e107_plugins/content/content_update_check.php @@ -0,0 +1,85 @@ +db_Select("plugin", "plugin_version", "plugin_path = 'content'")){ + return FALSE; //needed + }else{ + $row = $sql->db_Fetch(); + + //if version < 1.23, return FALSE = needed + if($row['plugin_version'] < 1.24){ + return FALSE; //needed + } + + $newcontent = $sql -> db_Count("pcontent", "(*)", ""); + + //if no rows in new table && no old content table exists, return FALSE = needed + $exists = mysql_query("SELECT 1 FROM ".MPREFIX."content LIMIT 0"); + if($newcontent == 0 && !$exists){ + return FALSE; //needed + } + + //if parent value is old style, return FALSE = needed + if($newcontent > 0){ + if($thiscount = $sql -> db_Select("pcontent", "*", "ORDER BY content_id ", "mode=no_where" )){ + while($row = $sql -> db_Fetch()){ + if( strpos($row['content_parent'], ".") && substr($row['content_parent'],0,1) != "0"){ + //if item with old parent value exists, you need to upgrade to 1.1 + return FALSE; //needed + } + } + } + } + + //if added fields are not present, return FALSE = needed + $field1 = $sql->db_Field("pcontent",19); + $field2 = $sql->db_Field("pcontent",20); + $field3 = $sql->db_Field("pcontent",21); + if($field1 != "content_score" && $field2 != "content_meta" && $field3 != "content_layout"){ + return FALSE; //needed + } + + //else if passing all above checks, return TRUE = not needed + return TRUE; + } + } +} + + + +?> + \ No newline at end of file diff --git a/e107_plugins/content/e_comment.php b/e107_plugins/content/e_comment.php new file mode 100644 index 000000000..ac48ffa92 --- /dev/null +++ b/e107_plugins/content/e_comment.php @@ -0,0 +1,31 @@ +".time().") AND c.content_class REGEXP '".e_CLASS_REGEXP."' "; + +?> \ No newline at end of file diff --git a/e107_plugins/content/e_emailprint.php b/e107_plugins/content/e_emailprint.php new file mode 100644 index 000000000..e12464738 --- /dev/null +++ b/e107_plugins/content/e_emailprint.php @@ -0,0 +1,174 @@ + db_Select($plugintable, "content_id, content_heading, content_subheading, content_text, content_author, content_image, content_parent, content_datestamp, content_class", "content_id='".intval($id)."' "); + $row = $sql -> db_Fetch(); + + if(!check_class($row['content_class'])){ + header("location:".e_PLUGIN."content/content.php"); exit; + } + $row['content_heading'] = $tp -> toHTML($row['content_heading']); + $row['content_subheading'] = $tp -> toHTML($row['content_subheading']); + $row['content_text'] = $tp -> replaceConstants($row['content_text']); + $row['content_text'] = preg_replace("/\{EMAILPRINT\}|\[newpage\]/", "", $tp -> toHTML($row['content_text'], TRUE)); + $authordetails = $aa -> getAuthor($row['content_author']); + $row['content_datestamp'] = $con -> convert_date($row['content_datestamp'], "long"); + + $mainparent = $aa -> getMainParent($id); + $content_pref = $aa -> getContentPref($mainparent); + $content_icon_path = $tp -> replaceConstants($content_pref["content_icon_path"]); + $content_image_path = $tp -> replaceConstants($content_pref["content_image_path"]); + $img = $tp -> parseTemplate('{CONTENT_PRINT_IMAGES}', FALSE, $content_shortcodes); + + $text = " + ".$row['content_heading']." +
    + ".$row['content_subheading']." +
    + ".$authordetails[1].", ".$row['content_datestamp']." +

    +
    ".$img."
    + ".$row['content_text']." +


    + ".CONTENT_EMAILPRINT_LAN_1." ".SITENAME." +
    + ( ".SITEURLBASE.e_PLUGIN_ABS."content/content.php?content.".$row['content_id']." ) + "; + + require_once(e_HANDLER.'bbcode_handler.php'); + $e_bb = new e_bbcode; + $text = $e_bb->parseBBCodes($text, ''); + + return $text; +} + +function email_item($id) +{ + $plugintable = "pcontent"; + if(!is_object($sql)){ $sql = new db; } + if($sql -> db_Select($plugintable, "content_id, content_heading, content_subheading, content_text, content_author, content_parent, content_datestamp, content_class", "content_id='".intval($id)."' ")){ + while($row = $sql -> db_Fetch()){ + $tmp = explode(".",$row['content_parent']); + if(!check_class($row['content_class'])){ + header("location:".e_PLUGIN."content/content.php"); exit; + } + $message = SITEURL.e_PLUGIN."content/content.php?content.".$id."\n\n".$row['content_heading']."\n".$row['content_subheading']."\n"; + } + return $message; + } +} + + +function print_item_pdf($id){ + global $tp, $content_shortcodes; + global $CONTENT_PRINT_IMAGES, $row, $content_image_path, $content_pref, $mainparent, $eArrayStorage; + + //in this section you decide what to needs to be output to the pdf file + $con = new convert; + + require_once(e_PLUGIN."content/content_shortcodes.php"); + + require_once(e_PLUGIN."content/handlers/content_class.php"); + $aa = new content; + + if(!is_object($sql)){ $sql = new db; } + $sql -> db_Select($plugintable, "content_id, content_heading, content_subheading, content_text, content_image, content_author, content_parent, content_datestamp, content_class, content_pref", "content_id='".intval($id)."' "); + $row = $sql -> db_Fetch(); + + if(!check_class($row['content_class'])){ + header("location:".e_PLUGIN."content/content.php"); exit; + } + $authordetails = $aa -> getAuthor($row['content_author']); + $row['content_datestamp'] = $con -> convert_date($row['content_datestamp'], "long"); + $img = $tp -> parseTemplate('{CONTENT_PRINT_IMAGES}', FALSE, $content_shortcodes); + + $mainparent = $aa -> getMainParent(intval($id)); + $content_pref = $aa -> getContentPref($mainparent); + $content_icon_path = $tp -> replaceConstants($content_pref["content_icon_path"]); + $content_image_path = $tp -> replaceConstants($content_pref["content_image_path"]); + $img = $tp -> parseTemplate('{CONTENT_PDF_IMAGES}', FALSE, $content_shortcodes); + + //add custom and preset tags if present + $custom = $eArrayStorage->ReadArray($row['content_pref']); + $months = array(CONTENT_ADMIN_DATE_LAN_0, CONTENT_ADMIN_DATE_LAN_1, CONTENT_ADMIN_DATE_LAN_2, CONTENT_ADMIN_DATE_LAN_3, CONTENT_ADMIN_DATE_LAN_4, CONTENT_ADMIN_DATE_LAN_5, CONTENT_ADMIN_DATE_LAN_6, CONTENT_ADMIN_DATE_LAN_7, CONTENT_ADMIN_DATE_LAN_8, CONTENT_ADMIN_DATE_LAN_9, CONTENT_ADMIN_DATE_LAN_10, CONTENT_ADMIN_DATE_LAN_11); + + $CONTENT_CONTENT_TABLE_CUSTOM_TAGS = ""; + if(!empty($custom)){ + foreach($custom as $k => $v){ + if($k == "content_custom_presettags"){ + if(isset($content_pref["content_content_presettags"]) && $content_pref["content_content_presettags"]){ + foreach($v as $ck => $cv){ + if(is_array($cv)){ //date + if(!($cv['day']=="" && $cv['month']=="" && $cv['year']=="")){ + $vv = $cv['day']." ".$months[($cv['month']-1)]." ".$cv['year']; + } + }else{ + $vv = $cv; + } + if( isset($ck) && $ck != "" && isset($vv) && $vv!="" ){ + $CUSTOM_TAGS = TRUE; + $CONTENT_CONTENT_TABLE_CUSTOM_KEY = $tp->toHTML($ck, true); + $CONTENT_CONTENT_TABLE_CUSTOM_VALUE = $tp->toHTML($vv, true); + $CONTENT_CONTENT_TABLE_CUSTOM_TAGS .= $CONTENT_CONTENT_TABLE_CUSTOM_KEY." : ".$CONTENT_CONTENT_TABLE_CUSTOM_VALUE."
    "; + } + } + } + }else{ + if(isset($content_pref["content_content_customtags"]) && $content_pref["content_content_customtags"]){ + $key = substr($k,15); + if( isset($key) && $key != "" && isset($v) && $v!="" ){ + $CUSTOM_TAGS = TRUE; + $CONTENT_CONTENT_TABLE_CUSTOM_KEY = $tp->toHTML($key, true); + $CONTENT_CONTENT_TABLE_CUSTOM_VALUE = $tp->toHTML($v, true); + $CONTENT_CONTENT_TABLE_CUSTOM_TAGS .= $CONTENT_CONTENT_TABLE_CUSTOM_KEY." : ".$CONTENT_CONTENT_TABLE_CUSTOM_VALUE."
    "; + } + } + } + } + } + + $text = " + ".$row['content_heading']."
    + ".$row['content_subheading']."
    + ".$authordetails[1].", ".$row['content_datestamp']."
    +
    + ".$row['content_text']."
    + ".($CONTENT_CONTENT_TABLE_CUSTOM_TAGS ? $CONTENT_CONTENT_TABLE_CUSTOM_TAGS : "")." +
    ".$img."
    + "; + + //the following defines are processed in the document properties of the pdf file + + //Do NOT add parser function to the variables, leave them as raw data ! + //as the pdf methods will handle this ! + $text = $text; //define text + $creator = SITENAME; //define creator + $author = $authordetails[1]; //define author + $title = $row['content_heading']; //define title + $subject = $row['content_subheading']; //define subject + $keywords = ""; //define keywords + + //define url to use in the header of the pdf file + $url = SITEURLBASE.e_PLUGIN_ABS."content/content.php?content.".$row['content_id']; + + //always return an array with the following data: + return array($text, $creator, $author, $title, $subject, $keywords, $url); +} + +?> \ No newline at end of file diff --git a/e107_plugins/content/e_frontpage.php b/e107_plugins/content/e_frontpage.php new file mode 100644 index 000000000..62cea44ad --- /dev/null +++ b/e107_plugins/content/e_frontpage.php @@ -0,0 +1,21 @@ + db_Select("pcontent", "content_id, content_heading", "LEFT(content_parent,1)='0'")) { + while ($row = $sql2 -> db_Fetch()) { + $front_page['content_'.$row['content_id']]['title'] = CONT_FP_1.': '.$row['content_heading']; + $front_page['content_'.$row['content_id']]['page'][] = array('page' => $PLUGINS_DIRECTORY.'content/content.php?recent.'.$row['content_id'], 'title' => $row['content_heading'].' '.CONT_FP_2); + if ($sql -> db_Select("pcontent", "content_id, content_heading", "content_parent = '".$row['content_id']."' ORDER BY content_heading")){ + while ($row2 = $sql -> db_Fetch()) { + $front_page['content_'.$row['content_id']]['page'][] = array('page' => $PLUGINS_DIRECTORY.'content/content.php?content.'.$row2['content_id'], 'title' => $row2['content_heading']); + } + } + } +} + +?> \ No newline at end of file diff --git a/e107_plugins/content/e_latest.php b/e107_plugins/content/e_latest.php new file mode 100644 index 000000000..3d7b67842 --- /dev/null +++ b/e107_plugins/content/e_latest.php @@ -0,0 +1,20 @@ + db_Count($plugintable, '(*)', "WHERE content_refer='sa' "); +$text .= " +
    + +"; +if($reported_content) { + $text .= " ".CONTENT_LATEST_LAN_1." $reported_content"; +} else { + $text .= CONTENT_LATEST_LAN_1." ".$reported_content; +} +$text .= "
    "; + +?> \ No newline at end of file diff --git a/e107_plugins/content/e_list.php b/e107_plugins/content/e_list.php new file mode 100644 index 000000000..b35457a67 --- /dev/null +++ b/e107_plugins/content/e_list.php @@ -0,0 +1,111 @@ + db_Select("plugin", "*", "plugin_path = 'content' AND plugin_installflag = '1' ")){ + return; + } + + require_once(e_PLUGIN."content/handlers/content_class.php"); + $aa = new content; + + $datequery = " AND content_datestamp < ".time()." AND (content_enddate=0 || content_enddate>".time().") "; + + global $contentmode; + //contentmode : content_144 (content_ + idvalue) + if($contentmode){ + $headingquery = " AND content_id = '".substr($contentmode,8)."' "; + }else{ + $headingquery = ""; + } + + //get main parent types + $sqlm = new db; + if(!$mainparents = $sqlm -> db_Select("pcontent", "*", "content_class REGEXP '".e_CLASS_REGEXP."' AND content_parent = '0' ".$datequery." ".$headingquery." ORDER BY content_heading")){ + $LIST_DATA = "no valid content category"; + }else{ + while($rowm = $sqlm -> db_Fetch()){ + $ICON = ""; + $HEADING = ""; + $AUTHOR = ""; + $CATEGORY = ""; + $DATE = ""; + $INFO = ""; + $LIST_CAPTION = $rowm['content_heading']; + + //global var for this main parent + $mainparent = $rowm['content_id']; + + //get path variables + $content_recent_pref = $aa -> getContentPref($mainparent); + $content_recent_pref["content_icon_path"] = ($content_recent_pref["content_icon_path"] ? $content_recent_pref["content_icon_path"] : "{e_PLUGIN}content/images/icon/" ); + $content_icon_path = $tp -> replaceConstants($content_recent_pref["content_icon_path"]); + + //prepare query string + $array = $aa -> getCategoryTree("", $mainparent, TRUE); + $validparent = implode(",", array_keys($array)); + $qry = " content_refer !='sa' AND content_parent REGEXP '".$aa -> CONTENTREGEXP($validparent)."' AND content_class REGEXP '".e_CLASS_REGEXP."' "; + + //check so only the preferences from the correct content_type (article, content, review etc) are used and rendered + if(substr($contentmode,8) == $rowm['content_id']){ + + if($mode == "new_page" || $mode == "new_menu" ){ + $lvisit = $this -> getlvisit(); + $qry = $qry." AND content_datestamp>".$lvisit; + }else{ + $qry = $qry." ".$datequery; + } + $qry .= " ORDER BY content_datestamp DESC LIMIT 0,".intval($arr[7]); + + //get recent content for each main parent + $sqli = new db; + if(!$resultitem = $sqli -> db_Select("pcontent", "*", $qry)){ + $LIST_DATA = "no items in ".$rowm['content_heading']; + }else{ + $LIST_DISPLAYSTYLE = ($arr[2] ? "" : "none"); + + while($rowi = $sqli -> db_Fetch()){ + $rowheading = $this -> parse_heading($rowi['content_heading'], $mode); + $HEADING = "".$rowheading.""; + //category + if($arr[4]){ + $crumb = ""; + if(array_key_exists($rowi['content_parent'], $array)){ + $newarr = $array[$rowi['content_parent']]; + $newarr = array_reverse($newarr); + $CATEGORY = "".$newarr[0].""; + } + } + + $DATE = ($arr[5] ? $this -> getListDate($rowi['content_datestamp'], $mode) : ""); + //$ICON = $this -> getBullet($arr[6], $mode); + + $image_link_append = ""; + if($rowi['content_icon'] && file_exists(e_PLUGIN."content/images/icon/".$rowi['content_icon'])){ + $ICON = $image_link_append.""; + }else{ + $ICON = ""; + } + + //get author details + if($arr[3]){ + $authordetails = $aa -> getAuthor($rowi['content_author']); + if(USER && is_numeric($authordetails[0]) && $authordetails[0] != "0"){ + $AUTHOR = "".$authordetails[1].""; + }else{ + $AUTHOR = $authordetails[1]; + } + }else{ + $AUTHOR = ""; + } + $INFO = ""; + + $LIST_DATA[$mode][] = array( $ICON, $HEADING, $AUTHOR, $CATEGORY, $DATE, $INFO ); + } + } + } + } + } + + +?> \ No newline at end of file diff --git a/e107_plugins/content/e_meta.php b/e107_plugins/content/e_meta.php new file mode 100644 index 000000000..9cd5959de --- /dev/null +++ b/e107_plugins/content/e_meta.php @@ -0,0 +1,52 @@ +\n"; + +if(e_QUERY){ + $qs = explode(".", e_QUERY); + + if(is_numeric($qs[0])){ + $from = array_shift($qs); + }else{ + $from = "0"; + } +} +if(isset($qs[0]) && $qs[0] == "content" && isset($qs[1]) && is_numeric($qs[1]) ){ + $add_meta_keywords = ''; + //meta keywords from content item + if($sql -> db_Select('pcontent', "content_meta", "content_id='".intval($qs[1])."'")){ + list($row['content_meta']) = $sql -> db_Fetch(); + $exmeta = $row['content_meta']; + if($exmeta != ""){ + $exmeta = str_replace(", ", ",", $exmeta); + $exmeta = str_replace(" ", ",", $exmeta); + $exmeta = str_replace(",", ", ", $exmeta); + $add_meta_keywords = $exmeta; + } + } + if($add_meta_keywords){ + define("META_MERGE", TRUE); + define("META_KEYWORDS", " ".$add_meta_keywords); + } +} + + +?> \ No newline at end of file diff --git a/e107_plugins/content/e_notify.php b/e107_plugins/content/e_notify.php new file mode 100644 index 000000000..7ac5c1722 --- /dev/null +++ b/e107_plugins/content/e_notify.php @@ -0,0 +1,36 @@ + CONTENT_NOTIFY_LAN_2); + +if (!function_exists('notify_content')) { + function notify_content($data) { + global $nt; + foreach ($data as $key => $value) { + $message .= $key.': '.$value.'
    '; + } + $nt -> send('content', CONTENT_NOTIFY_LAN_3, $message); + } +} + +?> \ No newline at end of file diff --git a/e107_plugins/content/e_rss.php b/e107_plugins/content/e_rss.php new file mode 100644 index 000000000..9f6d74fd4 --- /dev/null +++ b/e107_plugins/content/e_rss.php @@ -0,0 +1,76 @@ +$v){ + $eplug_rss_feed[] = $v; +} + +function get_rss(){ + global $aa; + + require_once(e_PLUGIN."content/handlers/content_class.php"); + $aa = new content; + $rss = array(); + $array = $aa -> getCategoryTree('', '', FALSE); + foreach($array as $k=>$v){ + $name = ''; + for($i=0;$i "; + $i++; + } + $name = substr($name,0,-3); + $feed['name'] = $name; + $feed['url'] = 'content'; //the identifier for the rss feed url + $feed['topic_id'] = $k; //the topic_id, empty on default (to select a certain category) + $feed['path'] = 'content'; //this is the plugin path location + $feed['text'] = 'this is the rss feed for content category : '.$name; + $feed['class'] = '0'; + $feed['limit'] = '9'; + $rss[] = $feed; + } + return $rss; +} +//##### ------------------------------------------------------------------------------------ + + +//##### create rss data, return as array $eplug_rss_data ----------------------------------- +$mainparent = $aa -> getMainParent($this->topicid); +$content_pref = $aa -> getContentPref($mainparent); +$array = $aa -> getCategoryTree("", $mainparent, TRUE); +$datequery = " AND content_datestamp < ".time()." AND (content_enddate=0 || content_enddate>".time().") "; +$qry = " content_refer !='sa' ".$datequery." AND content_class REGEXP '".e_CLASS_REGEXP."' AND content_parent = '".$this->topicid."' ORDER BY content_datestamp DESC LIMIT 0,".$this -> limit; + +$rss = array(); +$sqlrss = new db; +if($items = $sqlrss -> db_Select('pcontent', "*", $qry )){ + $i=0; + while($rowrss = $sqlrss -> db_Fetch()){ + //$author = array($author_id, $author_name, $author_email, $content_author); + $author = $aa -> getAuthor($rowrss['content_author']); + $rss[$i]['author'] = $author[1]; + $rss[$i]['author_email'] = $author[2]; + $rss[$i]['link'] = $e107->base_path.$PLUGINS_DIRECTORY."content/content.php?content.".$rowrss['content_id']; + $rss[$i]['linkid'] = $rowrss['content_id']; + $rss[$i]['title'] = $rowrss['content_heading']; + $rss[$i]['description'] = $rowrss['content_subheading']; + $rss[$i]['category_name'] = $array[$rowrss['content_parent']][count($array[$rowrss['content_parent']])-1]; + $rss[$i]['category_link'] = $e107->base_path.$PLUGINS_DIRECTORY."content/content.php?cat.".$rowrss['content_parent']; + $rss[$i]['datestamp'] = $rowrss['content_datestamp']; + $rss[$i]['enc_url'] = ""; + $rss[$i]['enc_leng'] = ""; + $rss[$i]['enc_type'] = ""; + $i++; + } +} +$eplug_rss_data[] = $rss; +//##### ------------------------------------------------------------------------------------ + +?> \ No newline at end of file diff --git a/e107_plugins/content/e_search.php b/e107_plugins/content/e_search.php new file mode 100644 index 000000000..4145f3247 --- /dev/null +++ b/e107_plugins/content/e_search.php @@ -0,0 +1,11 @@ + e_PLUGIN.'content/search/search_parser.php', 'qtype' => CONT_SCH_LAN_1, 'refpage' => 'content.php', 'advanced' => e_PLUGIN.'content/search/search_advanced.php'); + +?> \ No newline at end of file diff --git a/e107_plugins/content/e_status.php b/e107_plugins/content/e_status.php new file mode 100644 index 000000000..6f87fbe7c --- /dev/null +++ b/e107_plugins/content/e_status.php @@ -0,0 +1,18 @@ + db_Count("pcontent", "(*)", "WHERE LEFT(content_parent,1) != '0' AND content_refer != 'sa'"); +if($total == 0){ +$text .= "
    Content: ".$total."
    "; +}else{ +$text .= ""; +} +$maincat = $sql -> db_Select("pcontent", "content_id, content_heading", "LEFT(content_parent,1) = '0' ORDER BY content_heading"); +$text .= ""; +?> \ No newline at end of file diff --git a/e107_plugins/content/handlers/content_class.php b/e107_plugins/content/handlers/content_class.php new file mode 100644 index 000000000..bdab9f0c3 --- /dev/null +++ b/e107_plugins/content/handlers/content_class.php @@ -0,0 +1,1513 @@ +".time().") "; + +require_once($plugindir."handlers/content_defines.php"); + +if(!is_object($sql)){ $sql = new db; } + +class content{ + + function ContentDefaultPrefs(){ + global $tp; + + //ADMIN CREATE FORM + $content_pref['content_admin_subheading'] = "1"; //should subheading be available + $content_pref['content_admin_summary'] = "1"; //should summary be available + $content_pref['content_admin_startdate'] = "1"; //should start date be available + $content_pref['content_admin_enddate'] = "1"; //should end date be available + $content_pref['content_admin_icon'] = "0"; //should icon be available to add when creating an item + $content_pref['content_admin_attach'] = "0"; //should file be available to add when creating an item + $content_pref['content_admin_images'] = "0"; //should image be available to add when creating an item + $content_pref['content_admin_comment'] = "1"; //should comment be available to add when creating an item + $content_pref['content_admin_rating'] = "1"; //should rating be available to add when creating an item + $content_pref['content_admin_score'] = "1"; //should score be available to add when creating an item + $content_pref['content_admin_pe'] = "1"; //should printemailicons be available to add when creating an item + $content_pref['content_admin_visibility'] = "1"; //should visibility be available to add when creating an item + $content_pref['content_admin_meta'] = "0"; //should metatags be available to add when creating an item + $content_pref['content_admin_custom_number'] = "0"; //how many customtags should be available to add when creating an item + $content_pref['content_admin_images_number'] = "0"; //how many images should be available to add when creating an item + $content_pref['content_admin_files_number'] = "0"; //how many files should be available to add when creating an item + $content_pref['content_admin_layout'] = "0"; //should the option for choosing a layout template be shown + $content_pref['content_admin_customtags'] = "0"; //should options for adding additional data be shown + $content_pref['content_admin_presettags'] = "0"; //should preset data tags be shown + + //ADMIN CREATE CATEGORY FORM + $content_pref['content_admincat_subheading'] = '1'; //should subheading be available + $content_pref['content_admincat_startdate'] = '1'; //should startdate be available + $content_pref['content_admincat_enddate'] = '1'; //should enddate be available + $content_pref['content_admincat_uploadicon'] = '1'; //should uploadicon be available + $content_pref['content_admincat_selecticon'] = '1'; //should selecticon be available + $content_pref['content_admincat_comment'] = '1'; //should comment be available + $content_pref['content_admincat_rating'] = '1'; //should rating be available + $content_pref['content_admincat_pe'] = '1'; //should print email icons be available + $content_pref['content_admincat_visibility'] = '1'; //should visibility be available + + //SUBMIT FORM + $content_pref['content_submit'] = "0"; //should users be able to submit an item + $content_pref['content_submit_class'] = "0"; //define which userclass is able to submit an item + $content_pref['content_submit_directpost'] ="0"; //should submission be direclty posted as an item, or have them validated by admins + $content_pref['content_submit_subheading'] = '1'; //should subheading be available + $content_pref['content_submit_summary'] = '1'; //should summary be available + $content_pref['content_submit_startdate'] = '1'; //should startdate be available + $content_pref['content_submit_enddate'] = '1'; //should enddate be available + $content_pref['content_submit_icon'] = "0"; //should icon be available to add when submitting an item + $content_pref['content_submit_attach'] = "0"; //should file be available to add when submitting an item + $content_pref['content_submit_images'] = "0"; //should image be available to add when submitting an item + $content_pref['content_submit_comment'] = "0"; //should comment be available to add when submitting an item + $content_pref['content_submit_rating'] = "0"; //should rating be available to add when submitting an item + $content_pref['content_submit_score'] = "0"; //should score be available to add when submitting an item + $content_pref['content_submit_pe'] = "0"; //should printemailicons be available to add when submitting an item + $content_pref['content_submit_visibility'] = "0"; //should visibility be available to add when submitting an item + $content_pref['content_submit_meta'] = "0"; //should metatags be available to add when submitting an item + $content_pref['content_submit_custom_number'] = "0"; //how many customtags should be available to add when submitting an item + $content_pref['content_submit_images_number'] = "0"; //how many images should be available to add when submitting an item + $content_pref['content_submit_files_number'] = "0"; //how many files should be available to add when submitting an item + $content_pref['content_submit_layout'] = "0"; //should the option for choosing a layout template be shown + $content_pref['content_submit_customtags'] = "0"; //should options for adding additional data be shown + $content_pref['content_submit_presettags'] = "0"; //should preset data tags be shown + + //PATH THEME CSS + $content_pref['content_cat_icon_path_large'] = "{e_PLUGIN}content/images/cat/48/"; //default path to large categry icons + $content_pref['content_cat_icon_path_small'] = "{e_PLUGIN}content/images/cat/16/"; //default path to small category icons + + $content_pref['content_icon_path'] = "{e_PLUGIN}content/images/icon/"; //default path to item icons + $content_pref['content_icon_path_tmp'] = "{e_PLUGIN}content/images/icon/tmp/"; //default tmp path to item icons + + $content_pref['content_image_path'] = "{e_PLUGIN}content/images/image/"; //default path to item images + $content_pref['content_image_path_tmp'] = "{e_PLUGIN}content/images/image/tmp/"; //default tmp path to item images + + $content_pref['content_file_path'] = "{e_PLUGIN}content/images/file/"; //default path to item file attachments + $content_pref['content_file_path_tmp'] = "{e_PLUGIN}content/images/file/tmp/"; //default tmp path to item file attachments + + $content_pref['content_theme'] = "{e_PLUGIN}content/templates/default/"; //choose theme for main parent + $content_pref['content_layout'] = "content_content_template.php"; //choose default layout scheme + + //GENERAL + $content_pref['content_log'] = "0"; //activate log + $content_pref['content_blank_icon'] = "0"; //use blank icon if no icon present + $content_pref['content_blank_caticon'] = "0"; //use blank caticon if no caticon present + $content_pref['content_breadcrumb_catall'] = "0"; //show breadcrumb on all categories page + $content_pref['content_breadcrumb_cat'] = "0"; //show breadcrumb on single category page + $content_pref['content_breadcrumb_authorall'] = "0"; //show breadcrumb on all author page + $content_pref['content_breadcrumb_author'] = "0"; //show breadcrumb on single author page + $content_pref['content_breadcrumb_recent'] = "0"; //show breadcrumb on recent page + $content_pref['content_breadcrumb_item'] = "0"; //show breadcrumb on content item page + $content_pref['content_breadcrumb_top'] = "0"; //show breadcrumb on top rated page + $content_pref['content_breadcrumb_archive'] = "0"; //show breadcrumb on archive page + $content_pref['content_breadcrumb_seperator{$id}'] = ">"; //seperator character between breadcrumb + $content_pref['content_breadcrumb_rendertype'] = "2"; //how to render the breadcrumb + $content_pref['content_navigator_catall'] = "0"; //show navigator on all categories page + $content_pref['content_navigator_cat'] = "0"; //show navigator on single category page + $content_pref['content_navigator_authorall'] = "0"; //show navigator on all author page + $content_pref['content_navigator_author'] = "0"; //show navigator on single author page + $content_pref['content_navigator_recent'] = "0"; //show navigator on recent page + $content_pref['content_navigator_item'] = "0"; //show navigator on content item page + $content_pref['content_navigator_top'] = "0"; //show navigator on top rated page + $content_pref['content_navigator_archive'] = "0"; //show navigator on archive page + $content_pref['content_search_catall'] = "0"; //show search keyword on all categories page + $content_pref['content_search_cat'] = "0"; //show search keyword on single category page + $content_pref['content_search_authorall'] = "0"; //show search keyword on all author page + $content_pref['content_search_author'] = "0"; //show search keyword on single author page + $content_pref['content_search_recent'] = "0"; //show search keyword on recent page + $content_pref['content_search_item'] = "0"; //show search keyword on content item page + $content_pref['content_search_top'] = "0"; //show search keyword on top rated page + $content_pref['content_search_archive'] = "0"; //show search keyword on archive page + $content_pref['content_ordering_catall'] = "0"; //show ordering on all categories page + $content_pref['content_ordering_cat'] = "0"; //show ordering on single category page + $content_pref['content_ordering_authorall'] = "0"; //show ordering on all author page + $content_pref['content_ordering_author'] = "0"; //show ordering on single author page + $content_pref['content_ordering_recent'] = "0"; //show ordering on recent page + $content_pref['content_ordering_item'] = "0"; //show ordering on content item page + $content_pref['content_ordering_top'] = "0"; //show ordering on top rated page + $content_pref['content_ordering_archive'] = "0"; //show ordering on archive page + $content_pref['content_searchmenu_rendertype'] = "1"; //rendertype for searchmenu (1=echo, 2=in separate menu) + $content_pref['content_nextprev'] = "1"; //use nextprev buttons + $content_pref['content_nextprev_number'] = "10"; //how many items on a page + $content_pref['content_defaultorder'] = "orderddate"; //default sort and order method + //upload icon/image size handling + $content_pref['content_upload_image_size'] = "500"; //resize size of uploaded image + $content_pref['content_upload_image_size_thumb'] = "100"; //resize size of created thumb on uploaded image + $content_pref['content_upload_icon_size'] = "100"; //resize size of uploaded icon + + //CONTENT ITEM PREVIEW + $content_pref['content_list_icon'] = "0"; //show icon + $content_pref['content_list_subheading'] = "1"; //show subheading + $content_pref['content_list_summary'] = "1"; //show summary + $content_pref['content_list_text'] = "0"; //show (part of) text + $content_pref['content_list_date'] = "0"; //show date + $content_pref['content_list_authorname'] = "0"; //show authorname + $content_pref['content_list_authorprofile'] = "0"; //show link to author profile + $content_pref['content_list_authoremail'] = "0"; //show authoremail + $content_pref['content_list_authoricon'] = "0"; //show link to author list + $content_pref['content_list_rating'] = "1"; //show rating system + $content_pref['content_list_peicon'] = "1"; //show printemailicons + $content_pref['content_list_parent'] = "0"; //show parent cat + $content_pref['content_list_refer'] = "0"; //show refer count + $content_pref['content_list_subheading_char'] = "100"; //how many subheading characters + $content_pref['content_list_subheading_post'] = "[...]"; //use a postfix for too long subheadings + $content_pref['content_list_summary_char'] = "100"; //how many summary characters + $content_pref['content_list_summary_post'] = "[...]"; //use a postfix for too long summary + $content_pref['content_list_text_char'] = "60"; //how many text words + $content_pref['content_list_text_post'] = CONTENT_LAN_16; //use a postfix for too long text + $content_pref['content_list_text_link'] = "1"; //show link to content item on postfix + $content_pref['content_list_authoremail_nonmember'] = "0"; //show email non member author + $content_pref['content_list_peicon_all'] = "0"; //override printemail icons + $content_pref['content_list_rating_all'] = "0"; //override rating system + $content_pref['content_list_editicon'] = "0"; //show link to admin edit item + $content_pref['content_list_datestyle'] = "%d %b %Y"; //choose datestyle for given date + $content_pref['content_list_caption'] = CONTENT_LAN_23; //caption for recent list + $content_pref['content_list_caption_append_name'] = '1'; //append category heading to caption + + //CATEGORY PAGES + //sections of content category in 'view all categories page' + $content_pref['content_catall_icon'] = "1"; //show icon + $content_pref['content_catall_subheading'] = "1"; //show subheading + $content_pref['content_catall_text'] = "0"; //show text + $content_pref['content_catall_date'] = "0"; //show date + $content_pref['content_catall_rating'] = "1"; //show rating + $content_pref['content_catall_authorname'] = "0"; //show author name + $content_pref['content_catall_authoremail'] = "0"; //show author email + $content_pref['content_catall_authorprofile'] = "0"; //show link to author profile + $content_pref['content_catall_authoricon'] = "0"; //show link to author list + $content_pref['content_catall_peicon'] = "1"; //show pe icons + $content_pref['content_catall_comment'] = "1"; //show amount of comments + $content_pref['content_catall_amount'] = "0"; //show amount of items + $content_pref['content_catall_text_char'] = "65"; //define amount of words of text to display + $content_pref['content_catall_text_post'] = CONTENT_LAN_16; //define postfix is text is too long + $content_pref['content_catall_text_link'] = "1"; //define if link to category should be added on postfix + $content_pref['content_catall_caption'] = CONTENT_LAN_25; //caption for all categories page + //sections of content category in 'view category' page + $content_pref['content_cat_icon'] = "1"; //show icon + $content_pref['content_cat_subheading'] = "1"; //show subheading + $content_pref['content_cat_text'] = "0"; //show text + $content_pref['content_cat_date'] = "0"; //show date + $content_pref['content_cat_authorname'] = "0"; //show author name + $content_pref['content_cat_authoremail'] = "0"; //show author email + $content_pref['content_cat_authorprofile'] = "0"; //show link to author profile + $content_pref['content_cat_authoricon'] = "0"; //show link to author list + $content_pref['content_cat_rating'] = "1"; //show rating + $content_pref['content_cat_peicon'] = "1"; //show pe icons + $content_pref['content_cat_comment'] = "1"; //show amount of comments + $content_pref['content_cat_amount'] = "1"; //show amount of items + $content_pref['content_cat_caption'] = CONTENT_LAN_26; //caption for single category page + $content_pref['content_cat_caption_append_name'] = '1'; //append category heading to caption + $content_pref['content_cat_sub_caption'] = CONTENT_LAN_28; //caption for subcategories + $content_pref['content_cat_item_caption'] = CONTENT_LAN_31; //caption for items in category + + //sections of subcategories in 'view category page' + $content_pref['content_catsub_icon'] = "1"; //show icon + $content_pref['content_catsub_subheading'] = "1"; //show subheading + $content_pref['content_catsub_amount'] = "1"; //show amount of items + $content_pref['content_cat_showparent'] = "1"; //show parent item in category page + $content_pref['content_cat_showparentsub'] = "1"; //show subcategories in category page + $content_pref['content_cat_listtype'] = "0"; //also show items from subategories + $content_pref['content_cat_menuorder'] = "1"; //order of parent and child items + $content_pref['content_cat_rendertype'] = "2"; //render method of the menus + $content_pref['content_cat_text_char'] = "65"; //define amount of words of text to display + $content_pref['content_cat_text_post'] = CONTENT_LAN_16; //define postfix is text is too long + $content_pref['content_cat_text_link'] = "1"; //define if link to category should be added on postfix + $content_pref['content_cat_authoremail_nonmember'] = "0"; //define if the email of a non-member will be displayed + $content_pref['content_cat_peicon_all'] = "0"; //override printemail icons + $content_pref['content_cat_rating_all'] = "0"; //override rating system + + //CONTENT PAGE + $content_pref['content_content_icon'] = "0"; //show icon + $content_pref['content_content_subheading'] = "1"; //show subheading + $content_pref['content_content_summary'] = "1"; //show summary + $content_pref['content_content_date'] = "0"; //show date + $content_pref['content_content_authorname'] = "1"; //show authorname + $content_pref['content_content_authorprofile'] = "0"; //show link to author profile + $content_pref['content_content_authoremail'] = "0"; //show suthoremail + $content_pref['content_content_authoricon'] = "0"; //show link to author list + $content_pref['content_content_parent'] = "0"; //show parent category + $content_pref['content_content_rating'] = "1"; //show rating system + $content_pref['content_content_peicon'] = "1"; //show printemailicons + $content_pref['content_content_refer'] = "0"; //show refer count + $content_pref['content_content_comment'] = "0"; //show amount of comments + $content_pref['content_content_authoremail_nonmember'] = "0"; //show email non member + $content_pref['content_content_peicon_all'] = "0"; //override printemail icons + $content_pref['content_content_rating_all'] = "0"; //override rating system + $content_pref['content_content_comment_all'] = "0"; //override comment system + $content_pref['content_content_editicon'] = "0"; //show link in content page to admin edit item + $content_pref['content_content_customtags'] = "0"; //should additional data be shown + $content_pref['content_content_presettags'] = "0"; //should preset data tags be shown + $content_pref['content_content_attach'] = "0"; //show attachments + $content_pref['content_content_images'] = "0"; //show images + $content_pref['content_content_pagenames_rendertype'] = "0"; //rendertype for articleindex on multipage content items + $content_pref['content_content_multipage_preset'] = "0"; //render custom/preset in multipage item first/last page + + //AUTHOR PAGE + $content_pref['content_author_lastitem'] = "0"; //show last item reference + $content_pref['content_author_amount'] = "1"; //show amount of items from this author + $content_pref['content_author_nextprev'] = "1"; //use next prev buttons + $content_pref['content_author_nextprev_number'] = "20"; //amount of items per page + $content_pref['content_author_index_caption'] = CONTENT_LAN_32; //caption for author index page + $content_pref['content_author_caption'] = CONTENT_LAN_32; //caption for single author page + $content_pref['content_author_caption_append_name'] = '1'; //append author name to caption + + //ARCHIVE PAGE + $content_pref['content_archive_nextprev'] = "1"; //archive : choose to show next/prev links + $content_pref['content_archive_nextprev_number'] = "30"; //archive : choose amount to use in next/prev + $content_pref['content_archive_letterindex'] = "0"; //archive : letter index + $content_pref['content_archive_datestyle'] = "%d %b %Y"; //archive : choose datestyle for given date + $content_pref['content_archive_date'] = "1"; //archive : section: show date + $content_pref['content_archive_authorname'] = "0"; //archive : section: show authorname + $content_pref['content_archive_authorprofile'] = "0"; //archive : section: show link to author profile + $content_pref['content_archive_authoricon'] = "0"; //archive : section: show link to author list + $content_pref['content_archive_authoremail'] = "0"; //archive : section: show author email + $content_pref['content_archive_authoremail_nonmember'] = "0"; //archive : show link to email of non-member author + $content_pref['content_archive_caption'] = CONTENT_LAN_84; //caption for archive page + + //TOP RATED PAGE + $content_pref['content_top_icon'] = "0"; //top : section: show icon + $content_pref['content_top_authorname'] = "0"; //top : section: show authorname + $content_pref['content_top_authorprofile'] = "0"; //top : section: show link to author profile + $content_pref['content_top_authoricon'] = "0"; //top : section: show link to author list + $content_pref['content_top_authoremail'] = "0"; //top : section: show author email + $content_pref['content_top_authoremail_nonmember'] = "0"; //top : show link to email of non-member author + $content_pref['content_top_icon_width'] = ''; //use this size for icon + $content_pref['content_top_caption'] = CONTENT_LAN_38; //caption for top rated page + $content_pref['content_top_caption_append_name'] = '1'; //append category heading to caption + + //TOP SCORE PAGE + $content_pref['content_score_icon'] = "0"; //score : section: show icon + $content_pref['content_score_authorname'] = "0"; //score : section: show authorname + $content_pref['content_score_authorprofile'] = "0"; //score : section: show link to author profile + $content_pref['content_score_authoricon'] = "0"; //score : section: show link to author list + $content_pref['content_score_authoremail'] = "0"; //score : section: show author email + $content_pref['content_score_authoremail_nonmember'] = "0"; //score : show link to email of non-member author + $content_pref['content_score_icon_width'] = ''; //use this size for icon + $content_pref['content_score_caption'] = CONTENT_LAN_87; //caption for top score page + $content_pref['content_score_caption_append_name'] = '1'; //append category heading to caption + + //MENU OPTIONS + $content_pref['content_menu_caption'] = CONTENT_MENU_LAN_0; //caption of menu + $content_pref['content_menu_search'] = "0"; //show search keyword + $content_pref['content_menu_sort'] = "0"; //show sorting methods + $content_pref['content_menu_links'] = "1"; //show content links + $content_pref['content_menu_links_dropdown'] = "0"; //rendertype of content links (in dropdown or as normal links) + $content_pref['content_menu_links_icon'] = "0"; //define icon for content links (only with normallinks) + $content_pref['content_menu_links_caption'] = CONTENT_MENU_LAN_4; //define caption for link list (only is normallinks is selected) + $content_pref['content_menu_viewallcat'] = "1"; //menu: view link to all categories + $content_pref['content_menu_viewallauthor'] = "1"; //menu: view link to all authors + $content_pref['content_menu_viewallitems'] = "1"; //menu: view link to all items (archive) + $content_pref['content_menu_viewtoprated'] = "0"; //menu: view link to top rated items + $content_pref['content_menu_viewtopscore'] = "0"; //menu: view link to top score items + $content_pref['content_menu_viewrecent'] = "1"; //menu: view link to recent items + $content_pref['content_menu_viewsubmit'] = "0"; //view link to submit content item (only if it is allowed) + $content_pref['content_menu_viewicon'] = "0"; //choose icon to display for links + $content_pref['content_menu_cat'] = "1"; //view categories + $content_pref['content_menu_cat_main'] = "1"; //show main parent in the category list + $content_pref['content_menu_cat_number'] = "1"; //show number of items in category + $content_pref['content_menu_cat_icon'] = "0"; //choose icon to display for categories + $content_pref['content_menu_cat_icon_default'] = "0"; //choose default icon is no icon present (only if category_icon is selected) + $content_pref['content_menu_cat_caption'] = CONTENT_MENU_LAN_3; //define caption for category list + $content_pref['content_menu_cat_dropdown'] = "0"; //rendertype of categories (in dropdown or as normal links) + $content_pref['content_menu_recent'] = "1"; //view recent list + $content_pref['content_menu_recent_caption'] = CONTENT_MENU_LAN_2; //caption of recent list + $content_pref['content_menu_recent_number'] = "5"; //number of recent items to show + $content_pref['content_menu_recent_date'] = "0"; //show date in recent list + $content_pref['content_menu_recent_datestyle'] = "%d %b %Y"; //choose datestyle for given date + $content_pref['content_menu_recent_author'] = "0"; //show author in recent list + $content_pref['content_menu_recent_subheading'] = "0"; //show subheading in recent list + $content_pref['content_menu_recent_subheading_char'] = "80"; //number of characters of subheading to show + $content_pref['content_menu_recent_subheading_post'] = "[...]"; //postfix for too long subheadings + $content_pref['content_menu_recent_icon'] = "0"; //choose icon to display for recent items + $content_pref['content_menu_recent_icon_width'] = "50"; //specify width of icon (only if content_icon is set) + + $content_pref['content_inherit'] = '0'; //inherit options from default preferences + + //CONTENT MANAGER + $content_pref['content_manager_approve'] = '0'; //class for managers who can approve submitted items + $content_pref['content_manager_personal'] = '0'; //class for managers who can manage personal items + $content_pref['content_manager_category'] = '0'; //class for managers who can manage all items in a category + + //PAGE RESTRICTION (NOT YET IN USE) + $content_pref['content_restrict_managecontent'] = '0'; + $content_pref['content_restrict_createcontent'] = '0'; + $content_pref['content_restrict_managecat'] = '0'; + $content_pref['content_restrict_createcat'] = '0'; + $content_pref['content_restrict_order'] = '0'; + $content_pref['content_restrict_options'] = '0'; + $content_pref['content_restrict_adminmanager'] = '0'; + $content_pref['content_restrict_restrict'] = '0'; + $content_pref['content_restrict_recent'] = '0'; + $content_pref['content_restrict_allcat'] = '0'; + $content_pref['content_restrict_onecat'] = '0'; + $content_pref['content_restrict_contentitem'] = '0'; + $content_pref['content_restrict_author'] = '0'; + $content_pref['content_restrict_archive'] = '0'; + $content_pref['content_restrict_toprated'] = '0'; + $content_pref['content_restrict_topscore'] = '0'; + $content_pref['content_restrict_submit'] = '0'; + $content_pref['content_restrict_frontmanager'] = '0'; + + return $content_pref; + } + + + + function getContentPref($id="") { + global $sql, $plugintable, $qs, $tp, $eArrayStorage; + + $plugintable = "pcontent"; + +//echo "get content pref : ".$id."
    "; + + if($id && $id!="0"){ //if $id; use prefs from content table + $id = intval($id); + $num_rows = $sql -> db_Select($plugintable, "content_pref", "content_id='$id' "); + $row = $sql -> db_Fetch(); + if (empty($row['content_pref'])) { + //if no prefs present yet, get them from core (default preferences) + $num_rows = $sql -> db_Select("core", "*", "e107_name='$plugintable' "); + //if those are not present, insert the default ones given in this file + if ($num_rows == 0) { + $content_pref = $this -> ContentDefaultPrefs(); + $tmp = $eArrayStorage->WriteArray($content_pref); + $sql -> db_Insert("core", "'$plugintable', '{$tmp}' "); + $sql -> db_Select("core", "*", "e107_name='$plugintable' "); + } + $row = $sql -> db_Fetch(); + $content_pref = $eArrayStorage->ReadArray($row['e107_value']); + + //create array of custom preset tags + foreach($content_pref['content_custom_preset_key'] as $ck => $cv){ + if(!empty($cv)){ + $string[] = $cv; + } + } + if($string){ + $content_pref['content_custom_preset_key'] = $string; + }else{ + unset($content_pref['content_custom_preset_key']); + } + + //finally we can store the new default prefs into the db + $tmp1 = $eArrayStorage->WriteArray($content_pref); + $sql -> db_Update($plugintable, "content_pref='{$tmp1}' WHERE content_id='$id' "); + $sql -> db_Select($plugintable, "content_pref", "content_id='$id' "); + $row = $sql -> db_Fetch(); + } + $content_pref = $eArrayStorage->ReadArray($row['content_pref']); + + if(e_PAGE == "admin_content_config.php" && isset($qs[0]) && $qs[0] == 'option'){ + }else{ + //check inheritance, if set, get core prefs (default prefs) + if(isset($content_pref['content_inherit']) && $content_pref['content_inherit']!=''){ + $sql -> db_Select("core", "*", "e107_name='$plugintable' "); + $row = $sql -> db_Fetch(); + $content_pref = $eArrayStorage->ReadArray($row['e107_value']); + } + } + + }else{ //if not $id; use prefs from default core table + $num_rows = $sql -> db_Select("core", "*", "e107_name='$plugintable' "); + if ($num_rows == 0) { + $content_pref = $this -> ContentDefaultPrefs(); + $tmp = $eArrayStorage->WriteArray($content_pref); + $sql -> db_Insert("core", "'$plugintable', '{$tmp}' "); + $sql -> db_Select("core", "*", "e107_name='$plugintable' "); + } + $row = $sql -> db_Fetch(); + $content_pref = $eArrayStorage->ReadArray($row['e107_value']); + } + return $content_pref; + } + + //admin + function UpdateContentPref($id){ + global $qs, $plugintable, $sql, $tp, $eArrayStorage; + + if(!is_object($sql)){ $sql = new db; } + +//echo "update content pref : ".$id."
    "; + + //insert default preferences into core + if($id == "0"){ + $num_rows = $sql -> db_Select("core", "*", "e107_name='$plugintable' "); + if ($num_rows == 0) { + $sql -> db_Insert("core", "'$plugintable', '' "); + }else{ + $row = $sql -> db_Fetch(); + } + + //insert category preferences into plugintable + }else{ + $sql -> db_Select($plugintable, "content_pref", "content_id='".intval($id)."' "); + $row = $sql -> db_Fetch(); + $current = $eArrayStorage->ReadArray($row['content_pref']); + foreach($current as $k => $v){ + if(isset($qs[0]) && $qs[0] == 'option' ){ + if( strpos($k, "content_manager_") === 0 || strpos($k, "content_restrict_") === 0 ){ + $content_pref[$k] = $tp->toDB($v); + } + }elseif(isset($qs[0]) && ($qs[0] == 'manager' || $qs[0] == 'restrict')){ + if( strpos($k, "content_") === 0 ){ + $content_pref[$k] = $tp->toDB($v); + } + } + } + } + + //create array of custom preset tags + foreach($_POST['content_custom_preset_key'] as $ck => $cv){ + if(!empty($cv)){ + $string[] = $cv; + } + } + $_POST['content_custom_preset_key'] = $string; + + //echo "
    "; print_r($_POST); echo "
    "; + + foreach($_POST as $k => $v){ + if(strpos($k, "content_") === 0){ + $content_pref[$k] = $tp->toDB($v); + } + } + + //create new array of preferences + $tmp = $eArrayStorage->WriteArray($content_pref); + if($id == "0"){ + $sql -> db_Update("core", "e107_value = '{$tmp}' WHERE e107_name = '$plugintable' "); + }else{ + $sql -> db_Update($plugintable, "content_pref='{$tmp}' WHERE content_id='".intval($id)."' "); + } + + return $content_pref; + } + + function CONTENTREGEXP($var){ + return "(^|,)(".str_replace(",", "|", $var).")(,|$)"; + } + + function getCategoryTree($id, $parent, $classcheck=TRUE){ + //id : content_parent of an item + global $plugintable, $datequery; + global $agc; + + if($parent){ + $agc = ""; + $qrygc = " content_id = '".intval($parent)."' "; + }else{ + $qrygc = " content_parent = '0' "; + } + if($id){ + $qrygc = " content_parent = '0.".intval($id)."' "; + } + + if($classcheck == TRUE){ + $qrygc .= " AND content_class REGEXP '".e_CLASS_REGEXP."' "; + } + + $datequery = " AND content_datestamp < ".time()." AND (content_enddate=0 || content_enddate>".time().") "; + + $sqlgetcat = new db; + if($sqlgetcat -> db_Select($plugintable, "content_id, content_heading, content_parent", " ".$qrygc." ".$datequery." " )){ + while($row = $sqlgetcat -> db_Fetch()){ + if($agc){ + if($row['content_parent'] != "0"){ + if(array_key_exists(substr($row['content_parent'],2), $agc)){ + if(is_array($agc[substr($row['content_parent'],2)])){ + $agc[$row['content_id']] = array_merge_recursive($agc[substr($row['content_parent'],2)], array($row['content_id'], $row['content_heading'])); + }else{ + $agc[$row['content_id']] = array($agc[substr($row['content_parent'],2)], array($row['content_id'], $row['content_heading'])); + } + + }else{ + $agc[$row['content_id']] = array($row['content_id'], $row['content_heading']); + } + }else{ + $agc[$row['content_id']] = array($row['content_id'], $row['content_heading']); + } + }else{ + $agc[$row['content_id']] = array($row['content_id'], $row['content_heading']); + } + $this -> getCategoryTree($row['content_id'], "", $classcheck); + } + } + return $agc; + } + + + + function getCrumbItem($id, $arr){ + //$id : content_parent of item + //$arr : array of all categories + $crumb = ""; + if(is_array($arr)){ + if(array_key_exists($id, $arr)){ + for($i=0;$i".$arr[$id][$i+1]." > "; + $i++; + } + $crumb = substr($crumb,0,-3); + } + } + return $crumb; + } + + function ShowNextPrev($mode='', $from='0', $number, $total){ + global $content_pref, $qs, $tp, $plugindir, $content_shortcodes, $CONTENT_NEXTPREV; + + if($total<=$number){ + return; + } + + $modepref = ($mode ? "content_{$mode}_nextprev" : "content_nextprev"); + if(isset($content_pref[$modepref]) && $content_pref[$modepref]){ + $np_querystring = e_SELF."?[FROM]".(isset($qs[0]) ? ".".$qs[0] : "").(isset($qs[1]) ? ".".$qs[1] : "").(isset($qs[2]) ? ".".$qs[2] : "").(isset($qs[3]) ? ".".$qs[3] : "").(isset($qs[4]) ? ".".$qs[4] : ""); + $parms = $total.",".$number.",".$from.",".$np_querystring.""; + + $CONTENT_NEXTPREV = $tp->parseTemplate("{NEXTPREV={$parms}}"); + + if(!isset($CONTENT_NP_TABLE)){ + if(!$content_pref["content_theme"]){ + require_once($plugindir."templates/default/content_np_template.php"); + }else{ + if(is_readable($tp->replaceConstants($content_pref["content_theme"])."content_np_template.php")){ + require_once($tp->replaceConstants($content_pref["content_theme"])."content_np_template.php"); + }else{ + require_once($plugindir."templates/default/content_np_template.php"); + } + } + } + echo $tp -> parseTemplate($CONTENT_NP_TABLE, FALSE, $content_shortcodes); + } + } + + function getCrumbPage($mode, $arr, $parent){ + global $qs, $ns, $content_pref, $plugintable; + + if(isset($content_pref["content_breadcrumb_{$mode}"]) && $content_pref["content_breadcrumb_{$mode}"]){ + $crumb = ''; + if(array_key_exists($parent, $arr)){ + $sep = (isset($content_pref["content_breadcrumb_seperator"]) ? $content_pref["content_breadcrumb_seperator"] : ">"); + if($content_pref["content_breadcrumb_base"] && isset($content_pref["content_breadcrumb_base"])){ + $crumb .= "".CONTENT_LAN_58." ".$sep." "; + } + if($content_pref["content_breadcrumb_self"] && isset($content_pref["content_breadcrumb_self"])){ + $crumb .= "".CONTENT_LAN_59." ".$sep." "; + } + for($i=0;$i".$arr[$parent][$i+1]." ".$sep." "; + $i++; + } + } + if($qs[0] == "recent"){ + $crumb .= "".CONTENT_LAN_60.""; + } + if($qs[0] == "author"){ + $crumb .= "".CONTENT_LAN_85.""; + if(is_numeric($qs[1])){ + global $sql; + $sql->db_Select($plugintable, "content_author","content_id='".intval($qs[1])."'"); + $row=$sql->db_Fetch(); + $au = $this->getAuthor($row['content_author']); + $crumb .= " ".$sep." ".$au[1].""; + } + } + if($qs[0] == "list"){ + $crumb .= "".CONTENT_LAN_13.""; + } + if($qs[0] == "top"){ + $crumb .= "".CONTENT_LAN_8.""; + } + if($qs[0] == "score"){ + $crumb .= "".CONTENT_LAN_12.""; + } + if($qs[0] == "content"){ + global $row; + $crumb .= $row['content_heading']; + } + $crumb = trim($crumb); + if(substr($crumb,-strlen(trim($sep))) == trim($sep)){ + $crumb = substr($crumb,0,-strlen(trim($sep))); + } + + $crumb = ""; + if(isset($content_pref["content_breadcrumb_rendertype"]) && $content_pref["content_breadcrumb_rendertype"] == "1"){ + echo $crumb; + return ""; + }elseif(isset($content_pref["content_breadcrumb_rendertype"]) && $content_pref["content_breadcrumb_rendertype"] == "2"){ + $ns -> tablerender(CONTENT_LAN_24, $crumb); + return ""; + }else{ + return $crumb; + } + }else{ + return ""; + } + } + + + + function countCatItems($id){ + global $sqlcountitemsincat, $plugintable, $datequery; + //$id : category content_id + + if(!is_object($sqlcountitemsincat)){ $sqlcountitemsincat = new db; } + $n = $sqlcountitemsincat -> db_Count($plugintable, "(*)", "WHERE content_class REGEXP '".e_CLASS_REGEXP."' AND content_parent='".intval($id)."' AND content_refer != 'sa' ".$datequery." "); + + return $n; + } + + + function getCategoryHeading($id){ + global $plugintable, $sql; + $qry = " + SELECT c.*, p.* + FROM pcontent as c + LEFT JOIN pcontent as p ON p.content_id = c.content_parent + WHERE c.content_id = '".intval($id)."' "; + $sql -> db_Select_gen($qry); + $row2 = $sql -> db_Fetch(); + return $row2['content_heading']; + } + function getPageHeading($id){ + global $plugintable, $sql; + $sql -> db_Select($plugintable, "content_heading", "content_id='".intval($id)."' "); + $row2 = $sql -> db_Fetch(); + return $row2['content_heading']; + } + function setPageTitle(){ + global $plugintable, $sql, $qs; + + //content page + if(e_PAGE == "content.php"){ + //main parent overview + if(!e_QUERY){ + $page = CONTENT_PAGETITLE_LAN_0; + }else{ + $sql -> db_Select($plugintable, "content_heading", "content_id = '".intval($qs[1])."' "); + $row = $sql -> db_Fetch(); + + $page = CONTENT_PAGETITLE_LAN_0; + + //recent of parent='2' + if($qs[0] == "recent" && is_numeric($qs[1]) && !isset($qs[2])){ + $page .= " / ".$row['content_heading']." / ".CONTENT_PAGETITLE_LAN_2; + + //item + }elseif($qs[0] == "content" && isset($qs[1]) && is_numeric($qs[1]) ){ + $page .= " / ".$this -> getCategoryHeading($qs[1])." / ".$this -> getPageHeading($qs[1]); + + //all categories of parent='2' + }elseif($qs[0] == "cat" && $qs[1] == "list" && is_numeric($qs[2])){ + $page .= " / ".$this -> getPageHeading($qs[2])." / ".CONTENT_PAGETITLE_LAN_13; + + //category of parent='2' and content_id='5' + }elseif($qs[0] == "cat" && is_numeric($qs[1]) && (!isset($qs[2]) || isset($qs[2]) && $qs[2]=='view') ){ + $page .= " / ".CONTENT_PAGETITLE_LAN_3." / ".$row['content_heading']; + + //top rated of parent='2' + }elseif($qs[0] == "top" && is_numeric($qs[1]) && !isset($qs[2])){ + $page .= " / ".$this -> getPageHeading($qs[1])." / ".CONTENT_PAGETITLE_LAN_4; + + //top score of parent='2' + }elseif($qs[0] == "score" && is_numeric($qs[1]) && !isset($qs[2])){ + $page .= " / ".$this -> getPageHeading($qs[1])." / ".CONTENT_PAGETITLE_LAN_15; + + //authorlist of parent='2' + }elseif($qs[0] == "author" && $qs[1] == "list" && is_numeric($qs[2])){ + $page .= " / ".$this -> getPageHeading($qs[2])." / ".CONTENT_PAGETITLE_LAN_14; + + //authorlist of parent='2' and content_id='5' + }elseif($qs[0] == "author" && is_numeric($qs[1]) && !isset($qs[2])){ + $sql -> db_Select($plugintable, "content_author", "content_id='".intval($qs[1])."' "); + $row2 = $sql -> db_Fetch(); + $authordetails = $this -> getAuthor($row2['content_author']); + $page .= " / ".CONTENT_PAGETITLE_LAN_5." / ".$authordetails[1]; + + //archive of parent='2' + }elseif($qs[0] == "list" && is_numeric($qs[1]) && !isset($qs[2])){ + $page .= " / ".CONTENT_PAGETITLE_LAN_6; + } + } + + }elseif(e_PAGE == "content_submit.php"){ + //submit page : view categories + if(!e_QUERY){ + $page = CONTENT_PAGETITLE_LAN_0." / ".CONTENT_PAGETITLE_LAN_7; + }else{ + $page = CONTENT_PAGETITLE_LAN_0; + + //submit page : submit item + if($qs[0] == "content" && $qs[1] == "submit" && is_numeric($qs[2]) ){ + $page = " / ".CONTENT_PAGETITLE_LAN_8; + } + } + + }elseif(e_PAGE == "content_manager.php"){ + //manager page : view categories + if(!e_QUERY){ + $page = CONTENT_PAGETITLE_LAN_0." / ".CONTENT_PAGETITLE_LAN_9; + }else{ + $page = CONTENT_PAGETITLE_LAN_0." / ".CONTENT_PAGETITLE_LAN_9; + + //manager page : view items + if($qs[0] == "content" && is_numeric($qs[1]) ){ + $page .= " / ".CONTENT_PAGETITLE_LAN_10; + + //manager page : edit item + }elseif($qs[0] == "content" && $qs[1] == "edit" && is_numeric($qs[2]) ){ + $page .= " / ".CONTENT_PAGETITLE_LAN_11; + + //manager page : create new item + }elseif($qs[0] == "content" && $qs[1] == "create" && is_numeric($qs[2]) ){ + $page .= " / ".CONTENT_PAGETITLE_LAN_12; + } + } + } + define("e_PAGETITLE", $page); + + } + + + + function getAuthor($content_author) { + global $sql, $plugintable, $datequery; + + if(is_numeric($content_author)){ + if(!$sql -> db_Select("user", "user_id, user_name, user_email", "user_id=$content_author")){ + $author_id = "0"; + $author_name = ""; + $author_email = ""; + }else{ + list($author_id, $author_name, $author_email) = $sql -> db_Fetch(); + } + $getauthor = array($author_id, $author_name, $author_email, $content_author); + }else{ + $tmp = explode("^", $content_author); + if(isset($tmp[0]) && is_numeric($tmp[0]) ){ + $author_id = $tmp[0]; + $author_name = (isset($tmp[1]) ? $tmp[1] : ""); + $author_email = (isset($tmp[2]) ? $tmp[2] : ""); + }else{ + $author_id = "0"; + $author_name = $tmp[0]; + $author_email = (isset($tmp[1]) ? $tmp[1] : ""); + } + $getauthor = array($author_id, $author_name, $author_email, $content_author); + } + return $getauthor; + } + + + + function getMainParent($id){ + global $sql, $plugintable; + + $category_total = $sql -> db_Select($plugintable, "content_id, content_parent", "content_id='".intval($id)."' "); + $row = $sql -> db_Fetch(); + if($row['content_parent'] == 0){ + $mainparent = $row['content_id']; + }else{ + if(strpos($row['content_parent'], ".")){ + $newid = substr($row['content_parent'],2); + }else{ + $newid = $row['content_parent']; + } + $mainparent = $this -> getMainParent( $newid ); + } + return ($mainparent ? $mainparent : "0"); + } + + + + //admin + function ShowOptionCat($currentparent=""){ + global $qs, $sql, $rs, $plugintable, $tp, $content_pref, $stylespacer; + $string = ""; + + if($currentparent == "submit"){ + $mainparent = $this -> getMainParent( intval($qs[2]) ); + $catarray = $this -> getCategoryTree("", intval($mainparent), FALSE); + }else{ + $catarray = $this -> getCategoryTree("", "", FALSE); + } + $array = array_keys($catarray); + + foreach($array as $catid){ + $category_total = $sql -> db_Select($plugintable, "content_id, content_heading, content_parent", "content_id='".intval($catid)."' "); + $row = $sql -> db_Fetch(); + + $pre = ""; + if($row['content_parent'] == "0"){ //main parent level + }else{ //sub level + for($b=0;$b<(count($catarray[$catid])/2)-1;$b++){ + $pre .= "  "; + } + } + $emptystring = "----------------"; + + if($qs[0] == "cat"){ + + $js = ""; + $catstring = ""; + $name = $pre.$row['content_heading']; + $selectjs = "if(this.options[this.selectedIndex].value != 'none'){ return document.location=this.options[this.selectedIndex].value; }"; + $label = $catid; + if($row['content_parent'] == 0){ + $name = $row['content_heading']; + $js = "style='font-weight:bold;'"; + } + if($qs[1] == "create"){ + $checkid = (isset($qs[2]) && is_numeric($qs[2]) ? $qs[2] : ""); + $value = e_SELF."?cat.create.".$catid; + $sel = ($catid == $checkid ? "1" : "0"); + }elseif($qs[1] == "edit"){ + $checkid = ($currentparent ? $currentparent : ""); + $value = e_SELF."?cat.edit.".$qs[2].".".$catid; + $sel = ($catid == $checkid ? "1" : "0"); + } + + //manage items + }elseif($qs[0] == "" || $qs[0] == "content"){ + + $catstring = ""; + $js = ""; + $label = $catid; + $selectjs = "if(this.options[this.selectedIndex].value != 'none'){ return document.location=this.options[this.selectedIndex].value; }"; + $name = $pre.$row['content_heading']; + if($row['content_parent'] == 0){ + $name = $row['content_heading']; + $js = "style='font-weight:bold;'"; + } + if($qs[1] == "create" || $qs[1] == "submit"){ + $checkid = (isset($qs[2]) && is_numeric($qs[2]) ? $qs[2] : ""); + $value = e_SELF."?content.".$qs[1].".".$catid; + $sel = ($catid == $checkid ? "1" : "0"); + }else{ + $checkid = ($currentparent ? $currentparent : ""); + $sel = ($catid == $checkid ? "1" : "0"); + if($qs[1] == "" || is_numeric($qs[1])){ + $value = e_SELF."?content.".$catid; + }else{ + $value = e_SELF."?content.".$qs[1].".".$qs[2].".".$catid; + } + } + } + $string .= $rs -> form_option($name, $sel, $value, ($label ? "label='".$label."'" : "label='none'")." ".$js ).$catstring; + } + $selectjs = " onchange=\" document.getElementById('parent').value=this.options[this.selectedIndex].label; ".$selectjs." \""; + $text = $rs -> form_select_open("parent1", $selectjs); + + if(!isset($qs[0])){ + $text .= $rs -> form_option(CONTENT_ADMIN_MAIN_LAN_28, "0", "none", "label='none'"); + }elseif( $qs[0] == "content" && $qs[1] == "edit" && is_numeric($qs[2]) ){ + $text .= $rs -> form_option(CONTENT_ADMIN_MAIN_LAN_28, "0", "none", "label='none'"); + }elseif( $qs[0] == "content" && ($qs[1] == "create" || $qs[1] == "submit") ){ + $text .= $rs -> form_option(CONTENT_ADMIN_MAIN_LAN_28, "0", "none", "label='none'"); + }elseif( $qs[0] == "content" && is_numeric($qs[1]) ){ + $text .= $rs -> form_option(CONTENT_ADMIN_MAIN_LAN_28, "0", "none", "label='none'"); + }elseif($qs[0] == "cat" && $qs[1] == "create"){ + $text .= $rs -> form_option(CONTENT_ADMIN_MAIN_LAN_29."  ", (isset($qs[2]) ? "0" : "1"), e_SELF."?cat.create", "label='0' style='font-weight:bold;'"); + }else{ + $text .= $rs -> form_option(CONTENT_ADMIN_MAIN_LAN_29."  ", (isset($qs[2]) ? "0" : "1"), e_SELF."?cat.edit.".$qs[2].".0", "label='0' style='font-weight:bold;'"); + } + $text .= $string; + $text .= $rs -> form_select_close(); + + return $text; + } + + + + function getOrder(){ + global $qs, $content_pref; + + if(isset($qs[0]) && substr($qs[0],0,5) == "order"){ + $orderstring = $qs[0]; + }elseif(isset($qs[1]) && substr($qs[1],0,5) == "order"){ + $orderstring = $qs[1]; + }elseif(isset($qs[2]) && substr($qs[2],0,5) == "order"){ + $orderstring = $qs[2]; + }elseif(isset($qs[3]) && substr($qs[3],0,5) == "order"){ + $orderstring = $qs[3]; + }else{ + $orderstring = ($content_pref["content_defaultorder"] ? $content_pref["content_defaultorder"] : "orderddate" ); + } + + if(substr($orderstring,6) == "heading"){ + $orderby = "content_heading"; + $orderby2 = ""; + }elseif(substr($orderstring,6) == "date"){ + $orderby = "content_datestamp"; + $orderby2 = ", content_heading ASC"; + }elseif(substr($orderstring,6) == "parent"){ + $orderby = "content_parent"; + $orderby2 = ", content_heading ASC"; + }elseif(substr($orderstring,6) == "refer"){ + $orderby = "content_refer"; + $orderby2 = ", content_heading ASC"; + }elseif(substr($orderstring,6) == "author"){ + + }elseif(substr($orderstring,6) == "order"){ + if($qs[0] == "cat"){ + $orderby = "SUBSTRING_INDEX(content_order, '.', 1)+0"; + }elseif($qs[0] != "cat"){ + $orderby = "SUBSTRING_INDEX(content_order, '.', -1)+0"; + } + $orderby2 = ", content_heading ASC"; + }else{ + $orderstring = "orderddate"; + $orderby = "content_datestamp"; + $orderby2 = ", content_heading ASC"; + } + $order = " ORDER BY ".$orderby." ".(substr($orderstring,5,1) == "a" ? "ASC" : "DESC")." ".$orderby2." "; + return $order; + } + + + + function getIcon($mode, $icon, $path="", $linkid="", $width="", $blank=""){ + global $content_cat_icon_path_small, $content_cat_icon_path_large, $content_icon_path, $content_pref; + + $blank = (!$blank ? "0" : $blank); + $border = "border:0;"; + $hrefpre = ($linkid ? "" : ""); + $hrefpost = ($linkid ? "" : ""); + + if($mode == "item"){ + $path = (!$path ? $content_icon_path : $path); + $width = ($width ? "width:".$width."px;" : ""); + //$border = "border:1px solid #000;"; + $border = ''; + $icon = ($icon ? $path.$icon : ($blank ? $content_icon_path."blank.gif" : "")); + + }elseif($mode == "catsmall"){ + $path = (!$path ? $content_cat_icon_path_small : $path); + $icon = ($icon ? $path.$icon : ""); + + }elseif($mode == "catlarge"){ + $path = (!$path ? $content_cat_icon_path_large : $path); + $icon = ($icon ? $path.$icon : ""); + }else{ + $path = (!$path ? $content_icon_path : $path); + $hrefpre = ""; + $hrefpost = ""; + $width = ""; + $icon = ($icon ? $path.$icon : ($blank ? $content_icon_path."blank.gif" : "")); + } + + if($icon && file_exists($icon)){ + $iconstring = $hrefpre."".$hrefpost; + }else{ + $iconstring = ""; + if($blank){ + if(file_exists($content_icon_path."blank.gif")){ + if($mode == "catsmall"){ + $width = ($width ? "width:".$width."px;" : "width:16px;"); + }elseif($mode == "catlarge"){ + $width = ($width ? "width:".$width."px;" : "width:48px;"); + } + $iconstring = $hrefpre."".$hrefpost; + } + } + } + return $iconstring; + } + + function prepareAuthor($mode, $author, $id){ + global $aa, $content_pref; + if($mode == ''){return;} + + $authorinfo = ""; + if( (isset($content_pref["content_{$mode}_authorname"]) && $content_pref["content_{$mode}_authorname"]) || (isset($content_pref["content_{$mode}_authoremail"]) && $content_pref["content_{$mode}_authoremail"]) || (isset($content_pref["content_{$mode}_authoricon"]) && $content_pref["content_{$mode}_authoricon"]) || (isset($content_pref["content_{$mode}_authorprofile"]) && $content_pref["content_{$mode}_authorprofile"]) ){ + $authordetails = $this -> getAuthor($author); + if(isset($content_pref["content_{$mode}_authorname"]) && $content_pref["content_{$mode}_authorname"]){ + if(isset($content_pref["content_{$mode}_authoremail"]) && $authordetails[2]){ + if($authordetails[0] == "0"){ + if(isset($content_pref["content_{$mode}_authoremail_nonmember"]) && $content_pref["content_{$mode}_authoremail_nonmember"] && strpos($authordetails[2], "@") ){ + //$authorinfo = "".$authordetails[1].""; + + $authorinfo = preg_replace("#([a-z0-9\-_.]+?)@([\w\-]+\.([\w\-\.]+\.)*[\w]+)#i", "".$authordetails[1]."", $authordetails[2]); + }else{ + $authorinfo = $authordetails[1]; + } + }else{ + //$authorinfo = "".$authordetails[1].""; + + $authorinfo = preg_replace("#([a-z0-9\-_.]+?)@([\w\-]+\.([\w\-\.]+\.)*[\w]+)#i", "".$authordetails[1]."", $authordetails[2]); + } + }else{ + $authorinfo = $authordetails[1]; + } + if(USER && is_numeric($authordetails[0]) && $authordetails[0] != "0" && isset($content_pref["content_{$mode}_authorprofile"]) && $content_pref["content_{$mode}_authorprofile"]){ + $authorinfo .= " ".CONTENT_ICON_USER.""; + } + } + if(isset($content_pref["content_{$mode}_authoricon"]) && $content_pref["content_{$mode}_authoricon"]){ + $authorinfo .= " ".CONTENT_ICON_AUTHORLIST.""; + } + } + return $authorinfo; + } + + + //admin + function popupHelp($text, $image="", $width="320", $title=""){ + //$image : full path to the image you want to show on screen (uses a default doc image) + //$width : the width of the popup (uses a default width of 500) + //$title : the window title of the popup (uses a default title of ...) + //$text : the help text to show into the popup + + if(!$image || !file_exists($image)){ + $image = e_IMAGE."admin_images/docs_16.png"; + } + if(!$width){ $width = "320"; } + if(!$title){ $title = "content management help area"; } + + $popup = ""; + + return $popup; + } + + + + //search by keyword + function showOptionsSearch($mode, $searchtypeid=""){ + global $plugindir, $plugintable, $qs, $rs; + + if(!is_object($rs)){ + require_once(e_HANDLER."form_handler.php"); + $rs = new form; + } + if(!isset($searchtypeid)){ + $searchtypeid = (is_numeric($qs[1]) ? $qs[1] : $qs[2]); + } + + if($mode == "menu"){ + $CONTENT_SEARCH_TABLE_KEYWORD = $rs -> form_open("post", $plugindir."content.php?recent.$searchtypeid", "contentsearchmenu_{$mode}", "", "enctype='multipart/form-data'")."
    ".$rs -> form_close(); + }else{ + $searchfieldname = "searchfield_{$mode}"; + $CONTENT_SEARCH_TABLE_KEYWORD = $rs -> form_open("post", $plugindir."content.php?recent.$searchtypeid", "contentsearch_{$mode}", "", "enctype='multipart/form-data'")."
    + +
    + ".$rs -> form_close(); + } + return $CONTENT_SEARCH_TABLE_KEYWORD; + } + + + + //redirection links in dropdown + function showOptionsSelect($mode, $searchtypeid=""){ + global $plugindir, $plugintable, $rs, $qs, $content_pref; + + if(!is_object($rs)){ + require_once(e_HANDLER."form_handler.php"); + $rs = new form; + } + if(!isset($searchtypeid)){ + $searchtypeid = (is_numeric($qs[1]) ? $qs[1] : $qs[2]); + } + $catarray = ""; + $mainparent = $this -> getMainParent( $searchtypeid ); + $content_pref = $this -> getContentPref($mainparent); + $parent = $this -> getCategoryTree("", $mainparent, TRUE); + $parent = array_merge_recursive($parent); + for($a=0;$a form_option($emptystring, "0", "none"); + } + foreach($newparent as $key => $value){ + $n = ""; + if($mode == "page" || ($mode == "menu" && isset($content_pref["content_menu_cat_number"])) ){ + $n = $this -> countCatItems($key); + $n = " (".$n." ".($n == "1" ? CONTENT_LAN_53 : CONTENT_LAN_54).")"; + } + if( ($content_pref["content_menu_cat_main"] && $key == $mainparent) || $key != $mainparent ){ + $value = (strlen($value) > 25 ? substr($value,0,25)."..." : $value); + $catarray .= $rs -> form_option($value.$n, 0, $plugindir."content.php?cat.".$key); + } + } + + if($mode == "page" || ($mode == "menu" && ($content_pref["content_menu_links"] && $content_pref["content_menu_links_dropdown"]) || ($content_pref["content_menu_cat"] && $content_pref["content_menu_cat_dropdown"]) ) ){ + if($mode == "menu"){ $style = "style='width:100%;' "; }else{ $style = ""; } + $CONTENT_SEARCH_TABLE_SELECT = " + ".$rs -> form_open("post", $plugindir."content.php".(e_QUERY ? "?".e_QUERY : ""), "contentredirect".$mode, "", "enctype='multipart/form-data'")." +
    "; + $text .= $rs -> form_option(CONTENT_ORDER_LAN_0, 1, "none"); + + if($qs[0] == "author" && $qs[1] == "list"){ + $text .= $rs -> form_option(CONTENT_ORDER_LAN_11, ($check == "orderaauthor" ? "1" : "0"), $baseurl."?".$qry.".orderaauthor" ); + $text .= $rs -> form_option(CONTENT_ORDER_LAN_12, ($check == "orderdauthor" ? "1" : "0"), $baseurl."?".$qry.".orderdauthor" ); + }else{ + $text .= $rs -> form_option(CONTENT_ORDER_LAN_1, ($check == "orderaheading" ? "1" : "0"), $baseurl."?".$qry.".orderaheading" ); + $text .= $rs -> form_option(CONTENT_ORDER_LAN_2, ($check == "orderdheading" ? "1" : "0"), $baseurl."?".$qry.".orderdheading" ); + $text .= $rs -> form_option(CONTENT_ORDER_LAN_3, ($check == "orderadate" ? "1" : "0"), $baseurl."?".$qry.".orderadate" ); + $text .= $rs -> form_option(CONTENT_ORDER_LAN_4, ($check == "orderddate" ? "1" : "0"), $baseurl."?".$qry.".orderddate" ); + $text .= $rs -> form_option(CONTENT_ORDER_LAN_5, ($check == "orderarefer" ? "1" : "0"), $baseurl."?".$qry.".orderarefer" ); + $text .= $rs -> form_option(CONTENT_ORDER_LAN_6, ($check == "orderdrefer" ? "1" : "0"), $baseurl."?".$qry.".orderdrefer" ); + $text .= $rs -> form_option(CONTENT_ORDER_LAN_7, ($check == "orderaparent" ? "1" : "0"), $baseurl."?".$qry.".orderaparent" ); + $text .= $rs -> form_option(CONTENT_ORDER_LAN_8, ($check == "orderdparent" ? "1" : "0"), $baseurl."?".$qry.".orderdparent" ); + $text .= $rs -> form_option(CONTENT_ORDER_LAN_9, ($check == "orderaorder" ? "1" : "0"), $baseurl."?".$qry.".orderaorder" ); + $text .= $rs -> form_option(CONTENT_ORDER_LAN_10, ($check == "orderdorder" ? "1" : "0"), $baseurl."?".$qry.".orderdorder" ); + } + $text .= $rs -> form_select_close(); + $text .= "
    "; + $text .= $rs -> form_close(); + } + } + return $text; + } + + + + function CreateParentMenu($parentid){ + global $plugintable, $plugindir, $tp, $datequery; + + if(!is_object($sqlcreatemenu)){ $sqlcreatemenu = new db; } + if(!$sqlcreatemenu -> db_Select($plugintable, "*", "content_id='".intval($parentid)."' ")){ + return FALSE; + }else{ + $row = $sqlcreatemenu -> db_Fetch(); + } + + $content_path_menu = $plugindir."menus/"; + if(!is_writable($content_path_menu)){ + echo "".CONTENT_ADMIN_ITEM_LAN_22." ".$content_path_menu." ".CONTENT_ADMIN_ITEM_LAN_23."
    "; + return FALSE; + } + + $menufile = "content_".$row['content_heading']; + $menuname = $row['content_heading']; + + $data = chr(60)."?php\n". chr(47)."*\n+---------------------------------------------------------------+\n| e107 website system\n| ".e_PLUGIN."content/menus/".$menufile."_menu.php\n|\n| Steve Dunstan 2001-2002\n| http://e107.org\n| jalist@e107.org\n|\n| Released under the terms and conditions of the\n| GNU General Public License (http://gnu.org).\n+---------------------------------------------------------------+\n\nThis file has been generated by ".e_PLUGIN."content/handlers/content_class.php.\n\n*". chr(47)."\n\n"; + $data .= "\n"; + $data .= "unset(\$text);\n"; + $data .= "\$text = \"\";\n"; + $data .= "\$menutypeid = \"$parentid\";\n"; + $data .= "\$menuname = \"$menuname\";\n"; + $data .= "\n"; + $data .= "\$plugindir = e_PLUGIN.'content/';\n"; + $data .= "\$plugintable = \"pcontent\"; //name of the table used in this plugin (never remove this, as it's being used throughout the plugin !!)\n"; + $data .= "\$datequery = \" AND content_datestamp < \".time().\" AND (content_enddate=0 || content_enddate>\".time().\") \";\n"; + $data .= "\n"; + $data .= "require_once(e_PLUGIN.'content/handlers/content_class.php');\n"; + $data .= "\$aa = new content;\n"; + $data .= "require_once(e_HANDLER.'form_handler.php');\n"; + $data .= "\$rs = new form;\n"; + $data .= "\$gen = new convert;\n"; + $data .= "global \$tp;\n"; + $data .= "\n"; + $data .= "\$lan_file = e_PLUGIN.'content/languages/'.e_LANGUAGE.'/lan_content.php';\n"; + $data .= "include_once(file_exists(\$lan_file) ? \$lan_file : e_PLUGIN.'content/languages/English/lan_content.php');\n"; + $data .= "\n"; + $data .= "\$bullet = (defined('BULLET') ? \"\" : \"bullet\");\n"; + $data .= "\n"; + $data .= "\$content_pref = \$aa -> getContentPref(\$menutypeid);\n"; + $data .= "\$content_icon_path = \$tp -> replaceConstants(\$content_pref[\"content_icon_path\"]);\n"; + $data .= "\$content_cat_icon_path_small = \$tp -> replaceConstants(\$content_pref[\"content_cat_icon_path_small\"]);\n"; + $data .= "\n"; + $data .= " \$break = FALSE;\n"; + $data .= "//##### SEARCH SELECT ORDER --------------------------------------------------\n"; + $data .= "//show search box\n"; + $data .= "if(\$content_pref[\"content_menu_search\"]){\n"; + $data .= " \$text .= \$aa -> showOptionsSearch(\"menu\", \$menutypeid);\n"; + $data .= " \$break = TRUE;\n"; + $data .= "}\n"; + $data .= "//show select box (with either links to other content pages, to categories, to both, or don't show at all)\n"; + $data .= "if( (\$content_pref[\"content_menu_links\"] && \$content_pref[\"content_menu_links_dropdown\"]) || (\$content_pref[\"content_menu_cat\"] && \$content_pref[\"content_menu_cat_dropdown\"]) ){\n"; + $data .= " \$text .= \$aa -> showOptionsSelect(\"menu\", \$menutypeid);\n"; + $data .= " \$break = TRUE;\n"; + $data .= "}\n"; + $data .= "//show order box\n"; + $data .= "if(\$content_pref[\"content_menu_sort\"]){\n"; + $data .= " \$text .= \$aa -> showOptionsOrder(\"menu\", \$menutypeid);\n"; + $data .= " \$break = TRUE;\n"; + $data .= "}\n"; + $data .= "\n"; + $data .= "//show links list if chosen so\n"; + $data .= "if(\$content_pref[\"content_menu_links\"] && !\$content_pref[\"content_menu_links_dropdown\"]){\n"; + $data .= " if(\$break === TRUE){\n"; + $data .= " \$text .= \"
    \";\n"; + $data .= " }\n"; + $data .= " \$text .= (\$content_pref[\"content_menu_links_caption\"] != \"\" ? \$content_pref[\"content_menu_links_caption\"] : CONTENT_MENU_LAN_4).\"
    \";\n"; + $data .= "\n"; + $data .= " //define icon\n"; + $data .= " if(\$content_pref[\"content_menu_links_icon\"] == \"0\"){ \$linksicon = \"\";\n"; + $data .= " }elseif(\$content_pref[\"content_menu_links_icon\"] == \"1\"){ \$linksicon = \$bullet;\n"; + $data .= " }elseif(\$content_pref[\"content_menu_links_icon\"] == \"2\"){ \$linksicon = \"·\";\n"; + $data .= " }elseif(\$content_pref[\"content_menu_links_icon\"] == \"3\"){ \$linksicon = \"º\";\n"; + $data .= " }elseif(\$content_pref[\"content_menu_links_icon\"] == \"4\"){ \$linksicon = \"»\";\n"; + $data .= " }\n"; + $data .= "\n"; + $data .= " if(\$content_pref[\"content_menu_viewallcat\"]){\n"; + $data .= " \$text .= \$linksicon.\" \".CONTENT_LAN_6.\"
    \";\n"; + $data .= " }\n"; + $data .= " if(\$content_pref[\"content_menu_viewallauthor\"]){\n"; + $data .= " \$text .= \$linksicon.\" \".CONTENT_LAN_7.\"
    \";\n"; + $data .= " }\n"; + $data .= " if(\$content_pref[\"content_menu_viewallitems\"]){\n"; + $data .= " \$text .= \$linksicon.\" \".CONTENT_LAN_83.\"
    \";\n"; + $data .= " }\n"; + $data .= " if(\$content_pref[\"content_menu_viewtoprated\"]){\n"; + $data .= " \$text .= \$linksicon.\" \".CONTENT_LAN_8.\"
    \";\n"; + $data .= " }\n"; + $data .= " if(\$content_pref[\"content_menu_viewtopscore\"]){\n"; + $data .= " \$text .= \$linksicon.\" \".CONTENT_LAN_12.\"
    \";\n"; + $data .= " }\n"; + $data .= " if(\$content_pref[\"content_menu_viewrecent\"]){\n"; + $data .= " \$text .= \$linksicon.\" \".CONTENT_LAN_61.\"
    \";\n"; + $data .= " }\n"; + $data .= " if( \$content_pref[\"content_menu_viewsubmit\"] && \$content_pref[\"content_submit\"] && check_class(\$content_pref[\"content_submit_class\"]) ){\n"; + $data .= " \$text .= \$linksicon.\" \".CONTENT_LAN_75.\"
    \";\n"; + $data .= " }\n"; + $data .= " \$text .= \"
    \";\n"; + $data .= "}\n"; + $data .= "\n"; + $data .= "//get category array\n"; + $data .= "\$array = \$aa -> getCategoryTree(\"\", intval(\$menutypeid), TRUE);\n"; + $data .= "\n"; + $data .= "//##### CATEGORY LIST --------------------------------------------------\n"; + $data .= "if(!\$content_pref[\"content_menu_cat_dropdown\"]){\n"; + $data .= " if(\$content_pref[\"content_menu_cat\"]){\n"; + $data .= " \$text .= (\$content_pref[\"content_menu_cat_caption\"] != \"\" ? \$content_pref[\"content_menu_cat_caption\"] : CONTENT_MENU_LAN_3).\"
    \";\n"; + $data .= "\n"; + $data .= " \$newparent = \"\";\n"; + $data .= " \$checkid = \"\";\n"; + $data .= " \$newarray = array_merge_recursive(\$array);\n"; + $data .= " for(\$a=0;\$a\";\n"; + $data .= " }else{\n"; + $data .= " //default category icon\n"; + $data .= " if(\$content_pref[\"content_menu_cat_icon_default\"] == \"0\"){ \$ICON = \"\";\n"; + $data .= " }elseif(\$content_pref[\"content_menu_cat_icon_default\"] == \"1\"){ \$ICON = \$bullet;\n"; + $data .= " }elseif(\$content_pref[\"content_menu_cat_icon_default\"] == \"2\"){ \$ICON = \"·\";\n"; + $data .= " }elseif(\$content_pref[\"content_menu_cat_icon_default\"] == \"3\"){ \$ICON = \"º\";\n"; + $data .= " }elseif(\$content_pref[\"content_menu_cat_icon_default\"] == \"4\"){ \$ICON = \"»\";\n"; + $data .= " }\n"; + $data .= " }\n"; + $data .= " }\n"; + $data .= " //display category list\n"; + $data .= " \$text .= \"\";\n"; + $data .= " \$text .= \"\";\n"; + $data .= " \$text .= (\$ICON ? \"\" : \"\");\n"; + $data .= " \$text .= \"\";\n"; + $data .= " \$text .= \"\";\n"; + $data .= " \$text .= \"
    \".\$ICON.\"\";\n"; + $data .= " \$text .= \"\".\$row['content_heading'].\"\";\n"; + $data .= " \$text .= (\$content_pref[\"content_menu_cat_number\"] ? \" (\".\$aa -> countCatItems(\$row['content_id']).\")\" : \"\");\n"; + $data .= " \$text .= \"
    \";\n"; + $data .= " }\n"; + $data .= " }\n"; + $data .= " }\n"; + $data .= "}\n"; + $data .= "\n"; + $data .= "//##### RECENT --------------------------------------------------\n"; + $data .= "if(\$content_pref[\"content_menu_recent\"]){\n"; + $data .= " \$text .= \"
    \";\n"; + $data .= "\n"; + $data .= " //prepare query paramaters\n"; + $data .= " \$validparent = implode(\",\", array_keys(\$array));\n"; + $data .= " \$qry = \" content_parent REGEXP '\".\$aa -> CONTENTREGEXP(\$validparent).\"' \";\n"; + $data .= "\n"; + $data .= " \$sql1 = new db;\n"; + $data .= " \$contenttotal = \$sql1 -> db_Count(\$plugintable, \"(*)\", \"WHERE content_refer != 'sa' AND \".\$qry.\" \".\$datequery.\" AND content_class REGEXP '\".e_CLASS_REGEXP.\"' \" );\n"; + $data .= "\n"; + $data .= " if(\$resultitem = \$sql1 -> db_Select(\$plugintable, \"*\", \"content_refer !='sa' AND \".\$qry.\" \".\$datequery.\" AND content_class REGEXP '\".e_CLASS_REGEXP.\"' ORDER BY content_datestamp DESC LIMIT 0,\".\$content_pref[\"content_menu_recent_number\"] )){\n"; + $data .= "\n"; + $data .= " \$text .= (\$content_pref[\"content_menu_recent_caption\"] != \"\" ? \$content_pref[\"content_menu_recent_caption\"] : CONTENT_MENU_LAN_2).\"
    \";\n"; + $data .= " while(\$row = \$sql1 -> db_Fetch()){\n"; + $data .= "\n"; + $data .= " \$ICON = \"\";\n"; + $data .= " \$DATE = \"\";\n"; + $data .= " \$AUTHOR = \"\";\n"; + $data .= " \$SUBHEADING = \"\";\n"; + $data .= "\n"; + $data .= " if(\$content_pref[\"content_menu_recent_date\"]){\n"; + $data .= " \$datestyle = (\$content_pref[\"content_archive_datestyle\"] ? \$content_pref[\"content_archive_datestyle\"] : \"%d %b %Y\");\n"; + $data .= " \$DATE = strftime(\$datestyle, \$row['content_datestamp']);\n"; + $data .= " }\n"; + $data .= " if(\$content_pref[\"content_menu_recent_author\"]){\n"; + $data .= " \$authordetails = \$aa -> getAuthor(\$row['content_author']);\n"; + $data .= " \$AUTHOR = \$authordetails[1];\n"; + $data .= " }\n"; + $data .= "\n"; + $data .= " //subheading\n"; + $data .= " if(\$content_pref[\"content_menu_recent_subheading\"] && \$row['content_subheading']){\n"; + $data .= " if(\$content_pref[\"content_menu_recent_subheading_char\"] && \$content_pref[\"content_menu_recent_subheading_char\"] != \"\" && \$content_pref[\"content_menu_recent_subheading_char\"] != \"0\"){\n"; + $data .= " if(strlen(\$row['content_subheading']) > \$content_pref[\"content_menu_recent_subheading_char\"]) {\n"; + $data .= " \$row['content_subheading'] = substr(\$row['content_subheading'], 0, \$content_pref[\"content_menu_recent_subheading_char\"]).\$content_pref[\"content_menu_recent_subheading_post\"];\n"; + $data .= " }\n"; + $data .= " }\n"; + $data .= " \$SUBHEADING = \$row['content_subheading'];\n"; + $data .= " }\n"; + $data .= "\n"; + $data .= " //define icon\n"; + $data .= " \$recenticonwidth = \"\";\n"; + $data .= " if(\$content_pref[\"content_menu_recent_icon\"] == \"0\"){ \$ICON = \"\";\n"; + $data .= " }elseif(\$content_pref[\"content_menu_recent_icon\"] == \"1\"){ \$ICON = \$bullet;\n"; + $data .= " }elseif(\$content_pref[\"content_menu_recent_icon\"] == \"2\"){ \$ICON = \"·\";\n"; + $data .= " }elseif(\$content_pref[\"content_menu_recent_icon\"] == \"3\"){ \$ICON = \"º\";\n"; + $data .= " }elseif(\$content_pref[\"content_menu_recent_icon\"] == \"4\"){ \$ICON = \"»\";\n"; + $data .= " }elseif(\$content_pref[\"content_menu_recent_icon\"] == \"5\"){\n"; + $data .= " if(\$content_pref[\"content_menu_recent_icon\"] == \"5\"){\n"; + $data .= " if(\$content_pref[\"content_menu_recent_icon_width\"]){\n"; + $data .= " \$recenticonwidth = \" width:\".\$content_pref[\"content_menu_recent_icon_width\"].\"px; \";\n"; + $data .= " }else{\n"; + $data .= " \$recenticonwidth = \" width:50px; \";\n"; + $data .= " }\n"; + $data .= " }\n"; + $data .= " if(\$content_pref[\"content_menu_recent_icon\"] == \"5\" && \$row['content_icon'] != \"\" && file_exists(\$content_icon_path.\$row['content_icon'])){\n"; + $data .= " \$ICON = \"\";\n"; + $data .= " }\n"; + $data .= " }\n"; + $data .= "\n"; + $data .= " //display recent list\n"; + $data .= " \$text .= \"\";\n"; + $data .= " \$text .= \"\";\n"; + $data .= " \$text .= (\$ICON ? \"\" : \"\");\n"; + $data .= " \$text .= \"\";\n"; + $data .= " \$text .= \"\";\n"; + $data .= " \$text .= \"
    \".\$ICON.\"\";\n"; + $data .= " \$text .= \"\".\$row['content_heading'].\"
    \";\n"; + $data .= " \$text .= (\$DATE ? \$DATE.\"
    \" : \"\" );\n"; + $data .= " \$text .= (\$AUTHOR ? \$AUTHOR.\"
    \" : \"\" );\n"; + $data .= " \$text .= (\$SUBHEADING ? \$SUBHEADING.\"
    \" : \"\" );\n"; + $data .= " \$text .= \"
    \";\n"; + $data .= " }\n"; + $data .= " }\n"; + $data .= "}\n"; + $data .= "\n"; + $data .= "if(!isset(\$text)){ \$text = CONTENT_MENU_LAN_1; }\n"; + $data .= "\$caption = (\$content_pref[\"content_menu_caption\"] != \"\" ? \$content_pref[\"content_menu_caption\"] : CONTENT_MENU_LAN_0.\" \".\$menuname);\n"; + $data .= "\$ns -> tablerender(\$caption, \$text, '$menufile');\n"; + $data .= "\n"; + $data .= "?".chr(62); + + if(file_exists($plugindir."menus/".$menufile."_menu.php")){ + $message = ""; + }else{ + $fp = @fopen($plugindir."menus/".$menufile."_menu.php", "w"); + if (!@fwrite($fp, $data)) { + $message = CONTENT_ADMIN_CAT_LAN_51; + } else { + fclose($fp); + $message = CONTENT_ADMIN_CAT_LAN_50; + } + } + return $message; + } +} //close class + +?> \ No newline at end of file diff --git a/e107_plugins/content/handlers/content_convert_class.php b/e107_plugins/content/handlers/content_convert_class.php new file mode 100644 index 000000000..ad13dc1d3 --- /dev/null +++ b/e107_plugins/content/handlers/content_convert_class.php @@ -0,0 +1,914 @@ +".time().") "; + +$lan_file = $plugindir.'languages/'.e_LANGUAGE.'/lan_content.php'; +include_once(file_exists($lan_file) ? $lan_file : $plugindir.'languages/English/lan_content.php'); +$lan_file = $plugindir.'languages/'.e_LANGUAGE.'/lan_content_admin.php'; +include_once(file_exists($lan_file) ? $lan_file : $plugindir.'languages/English/lan_content_admin.php'); + +require_once($plugindir."handlers/content_class.php"); +$aa = new content; + +class content_convert{ + + + //update content_author + function upgrade_1_2(){ + global $sql; + + $text = ""; + $field1 = $sql->db_Field("pcontent",19); + $field2 = $sql->db_Field("pcontent",20); + $field3 = $sql->db_Field("pcontent",21); + if($field1 != "content_score" && $field2 != "content_meta" && $field3 != "content_layout"){ + mysql_query("ALTER TABLE ".MPREFIX."pcontent ADD content_score TINYINT ( 3 ) UNSIGNED NOT NULL DEFAULT '0';"); + mysql_query("ALTER TABLE ".MPREFIX."pcontent ADD content_meta TEXT NOT NULL;"); + mysql_query("ALTER TABLE ".MPREFIX."pcontent ADD content_layout VARCHAR ( 255 ) NOT NULL DEFAULT '';"); + $text = CONTENT_ADMIN_CONVERSION_LAN_64."
    "; + } + return $text; + } + + //update content_author + function upgrade_1_21(){ + global $sql; + $sql = new db; $sql1 = new db; + $upgrade = FALSE; + if($sql -> db_Select("pcontent", "content_id, content_author", "content_author != '' ")){ + while($row = $sql -> db_Fetch()){ + if(is_numeric($row['content_author'])){ + }else{ + $tmp = explode("^", $row['content_author']); + if($tmp[0] == "0"){ + $upgrade = TRUE; + $newauthor = $tmp[1].($tmp[2] ? "^".$tmp[2] : ""); + $sql1 -> db_Update("pcontent", " content_author = '".$newauthor."' WHERE content_id='".$row['content_id']."' "); + } + } + } + } + if($upgrade){ + return CONTENT_ADMIN_CONVERSION_LAN_65."
    "; + }else{ + return FALSE; + } + } + + //update preferences storage method + function upgrade_1_22(){ + global $sql, $sql2, $eArrayStorage, $tp, $aa; + + $upgrade = TRUE; + + $sqlc = new db; + $sqld = new db; + + //convert preferences for core default preferences + if($sqlc -> db_Select("core", "*", "e107_name='pcontent' ")){ + $row = $sqlc -> db_Fetch(); + + $tmp = $eArrayStorage->ReadArray($row['e107_value']); + + //replace the id value for the content_pref + $content_pref = array(); + foreach($tmp as $k=>$v){ + if(substr($k,-2) == "_0"){ + $k = str_replace("_0", "", $k); + } + if(strpos($k, "content_") === 0){ + $content_pref[$k] = $tp->toDB($v); + } + } + if(!isset($content_pref['content_admin_subheading'])){ + //add new options to the preferences + $content_pref = $this->upgrade_1_22_prefs($content_pref); + + $tmp1 = $eArrayStorage->WriteArray($content_pref); + $sqld -> db_Update("core", "e107_value = '{$tmp1}' WHERE e107_name = 'pcontent' "); + }else{ + $upgrade=FALSE; + } + } + + //convert preferences for all main parents + if($sqlc -> db_Select("pcontent", "content_id, content_heading, content_pref", "LEFT(content_parent, 1) = '0' ")){ + while($row=$sqlc->db_Fetch()){ + + $id = $row['content_id']; + $tmp = $eArrayStorage->ReadArray($row['content_pref']); + + //replace the id value for the content_pref + $l = strlen($id); + $content_pref = array(); + foreach($tmp as $k=>$v){ + if(substr($k,-($l+1)) == "_".$id){ + $k = str_replace("_".$id, "", $k); + } + if(strpos($k, "content_") === 0){ + $content_pref[$k] = $tp->toDB($v); + } + } + //add new options to the preferences + if(!isset($content_pref['content_admin_subheading'])){ + $content_pref = $this->upgrade_1_22_prefs($content_pref); + + $tmp1 = $eArrayStorage->WriteArray($content_pref); + $sqld -> db_Update("pcontent", "content_pref='{$tmp1}' WHERE content_id='$id' "); + }else{ + $upgrade=FALSE; + } + + //update menus + $plugintable = "pcontent"; + $plugindir = e_PLUGIN."content/"; + if(!is_object($aa)){ + require_once($plugindir."handlers/content_class.php"); + $aa = new content; + } + if($row['content_parent']==0){ + //remove menu + @unlink(e_PLUGIN."content/menus/content_".$row['content_heading']."_menu.php"); + //create menu + $aa -> CreateParentMenu($id); + } + } + } + + if($upgrade===TRUE){ + return CONTENT_ADMIN_CONVERSION_LAN_66."
    "; + } + } + + //add new preferences that come with this upgrade + function upgrade_1_22_prefs($content_pref){ + + //create : item page + $content_pref['content_admin_subheading'] = '1'; + $content_pref['content_admin_summary'] = '1'; + $content_pref['content_admin_startdate'] = '1'; + $content_pref['content_admin_enddate'] = '1'; + + //create : category page + $content_pref['content_admincat_subheading'] = '1'; + $content_pref['content_admincat_comment'] = '1'; + $content_pref['content_admincat_rating'] = '1'; + $content_pref['content_admincat_pe'] = '1'; + $content_pref['content_admincat_visibility'] = '1'; + $content_pref['content_admincat_startdate'] = '1'; + $content_pref['content_admincat_enddate'] = '1'; + $content_pref['content_admincat_uploadicon'] = '1'; + $content_pref['content_admincat_selecticon'] = '1'; + + //create : submit page + $content_pref['content_submit_subheading'] = '1'; + $content_pref['content_submit_summary'] = '1'; + $content_pref['content_submit_startdate'] = '1'; + $content_pref['content_submit_enddate'] = '1'; + + //content manager + $content_pref['content_manager_approve'] = '255'; + $content_pref['content_manager_personal'] = '255'; + $content_pref['content_manager_category'] = '255'; + + return $content_pref; + } + + + //update preferences storage method + function upgrade_1_23(){ + global $sql, $sql2, $eArrayStorage, $tp, $aa; + + $upgrade = TRUE; + + $sqlc = new db; + $sqld = new db; + //add new preferences in core + if($sqlc -> db_Select("core", "*", "e107_name='pcontent' ")){ + $row = $sqlc -> db_Fetch(); + + $content_pref = $eArrayStorage->ReadArray($row['e107_value']); + + //add new options to the preferences + if(!isset($content_pref['content_admin_subheading'])){ + $content_pref = $this->upgrade_1_23_prefs($content_pref); + + $tmp1 = $eArrayStorage->WriteArray($content_pref); + $sqld -> db_Update("core", "e107_value = '{$tmp1}' WHERE e107_name = 'pcontent' "); + }else{ + $upgrade=FALSE; + } + } + + //add new preferences for each main parent + if($sqlc -> db_Select("pcontent", "content_id, content_heading, content_pref", "content_parent = '0' ")){ + while($row=$sqlc->db_Fetch()){ + + $id = $row['content_id']; + $content_pref = $eArrayStorage->ReadArray($row['content_pref']); + + if(!isset($content_pref['content_admin_subheading'])){ + //add new options to the preferences + $content_pref = $this->upgrade_1_23_prefs($content_pref); + + $tmp1 = $eArrayStorage->WriteArray($content_pref); + $sqld -> db_Update("pcontent", "content_pref='{$tmp1}' WHERE content_id='$id' "); + }else{ + $upgrade=FALSE; + } + } + } + if($upgrade===TRUE){ + return CONTENT_ADMIN_CONVERSION_LAN_67."
    "; + } + } + //add new preferences that come with this upgrade + function upgrade_1_23_prefs($content_pref){ + + $content_pref['content_list_caption'] = CONTENT_LAN_23; //caption for recent list + $content_pref['content_list_caption_append_name'] = '1'; //append category heading to caption + $content_pref['content_catall_caption'] = CONTENT_LAN_25; //caption for all categories page + $content_pref['content_cat_caption'] = CONTENT_LAN_26; //caption for single category page + $content_pref['content_cat_caption_append_name'] = '1'; //append category heading to caption + $content_pref['content_cat_sub_caption'] = CONTENT_LAN_28; //caption for subcategories + $content_pref['content_cat_item_caption'] = CONTENT_LAN_31; //caption for items in category + $content_pref['content_author_index_caption'] = CONTENT_LAN_32; //caption for author index page + $content_pref['content_author_caption'] = CONTENT_LAN_32; //caption for single author page + $content_pref['content_author_caption_append_name'] = '1'; //append author name to caption + $content_pref['content_archive_caption'] = CONTENT_LAN_84; //caption for archive page + $content_pref['content_top_icon_width'] = ''; //use this size for icon + $content_pref['content_top_caption'] = CONTENT_LAN_38; //caption for top rated page + $content_pref['content_top_caption_append_name'] = '1'; //append category heading to caption + $content_pref['content_score_icon_width'] = ''; //use this size for icon + $content_pref['content_score_caption'] = CONTENT_LAN_87; //caption for top score page + $content_pref['content_score_caption_append_name'] = '1'; //append category heading to caption + + return $content_pref; + } + + //update custom theme + function upgrade_1_24(){ + global $sql, $sql2, $eArrayStorage, $tp, $aa; + + $upgrade = TRUE; + + $sqlc = new db; + $sqld = new db; + //add new preferences in core + if($sqlc -> db_Select("core", "*", "e107_name='pcontent' ")){ + $row = $sqlc -> db_Fetch(); + + $content_pref = $eArrayStorage->ReadArray($row['e107_value']); + + //update theme + if(strpos($content_pref['content_theme'], "{e_")!==FALSE){ + }else{ + $content_pref['content_theme'] = "{e_PLUGIN}content/templates/".$content_pref['content_theme']."/"; + } + + $tmp1 = $eArrayStorage->WriteArray($content_pref); + $sqld -> db_Update("core", "e107_value = '{$tmp1}' WHERE e107_name = 'pcontent' "); + } + + //add new preferences for each main parent + if($sqlc -> db_Select("pcontent", "content_id, content_heading, content_pref", "content_parent = '0' ")){ + while($row=$sqlc->db_Fetch()){ + + $id = $row['content_id']; + $content_pref = $eArrayStorage->ReadArray($row['content_pref']); + + //update theme + if(strpos($content_pref['content_theme'], "{e_")!==FALSE){ + }else{ + $content_pref['content_theme'] = "{e_PLUGIN}content/templates/".$content_pref['content_theme']."/"; + } + + $tmp1 = $eArrayStorage->WriteArray($content_pref); + $sqld -> db_Update("pcontent", "content_pref='{$tmp1}' WHERE content_id='$id' "); + } + } + return CONTENT_ADMIN_CONVERSION_LAN_68."
    "; + } + + //convert rows + function upgrade_1_1(){ + global $sql, $sql2, $tp, $plugintable, $eArrayStorage; + $plugintable = "pcontent"; + + $count = "0"; + $sql = new db; + $thiscount = $sql -> db_Select("pcontent", "*", "ORDER BY content_id ", "mode=no_where" ); + if($thiscount > 0){ + while($row = $sql -> db_Fetch()){ + + //main parent + if($row['content_parent'] == "0"){ + $newparent = "0"; + + //subcat + }elseif(substr($row['content_parent'],0,2) == "0."){ + $newparent = "0".strrchr($row['content_parent'], "."); + + //item + }elseif( strpos($row['content_parent'], ".") && substr($row['content_parent'],0,1) != "0"){ + $newparent = substr(strrchr($row['content_parent'], "."),1); + } + + $sql2 -> db_Update("pcontent", " content_parent = '".$newparent."', content_pref='' WHERE content_id='".$row['content_id']."' "); + } + } + return CONTENT_ADMIN_CONVERSION_LAN_58."

    ".CONTENT_ADMIN_CONVERSION_LAN_46."
    "; + } + + + + + function show_main_intro(){ + global $sql, $ns, $rs, $type, $type_id, $action, $sub_action, $id, $plugintable; + $plugintable = "pcontent"; + + if(!is_object($sql)){ $sql = new db; } + $newcontent = $sql -> db_Count($plugintable, "(*)", ""); + if($newcontent > 0){ + return false; + }else{ + + $text .= " +
    +
    + ".$rs -> form_open("post", e_SELF, "dataform")." + "; + + $oldcontent = $sql -> db_Count("content", "(*)", ""); + if($oldcontent > 0){ + $text .= ""; + + $text .= ""; + $text .= ""; + $text .= ""; + $text .= " + + + + "; + + $text .= ""; + $text .= ""; + $text .= ""; + $text .= " + + + + "; + + $text .= ""; + $text .= ""; + $text .= ""; + $text .= " + + + + "; + + }else{ + $text .= ""; + $text .= ""; + $text .= " + + + + "; + } + + $text .= "
    ".CONTENT_ADMIN_MAIN_LAN_8." ".CONTENT_ADMIN_MAIN_LAN_9." ".CONTENT_ADMIN_MAIN_LAN_11."
    ".CONTENT_ADMIN_MAIN_LAN_18."
    ".CONTENT_ADMIN_MAIN_LAN_19."
    ".CONTENT_ADMIN_CONVERSION_LAN_43."".$rs -> form_button("submit", "convert_table", CONTENT_ADMIN_CONVERSION_LAN_59)."
    ".CONTENT_ADMIN_MAIN_LAN_22."
    ".CONTENT_ADMIN_MAIN_LAN_23."
    ".CONTENT_ADMIN_CONVERSION_LAN_54."".$rs -> form_button("submit", "create_default", CONTENT_ADMIN_CONVERSION_LAN_60)."
    ".CONTENT_ADMIN_MAIN_LAN_20."
    ".CONTENT_ADMIN_MAIN_LAN_21."
    ".CONTENT_ADMIN_CONVERSION_LAN_56."".$rs -> form_button("button", "fresh", CONTENT_ADMIN_CONVERSION_LAN_61, "onclick=\"document.location='".e_PLUGIN."content/admin_content_config.php?type.0.cat.create'\" + ")."
    ".CONTENT_ADMIN_MAIN_LAN_8." ".CONTENT_ADMIN_MAIN_LAN_9." ".CONTENT_ADMIN_MAIN_LAN_24."
    ".CONTENT_ADMIN_MAIN_LAN_25."
    ".CONTENT_ADMIN_CONVERSION_LAN_54."".$rs -> form_button("submit", "create_default", CONTENT_ADMIN_CONVERSION_LAN_60)."
    ".$rs -> form_close()." +
    +
    "; + + $ns -> tablerender(CONTENT_ADMIN_MAIN_LAN_7, $text); + return true; + } + } + + //function to insert default preferences for a main parent + function insert_default_prefs($id){ + global $sql, $aa, $plugintable, $eArrayStorage; + $plugintable = "pcontent"; + $plugindir = e_PLUGIN."content/"; + unset($content_pref, $tmp); + + if(!is_object($aa)){ + require_once($plugindir."handlers/content_class.php"); + $aa = new content; + } + + $content_pref = $aa -> ContentDefaultPrefs($id); + $tmp = $eArrayStorage->WriteArray($content_pref); + + $sql -> db_Update($plugintable, "content_pref='$tmp' WHERE content_id='$id' "); + } + + + //function to convert comments + function convert_comments(){ + global $plugintable; + $plugintable = "pcontent"; + + if(!is_object($sqlcc)){ $sqlcc = new db; } + $numc = $sqlcc -> db_Count("comments", "(*)", "WHERE comment_type = '1' "); + if($numc > 0){ + $sqlcc -> db_Update("comments", "comment_type = '".$plugintable."' WHERE comment_type = '1' "); + } + } + + + //function to convert rating + function convert_rating(){ + global $plugintable; + $plugintable = "pcontent"; + + if(!is_object($sqlcr)){ $sqlcr = new db; } + $numr = $sqlcr -> db_Count("rate", "(*)", "WHERE (rate_table = 'article' || rate_table = 'review' || rate_table = 'content') "); + if($numr > 0){ + $sqlcr -> db_Update("rate", "rate_table = '".$plugintable."' WHERE (rate_table = 'article' || rate_table = 'review' || rate_table = 'content') "); + } + } + + + //create main parent + function create_mainparent($name, $tot, $order){ + global $sql, $aa, $plugintable, $tp; + $plugintable = "pcontent"; + + $sql = new db; + $sql -> db_Select("content", "MAX(content_id) as maxcid", "", "mode=no_where"); + list($maxcid) = $sql -> db_Fetch(); + $newid = $maxcid + $order; + + // ##### STAGE 4 : INSERT MAIN PARENT FOR ARTICLE --------------------------------------------- + $checkinsert = FALSE; + if($tot > 0){ + //if(!is_object($sql)){ $sql = new db; } + $sql = new db; + if(!$sql -> db_Select($plugintable, "content_heading", "content_heading = '".$name."' AND content_parent = '0' ")){ + $name = $tp -> toDB($name); + + $sql -> db_Insert($plugintable, "'".$newid."', '".$name."', '', '', '', '1', '', '', '', '0', '0', '0', '0', '', '".time()."', '0', '0', '', '".$order."', '0', '', '' "); + + //check if row is present in the db (is it a valid insert) + //if(!is_object($sql2)){ $sql2 = new db; } + $sql2 = new db; + if(!$sql2 -> db_Select($plugintable, "content_id", "content_heading = '".$name."' ")){ + $message = CONTENT_ADMIN_CONVERSION_LAN_45; + }else{ + $message = $name." ".CONTENT_ADMIN_CONVERSION_LAN_7."
    "; + $checkinsert = TRUE; + + //select main parent id + $sql3 = new db; + //if(!is_object($sql3)){ $sql3 = new db; } + $sql3 -> db_Select($plugintable, "content_id", "content_heading = '".$name."' AND content_parent = '0' "); + list($main_id) = $sql3 -> db_Fetch(); + + //insert default preferences + $this -> insert_default_prefs($main_id); + + //create menu + $aa -> CreateParentMenu($main_id); + + $message .= $name." ".CONTENT_ADMIN_CONVERSION_LAN_8."
    "; + } + }else{ + $message = CONTENT_ADMIN_CONVERSION_LAN_9." ".$name." ".CONTENT_ADMIN_CONVERSION_LAN_10." : ".CONTENT_ADMIN_CONVERSION_LAN_53."
    "; + } + }else{ + $message = CONTENT_ADMIN_CONVERSION_LAN_9." ".$name." ".CONTENT_ADMIN_CONVERSION_LAN_10."
    "; + } + $create_mainparent = array($checkinsert, $message); + return $create_mainparent; + } + + + //analayse unknown rows + function analyse_unknown(){ + global $sql; + + if(!is_object($sql)){ $sql = new db; } + $totaloldrowsunknown = $sql -> db_Select("content", "*", " NOT ( (content_parent = '1' AND content_type = '1') || (content_parent = '0' AND content_type = '1') || (content_parent = '0' AND content_type = '6') || (content_parent = '0' AND content_type = '10') || (content_type = '3' || content_type = '16') || (content_type = '0' || content_type = '15') ) "); + + while($row = $sql -> db_Fetch()){ + $unknown_bug[] = $row['content_id']." ".$row['content_heading']; + $unknown_bug_id[] = $row['content_id']; + $unknown_bug_type[] = "parent=".$row['content_parent']." - type=".$row['content_type']; + } + $analyse_unknown = array($unknown_bug, $unknown_bug_id); + return $analyse_unknown; + } + + + //convert categories + function convert_category($name, $query, $ordernr){ + global $sql, $plugintable, $tp; + $plugintable = "pcontent"; + + // ##### STAGE 7 : INSERT CATEGORY ---------------------------------------------------- + if(!is_object($sql)){ $sql = new db; } + if(!$sql -> db_Select("content", "*", " ".$query." ORDER BY content_id " )){ + $cat_present = false; + }else{ + $count = $ordernr; + $cat_present = true; + while($row = $sql -> db_Fetch()){ + + //select main parent id + if(!is_object($sql2)){ $sql2 = new db; } + $sql2 -> db_Select($plugintable, "content_id", "content_heading = '".$name."' AND content_parent = '0' "); + list($main_id) = $sql2 -> db_Fetch(); + + //summary can contain link to image in e107_images/link_icons/".$summary." THIS STILL NEEDS TO BE CHECKED + $newcontent_heading = $tp -> toDB($row['content_heading']); + $newcontent_subheading = ($row['content_subheading'] ? $tp -> toDB($row['content_subheading']) : ""); + $newcontent_summary = ($row['content_summary'] ? $tp -> toDB($row['content_summary']) : ""); + $newcontent_text = $tp -> toDB($row['content_content']); + $newcontent_author = (is_numeric($row['content_author']) ? $row['content_author'] : "0^".$row['content_author']); + $newcontent_icon = ""; + $newcontent_attach = ""; + $newcontent_images = ""; + $newcontent_parent = "0.".$main_id; //make each category a first level subcat of the main parent + $newcontent_comment = $row['content_comment']; + $newcontent_rate = "0"; + $newcontent_pe = $row['content_pe_icon']; + $newcontent_refer = ""; + $newcontent_starttime = $row['content_datestamp']; + $newcontent_endtime = "0"; + $newcontent_class = $row['content_class']; + $newcontent_pref = ""; + $newcontent_score = "0"; + $newcontent_meta = ""; + $newcontent_layout = ""; + + if(!is_object($sql3)){ $sql3 = new db; } + $sql3 -> db_Insert($plugintable, "'".$row['content_id']."', '".$newcontent_heading."', '".$newcontent_subheading."', '".$newcontent_summary."', '".$newcontent_text."', '".$newcontent_author."', '".$newcontent_icon."', '".$newcontent_attach."', '".$newcontent_images."', '".$newcontent_parent."', '".$newcontent_comment."', '".$newcontent_rate."', '".$newcontent_pe."', '".$newcontent_refer."', '".$newcontent_starttime."', '".$newcontent_endtime."', '".$newcontent_class."', '".$newcontent_pref."', '".$count."', '".$newcontent_score."', '".$newcontent_meta."', '".$newcontent_layout."' "); + + if(!$sql3 -> db_Select($plugintable, "content_id, content_heading", "content_heading = '".$newcontent_heading."' ")){ + $bug_cat_insert[] = $row['content_id']." ".$row['content_heading']; + }else{ + $valid_cat_insert[] = $row['content_id']." ".$row['content_heading']; + $count = $count + 1; + } + } + } + $convert_category = array($cat_present, $valid_cat_insert, $bug_cat_insert, $count); + return $convert_category; + } + + + //convert rows + function convert_row($name, $query, $startorder){ + global $sql, $tp, $plugintable, $eArrayStorage; + $plugintable = "pcontent"; + + // ##### STAGE 8 : INSERT ROW ------------------------------------------------------------- + if(!is_object($sql)){ $sql = new db; } + if(!$thiscount = $sql -> db_Select("content", "*", " ".$query." ORDER BY content_id " )){ + $check_present = false; + }else{ + $count = $startorder; + $check_present = true; + while($row = $sql -> db_Fetch()){ + + $oldcontentid = $row['content_id']; + + //select main parent id + if(!is_object($sql2)){ $sql2 = new db; } + $sql2 -> db_Select($plugintable, "content_id", "content_heading = '".$name."' AND content_parent = '0' "); + list($main_id) = $sql2 -> db_Fetch(); + + //item is in main cat + if($row['content_parent'] == "0"){ + $newcontent_parent = $main_id; + + //item is in sub cat + }else{ + //select old review cat heading + if(!is_object($sql3)){ $sql3 = new db; } + if(!$sql3 -> db_Select("content", "content_id, content_heading", "content_id = '".$row['content_parent']."' ")){ + $bug_oldcat[] = $row['content_id']." ".$row['content_heading']; + $newcontent_parent = $main_id; + }else{ + list($old_cat_id, $old_cat_heading) = $sql3 -> db_Fetch(); + + //select new cat id from the cat with the old_cat_heading + if(!is_object($sql4)){ $sql4 = new db; } + if(!$sql4 -> db_Select($plugintable, "content_id", "content_heading = '".$old_cat_heading."' AND content_parent = '0.".$main_id."' ")){ + $bug_newcat[] = $row['content_id']." ".$row['content_heading']; + $newcontent_parent = $main_id; + }else{ + list($new_cat_id) = $sql4 -> db_Fetch(); + $newcontent_parent = $new_cat_id; + } + } + } + + if (strstr($row['content_content'], "{EMAILPRINT}")) { + $row['content_content'] = str_replace("{EMAILPRINT}", "", $row['content_content']); + } + + $newcontent_heading = $tp -> toDB($row['content_heading']); + $newcontent_subheading = ($row['content_subheading'] ? $tp -> toDB($row['content_subheading']) : ""); + //summary can contain link to image in e107_images/link_icons/".$summary." THIS STILL NEEDS TO BE CHECKED + $newcontent_summary = ($row['content_summary'] ? $tp -> toDB($row['content_summary']) : ""); + $newcontent_text = $tp -> toDB($row['content_content']); + //$newcontent_author = (is_numeric($row['content_author']) ? $row['content_author'] : "0^".$row['content_author']); + $newcontent_author = $row['content_author']; + $newcontent_icon = ""; + $newcontent_attach = ""; + $newcontent_images = ""; + $newcontent_comment = $row['content_comment']; + $newcontent_rate = "0"; + $newcontent_pe = $row['content_pe_icon']; + $newcontent_refer = ($row['content_type'] == "15" || $row['content_type'] == "16" ? "sa" : ""); + $newcontent_starttime = $row['content_datestamp']; + $newcontent_endtime = "0"; + $newcontent_class = $row['content_class']; + $newcontent_pref = ""; + $newcontent_score = ($row['content_review_score'] && $row['content_review_score'] != "none" ? $row['content_review_score'] : "0"); + $newcontent_meta = ""; + $newcontent_layout = ""; + + if(!is_object($sql5)){ $sql5 = new db; } + $sql5 -> db_Insert($plugintable, "'".$row['content_id']."', '".$newcontent_heading."', '".$newcontent_subheading."', '".$newcontent_summary."', '".$newcontent_text."', '".$newcontent_author."', '".$newcontent_icon."', '".$newcontent_attach."', '".$newcontent_images."', '".$newcontent_parent."', '".$newcontent_comment."', '".$newcontent_rate."', '".$newcontent_pe."', '".$newcontent_refer."', '".$newcontent_starttime."', '".$newcontent_endtime."', '".$newcontent_class."', '".$newcontent_pref."', '1.".$count."', '".$newcontent_score."', '".$newcontent_meta."', '".$newcontent_layout."' "); + + if(!is_object($sql6)){ $sql6 = new db; } + if(!$sql6 -> db_Select($plugintable, "content_id, content_heading", "content_heading = '".$newcontent_heading."' ")){ + $bug_insert[] = $row['content_id']." ".$row['content_heading']; + }else{ + $valid_insert[] = $row['content_id']." ".$row['content_heading']; + $count = $count + 1; + } + } + } + $convert_row = array($check_present, $count, $valid_insert, $bug_insert, $bug_oldcat, $bug_newcat); + return $convert_row; + } + + + //show output of the category conversion + function results_conversion_category($name, $array, $oldrows){ + + //no pages present + if($array[0] === false){ + if( !(count($array[1]) > 0 || count($array[2]) > 0) ){ + $text .= "".CONTENT_ADMIN_CONVERSION_LAN_34." ".$name." ".CONTENT_ADMIN_CONVERSION_LAN_35.""; + } + + //pages present + }else{ + + //valid inserts + if(count($array[1]) > 0 ){ + $text .= " + + ".CONTENT_ADMIN_CONVERSION_LAN_3." : ".count($array[1])." ".CONTENT_ADMIN_CONVERSION_LAN_38." + ".CONTENT_ADMIN_CONVERSION_LAN_48." + + + "; + } + + //bug inserts + if(count($array[2]) > 0 ){ + $text .= " + + ".CONTENT_ADMIN_CONVERSION_LAN_3." : ".count($array[2])." ".CONTENT_ADMIN_CONVERSION_LAN_39." + ".CONTENT_ADMIN_CONVERSION_LAN_48." + + + "; + } + $text .= " + + ".CONTENT_ADMIN_CONVERSION_LAN_3." : ".CONTENT_ADMIN_CONVERSION_LAN_27." + + ".CONTENT_ADMIN_CONVERSION_LAN_48." + + + "; + } + return $text; + } + + + //show output of the item conversion + function results_conversion_row($name, $array, $oldrows){ + + //no rows present + if($array[0] === false){ + $text .= "".CONTENT_ADMIN_CONVERSION_LAN_34." ".$name." ".CONTENT_ADMIN_CONVERSION_LAN_36.""; + + //rows present + }else{ + + //valid insert + if(count($array[2]) > 0 ){ + $text .= " + + ".CONTENT_ADMIN_CONVERSION_LAN_6." : ".count($array[2])." ".CONTENT_ADMIN_CONVERSION_LAN_38." + + ".CONTENT_ADMIN_CONVERSION_LAN_48." + + + "; + } + //bugs : old category + if(count($array[4]) > 0 ){ + $text .= " + + ".CONTENT_ADMIN_CONVERSION_LAN_6." : ".count($array[4])." ".CONTENT_ADMIN_CONVERSION_LAN_31." + + ".CONTENT_ADMIN_CONVERSION_LAN_48." + + + "; + } + //bugs : new category + if(count($array[5]) > 0 ){ + $text .= " + + ".CONTENT_ADMIN_CONVERSION_LAN_6." : ".count($array[5])." ".CONTENT_ADMIN_CONVERSION_LAN_31." + + ".CONTENT_ADMIN_CONVERSION_LAN_48." + + + "; + } + //bugs : insertion failed + if(count($array[3]) > 0 ){ + $text .= " + + ".CONTENT_ADMIN_CONVERSION_LAN_6." : ".count($array[3])." ".CONTENT_ADMIN_CONVERSION_LAN_39." + + ".CONTENT_ADMIN_CONVERSION_LAN_48." + + + "; + } + + //analyses + $text .= " + + ".CONTENT_ADMIN_CONVERSION_LAN_6." : ".CONTENT_ADMIN_CONVERSION_LAN_27." + + ".CONTENT_ADMIN_CONVERSION_LAN_48." + + + "; + } + + + return $text; + } + + + //show output of the mainparent conversion + function results_conversion_mainparent($content, $review, $article){ + $text = "".CONTENT_ADMIN_CONVERSION_LAN_50.""; + $text .= " + + ".($content[0] == "1" ? CONTENT_ICON_OK : CONTENT_ICON_ERROR)." ".CONTENT_ADMIN_CONVERSION_LAN_20." + + ".CONTENT_ADMIN_CONVERSION_LAN_48." + + + + + ".($review[0] == "1" ? CONTENT_ICON_OK : CONTENT_ICON_ERROR)." ".CONTENT_ADMIN_CONVERSION_LAN_21." + + ".CONTENT_ADMIN_CONVERSION_LAN_48." + + + + + ".($article[0] == "1" ? CONTENT_ICON_OK : CONTENT_ICON_ERROR)." ".CONTENT_ADMIN_CONVERSION_LAN_22." + + ".CONTENT_ADMIN_CONVERSION_LAN_48." + + + "; + + + + return $text; + } + +} + +?> \ No newline at end of file diff --git a/e107_plugins/content/handlers/content_db_class.php b/e107_plugins/content/handlers/content_db_class.php new file mode 100644 index 000000000..5c65a547d --- /dev/null +++ b/e107_plugins/content/handlers/content_db_class.php @@ -0,0 +1,522 @@ +".time().") "; + +if (!defined('ADMIN_WIDTH')) { define("ADMIN_WIDTH", "width:98%;"); } + +//icon, file, image upload +if(isset($_POST['uploadfile'])){ + + if($_POST['uploadtype']){ + $pref['upload_storagetype'] = "1"; + require_once(e_HANDLER."upload_handler.php"); + $mainparent = $aa -> getMainParent(intval($_POST['parent'])); + $content_pref = $aa -> getContentPref($mainparent); + + if($_POST['content_id']){ + $newpid = $_POST['content_id']; + }else{ + $sql -> db_select("pcontent", "MAX(content_id) as aid", "content_id!='0' "); + list($aid) = $sql -> db_Fetch(); + $newpid = $aid+1; + } + } + + //icon + if($_POST['uploadtype'] == "1"){ + $pref['upload_storagetype'] = "1"; + $pathtmp = $_POST['tmppathicon']; + $uploaded = file_upload($pathtmp); + $new = ""; + if($uploaded){ + $uporg = $uploaded[0]['name']; + $resize = (isset($content_pref["content_upload_icon_size"]) && $content_pref["content_upload_icon_size"] ? $content_pref["content_upload_icon_size"] : "100"); + if($uporg){ + $new = $newpid."_".$uporg; + rename($pathtmp.$uporg, $pathtmp.$new); + require_once(e_HANDLER."resize_handler.php"); + resize_image($pathtmp.$new, $pathtmp.$new, $resize, "nocopy"); + } + } + $message = ($new ? CONTENT_ADMIN_ITEM_LAN_106 : CONTENT_ADMIN_ITEM_LAN_107); + + //file + }elseif($_POST['uploadtype'] == "2"){ + $pref['upload_storagetype'] = "1"; + $pathtmp = $_POST['tmppathfile']; + $uploaded = file_upload($pathtmp); + $new = ""; + if($uploaded){ + $uporg = $uploaded[0]['name']; + if($uporg){ + $new = $newpid."_".$uporg; + rename($pathtmp.$uporg, $pathtmp.$new); + } + } + $message = ($new ? CONTENT_ADMIN_ITEM_LAN_108 : CONTENT_ADMIN_ITEM_LAN_109); + + //image + }elseif($_POST['uploadtype'] == "3"){ + $pref['upload_storagetype'] = "1"; + $pathtmp = $_POST['tmppathimage']; + $uploaded = file_upload($pathtmp); + $new = ""; + if($uploaded){ + $uporg = $uploaded[0]['name']; + $resize = (isset($content_pref["content_upload_image_size"]) && $content_pref["content_upload_image_size"] ? $content_pref["content_upload_image_size"] : "500"); + $resizethumb = (isset($content_pref["content_upload_image_size_thumb"]) && $content_pref["content_upload_image_size_thumb"] ? $content_pref["content_upload_image_size_thumb"] : "100"); + if($uporg){ + $new = $newpid."_".$uporg; + rename($pathtmp.$uporg, $pathtmp.$new); + require_once(e_HANDLER."resize_handler.php"); + resize_image($pathtmp.$new, $pathtmp.$new, $resizethumb, "copy"); + resize_image($pathtmp.$new, $pathtmp.$new, $resize, "nocopy"); + } + } + $message = ($new ? CONTENT_ADMIN_ITEM_LAN_110 : CONTENT_ADMIN_ITEM_LAN_111); + } +} + +class contentdb{ + + //function dbContentUpdate($mode, $type){ + function dbContent($mode, $type){ + //$mode : create or update + //$type : none(=admin), submit, contentmanager + global $pref, $qs, $sql, $ns, $rs, $aa, $tp, $plugintable, $e107cache, $eArrayStorage, $e_event; + + $_POST['content_heading'] = $tp -> toDB(trim($_POST['content_heading'])); + $_POST['content_subheading'] = $tp -> toDB($_POST['content_subheading']); + $_POST['content_summary'] = $tp -> toDB($_POST['content_summary']); + + if(e_WYSIWYG){ + $_POST['content_text'] = $tp->createConstants($_POST['content_text']); // convert e107_images/ to {e_IMAGE} etc. + } + //the problem with tiny_mce is it's storing e_HTTP with an image path, while it should only use the {e_xxx} variables + //this small check resolves this, and stores the paths correctly + if(strstr($_POST['content_text'],e_HTTP."{e_")){ + $_POST['content_text'] = str_replace(e_HTTP."{e_", "{e_", $_POST['content_text']); + } + + $_POST['content_text'] = $tp -> toDB($_POST['content_text']); + $_POST['parent'] = ($_POST['parent'] ? intval($_POST['parent']) : "0"); + $_POST['content_class'] = ($_POST['content_class'] ? intval($_POST['content_class']) : "0"); + $_POST['content_meta'] = $tp -> toDB($_POST['content_meta']); + + if(USER){ + if($_POST['content_author_id']){ + if(!($_POST['content_author_id'] == USERID && $_POST['content_author_name'] == USERNAME && $_POST['content_author_email'] == USEREMAIL) ){ + + $author = $_POST['content_author_id']; + + if($_POST['content_author_name'] != CONTENT_ADMIN_ITEM_LAN_14){ + $author .= "^".$_POST['content_author_name']; + } + if($_POST['content_author_email'] != CONTENT_ADMIN_ITEM_LAN_15){ + $author .= "^".$_POST['content_author_email']; + } + + }else{ + $author = $_POST['content_author_id']; + } + }else{ + $author = $_POST['content_author_name']; + if($_POST['content_author_email'] != "" && $_POST['content_author_email'] != CONTENT_ADMIN_ITEM_LAN_15){ + $author .= "^".$_POST['content_author_email']; + } + } + }else{ + $author = $_POST['content_author_name']; + if($_POST['content_author_email'] != "" && $_POST['content_author_email'] != CONTENT_ADMIN_ITEM_LAN_15){ + $author .= "^".$_POST['content_author_email']; + } + } + + $mainparent = $aa -> getMainParent(intval($_POST['parent'])); + $content_pref = $aa -> getContentPref($mainparent); + + $content_pref["content_icon_path_tmp"] = ($content_pref["content_icon_path_tmp"] ? $content_pref["content_icon_path_tmp"] : $content_pref["content_icon_path"]."tmp/"); + $content_pref["content_file_path_tmp"] = ($content_pref["content_file_path_tmp"] ? $content_pref["content_file_path_tmp"] : $content_pref["content_file_path"]."tmp/"); + $content_pref["content_image_path_tmp"] = ($content_pref["content_image_path_tmp"] ? $content_pref["content_image_path_tmp"] : $content_pref["content_image_path"]."tmp/"); + + $content_cat_icon_path_large = $tp -> replaceConstants($content_pref["content_cat_icon_path_large"]); + $content_cat_icon_path_small = $tp -> replaceConstants($content_pref["content_cat_icon_path_small"]); + $content_icon_path = $tp -> replaceConstants($content_pref["content_icon_path"]); + $content_image_path = $tp -> replaceConstants($content_pref["content_image_path"]); + $content_file_path = $tp -> replaceConstants($content_pref["content_file_path"]); + $content_tmppath_icon = $tp -> replaceConstants($content_pref["content_icon_path_tmp"]); + $content_tmppath_file = $tp -> replaceConstants($content_pref["content_file_path_tmp"]); + $content_tmppath_image = $tp -> replaceConstants($content_pref["content_image_path_tmp"]); + + //move icon to correct folder + if($_POST['content_icon']){ + $icon = $tp->toDB($_POST['content_icon']); + if($icon && file_exists($content_tmppath_icon.$icon)){ + rename($content_tmppath_icon.$icon, $content_icon_path.$icon); + } + } + + $sumf = 0; + $sumi = 0; + foreach($_POST as $k => $v){ + if(strpos($k, "content_files") === 0){ + $sumf = $sumf+1; + } + if(strpos($k, "content_images") === 0){ + $sumi = $sumi+1; + } + } + //move attachments to correct folder + $totalattach = ""; + for($i=0;$i<$sumf;$i++){ + $attach{$i} = $tp->toDB($_POST["content_files{$i}"]); + if($attach{$i} && file_exists($content_tmppath_file.$attach{$i})){ + rename($content_tmppath_file.$attach{$i}, $content_file_path.$attach{$i}); + } + if($attach{$i} && file_exists($content_file_path.$attach{$i})){ + $totalattach .= "[file]".$attach{$i}; + } + } + //move images to correct folder + $totalimages = ""; + for($i=0;$i<$sumi;$i++){ + $image{$i} = $tp->toDB($_POST["content_images{$i}"]); + if($image{$i} && file_exists($content_tmppath_image.$image{$i})){ + rename($content_tmppath_image.$image{$i}, $content_image_path.$image{$i}); + } + if($image{$i} && file_exists($content_tmppath_image."thumb_".$image{$i})){ + rename($content_tmppath_image."thumb_".$image{$i}, $content_image_path."thumb_".$image{$i}); + } + if($image{$i} && file_exists($content_image_path.$image{$i})){ + $totalimages .= "[img]".$image{$i}; + } + } + + if($_POST['update_datestamp']){ + $starttime = time(); + }else{ + if($_POST['ne_day'] != "none" && $_POST['ne_month'] != "none" && $_POST['ne_year'] != "none" && $_POST['ne_day'] != "0" && $_POST['ne_month'] != "0" && $_POST['ne_year'] != "0"){ + $newstarttime = mktime( 0, 0, 0, intval($_POST['ne_month']), intval($_POST['ne_day']), intval($_POST['ne_year'])); + }else{ + $newstarttime = time(); + } + if(isset($_POST['content_datestamp']) && $_POST['content_datestamp'] != "" && $_POST['content_datestamp'] != "0"){ + if($newstarttime != $starttime){ + $starttime = $newstarttime; + }else{ + $starttime = intval($_POST['content_datestamp']); + } + }else{ + $starttime = time(); + } + } + + if($_POST['end_day'] != "none" && $_POST['end_month'] != "none" && $_POST['end_year'] != "none" && $_POST['end_day'] != "0" && $_POST['end_month'] != "0" && $_POST['end_year'] != "0"){ + $endtime = mktime( 0, 0, 0, intval($_POST['end_month']), intval($_POST['end_day']), intval($_POST['end_year'])); + }else{ + $endtime = "0"; + } + + //custom additional data tags + for($i=0;$i<$content_pref["content_admin_custom_number"];$i++){ + if(isset($_POST["content_custom_key_{$i}"]) && isset($_POST["content_custom_value_{$i}"]) && $_POST["content_custom_value_{$i}"] != ""){ + $keystring = $tp->toDB($_POST["content_custom_key_{$i}"]); + $custom["content_custom_{$keystring}"] = $tp->toDB($_POST["content_custom_value_{$i}"]); + } + } + //preset additional data tags + if(isset($_POST['content_custom_preset_key']) && $_POST['content_custom_preset_key']){ + $custom['content_custom_presettags'] = $tp->toDB($_POST['content_custom_preset_key']); + } + if($custom){ + $contentprefvalue = $eArrayStorage->WriteArray($custom); + }else{ + $contentprefvalue = ""; + } + + $_POST['content_layout'] = (!$_POST['content_layout'] || $_POST['content_layout'] == "content_content_template.php" ? "" : $tp->toDB($_POST['content_layout'])); + + //content_order : not added in the sql + //content_refer : only added in sql if posting submitted item + //$refer = (isset($_POST['content_refer']) && $_POST['content_refer']=='sa' ? ", content_refer='' " : ""); + + if($mode == "create"){ + if($type == "submit"){ + $refer = ($content_pref["content_submit_directpost"] ? "" : "sa"); + }else{ + $refer = ""; + } + $sql -> db_Insert($plugintable, "'0', '".$_POST['content_heading']."', '".$_POST['content_subheading']."', '".$_POST['content_summary']."', '".$_POST['content_text']."', '".$tp->toDB($author)."', '".$icon."', '".$totalattach."', '".$totalimages."', '".$_POST['parent']."', '".intval($_POST['content_comment'])."', '".intval($_POST['content_rate'])."', '".intval($_POST['content_pe'])."', '".$refer."', '".$starttime."', '".$endtime."', '".$_POST['content_class']."', '".$contentprefvalue."', '0', '".intval($_POST['content_score'])."', '".$_POST['content_meta']."', '".$_POST['content_layout']."' "); + + $e107cache->clear("$plugintable"); + + //trigger event for notify + $edata_cs = array("content_heading" => $_POST['content_heading'], "content_subheading" => $_POST['content_subheading'], "content_author" => $_POST['content_author_name']); + $e_event->trigger("content", $edata_cs); + + if(!$type || $type == "admin"){ + js_location(e_SELF."?".e_QUERY.".cc"); + }elseif($type == "contentmanager"){ + js_location(e_SELF."?c"); + }elseif($type == "submit"){ + if($content_pref["content_submit_directpost"]){ + js_location(e_SELF."?s"); + }else{ + js_location(e_SELF."?d"); + } + } + } + + if($mode == "update"){ + if($type == "submit"){ + if(isset($_POST['content_refer']) && $_POST['content_refer']=='sa'){ + $refer = ", content_refer='' "; + }else{ + $refer = ""; + } + }else{ + if(isset($_POST['content_refer']) && $_POST['content_refer']=='sa'){ + $refer = ", content_refer='' "; + }else{ + $refer = ""; + } + } + $sql -> db_Update($plugintable, "content_heading = '".$_POST['content_heading']."', content_subheading = '".$_POST['content_subheading']."', content_summary = '".$_POST['content_summary']."', content_text = '".$_POST['content_text']."', content_author = '".$tp->toDB($author)."', content_icon = '".$icon."', content_file = '".$totalattach."', content_image = '".$totalimages."', content_parent = '".$_POST['parent']."', content_comment = '".intval($_POST['content_comment'])."', content_rate = '".intval($_POST['content_rate'])."', content_pe = '".intval($_POST['content_pe'])."' ".$refer.", content_datestamp = '".$starttime."', content_enddate = '".$endtime."', content_class = '".$_POST['content_class']."', content_pref = '".$contentprefvalue."', content_score='".intval($_POST['content_score'])."', content_meta='".$_POST['content_meta']."', content_layout='".$_POST['content_layout']."' WHERE content_id = '".intval($_POST['content_id'])."' "); + + $e107cache->clear("$plugintable"); + $e107cache->clear("comment.$plugintable.{$_POST['content_id']}"); + if(!$type || $type == "admin"){ + js_location(e_SELF."?".e_QUERY.".cu"); + }elseif($type == "contentmanager"){ + js_location(e_SELF."?u"); + } + } + } + + + //function dbCategoryUpdate($mode){ + function dbCategory($mode){ + global $pref, $sql, $ns, $rs, $aa, $tp, $plugintable, $e107cache, $content_cat_icon_path_large, $content_cat_icon_path_small; + + $_POST['cat_heading'] = $tp -> toDB($_POST['cat_heading']); + $_POST['cat_subheading'] = $tp -> toDB($_POST['cat_subheading']); + if(e_WYSIWYG){ + $_POST['cat_text'] = $tp->createConstants($_POST['cat_text']); // convert e107_images/ to {e_IMAGE} etc. + } + $_POST['cat_text'] = $tp -> toDB($_POST['cat_text']); + $_POST['parent'] = ($_POST['parent'] == "0" || $_POST['parent']==$_POST['cat_id'] ? "0" : "0.".intval($_POST['parent'])); + $_POST['cat_class'] = ($_POST['cat_class'] ? intval($_POST['cat_class']) : "0"); + + if($_POST['ne_day'] != "none" && $_POST['ne_month'] != "none" && $_POST['ne_year'] != "none"){ + $starttime = mktime( 0, 0, 0, intval($_POST['ne_month']), intval($_POST['ne_day']), intval($_POST['ne_year'])); + }else{ + $starttime = time(); + } + if($_POST['end_day'] != "none" && $_POST['end_month'] != "none" && $_POST['end_year'] != "none"){ + $endtime = mktime( 0, 0, 0, intval($_POST['end_month']), intval($_POST['end_day']), intval($_POST['end_year'])); + }else{ + $endtime = "0"; + } + + if($mode == "create"){ + $sql -> db_Insert($plugintable, "'0', '".$_POST['cat_heading']."', '".$_POST['cat_subheading']."', '', '".$_POST['cat_text']."', '".ADMINID."', '".$tp->toDB($_POST["cat_icon"])."', '', '', '".$_POST['parent']."', '".intval($_POST['cat_comment'])."', '".intval($_POST['cat_rate'])."', '".intval($_POST['cat_pe'])."', '', '".$starttime."', '".$endtime."', '".$_POST['cat_class']."', '', '0', '0', '', '' "); + + // check and insert default pref values if new main parent + create menu file + if($_POST['parent'] == "0"){ + $iid = mysql_insert_id(); + $content_pref = $aa -> getContentPref($iid); + $aa -> CreateParentMenu($iid); + } + $e107cache->clear("$plugintable"); + js_location(e_SELF."?".e_QUERY.".pc"); + + }elseif($mode == "update"){ + $sql -> db_Update($plugintable, "content_heading = '".$_POST['cat_heading']."', content_subheading = '".$_POST['cat_subheading']."', content_summary = '', content_text = '".$_POST['cat_text']."', content_author = '".ADMINID."', content_icon = '".$tp->toDB($_POST["cat_icon"])."', content_image = '', content_parent = '".$_POST['parent']."', content_comment = '".intval($_POST['cat_comment'])."', content_rate = '".intval($_POST['cat_rate'])."', content_pe = '".intval($_POST['cat_pe'])."', content_refer = '0', content_datestamp = '".$starttime."', content_enddate = '".$endtime."', content_class = '".intval($_POST['cat_class'])."' WHERE content_id = '".intval($_POST['cat_id'])."' "); + + // check and insert default pref values if new main parent + create menu file + if($_POST['parent'] == "0"){ + @unlink(e_PLUGIN."content/menus/content_".$_POST['menuheading']."_menu.php"); + $content_pref = $aa -> getContentPref($_POST['cat_id']); + $aa -> CreateParentMenu($_POST['cat_id']); + } + $e107cache->clear("$plugintable"); + js_location(e_SELF."?".e_QUERY.".pu"); + } + } + + + function dbAssignAdmins($mode, $id, $value){ + global $plugintable, $qs, $sql, $eArrayStorage; + + if($mode == "admin"){ + $id = intval($id); + $sql -> db_Select($plugintable, "content_pref", "content_id = '".intval($id)."' "); + $row = $sql -> db_Fetch(); + + //get current preferences + $content_pref = $eArrayStorage->ReadArray($row['content_pref']); + + //assign new preferences + if($value == "clear"){ + $content_pref["content_manager_allowed"] = ""; + }else{ + $content_pref["content_manager_allowed"] = $value; + } + + //create new array of preferences + $tmp = $eArrayStorage->WriteArray($content_pref); + + $sql -> db_Update($plugintable, "content_pref = '{$tmp}' WHERE content_id = '".intval($id)."' "); + + $message = CONTENT_ADMIN_CAT_LAN_34; + return $message; + }else{ + return FALSE; + } + } + + + + function dbDelete($mode, $cat, $del_id){ + global $plugintable, $sql, $_POST, $e107cache; + + if($mode == "admin"){ + if($cat == "cat"){ + if($sql -> db_Delete($plugintable, "content_id='".intval($del_id)."' ")){ + $e107cache->clear("$plugintable"); + $message = CONTENT_ADMIN_CAT_LAN_23; + return $message; + } + }elseif($cat == "content"){ + if($sql -> db_Delete($plugintable, "content_id='".intval($del_id)."' ")){ + $e107cache->clear("$plugintable"); + $message = CONTENT_ADMIN_ITEM_LAN_3; + return $message; + } + } + }else{ + return FALSE; + } + } + + + + function dbSetOrder($mode, $type, $order){ + global $plugintable, $sql, $aa, $qs, $_POST, $e107cache; + //$mode : all, inc, dec + //$type : cc (category order), ai (global all items), ci (items in category) + //$order : posted values or id-currentorder + + if($mode == "all"){ + foreach ($order as $cid){ + //each order value in the db has two numbers (a-b) where a = category item order, and b = global item order + //146.3.cat : category order + //35.3.ci.1-0 : category item order + //35.3.ai.1-0 : global item order + + $tmp = explode(".", $cid); + $old = explode("-", $tmp[3]); + $old[0] = ($old[0] == "" ? "0" : $old[0]); + $old[1] = ($old[1] == "" ? "0" : $old[1]); + + $tmp[0] = intval($tmp[0]); + $tmp[1] = intval($tmp[1]); + $old[0] = intval($old[0]); + $old[1] = intval($old[1]); + + if($tmp[2] == "cat"){ + $sql->db_Update($plugintable, "content_order='".$tmp[1]."' WHERE content_id='".$tmp[0]."' " ); + + }elseif($tmp[2] == "ci"){ + $sql->db_Update($plugintable, "content_order='".$tmp[1].".".$old[1]."' WHERE content_id='".$tmp[0]."' " ); + + }elseif($tmp[2] == "ai"){ + $sql->db_Update($plugintable, "content_order='".$old[0].".".$tmp[1]."' WHERE content_id='".$tmp[0]."' " ); + } + $message = CONTENT_ADMIN_ORDER_LAN_2; + } + + }elseif($mode == "inc"){ + + $tmp = explode("-", $order); + $tmp[0] = intval($tmp[0]); + $tmp[1] = intval($tmp[1]); + $tmp[2] = intval($tmp[2]); + + if($type == "cc"){ + $mainparent = $aa -> getMainParent($tmp[0]); + $array = $aa -> getCategoryTree("", $mainparent, TRUE); + $validparent = implode(",", array_keys($array)); + $qry = " content_id REGEXP '".$aa -> CONTENTREGEXP($validparent)."' AND content_order='".($tmp[1]-1)."' "; + $sql->db_Update($plugintable, "content_order=content_order+1 WHERE ".$qry." " ); + $sql->db_Update($plugintable, "content_order=content_order-1 WHERE content_id='".$tmp[0]."' " ); + + }elseif($type == "ci"){ + $sql->db_Update($plugintable, "content_order='".$tmp[1].".".$tmp[2]."' WHERE content_parent = '".intval($qs[2])."' AND SUBSTRING_INDEX(content_order, '.', 1) = '".($tmp[1]-1)."' " ); + $sql->db_Update($plugintable, "content_order='".($tmp[1]-1).".".$tmp[2]."' WHERE content_id='".$tmp[0]."' " ); + + }elseif($type == "ai"){ + $array = $aa -> getCategoryTree("", intval($qs[1]), TRUE); + $validparent = implode(",", array_keys($array)); + $qry = " content_parent REGEXP '".$aa -> CONTENTREGEXP($validparent)."' AND SUBSTRING_INDEX(content_order, '.', -1) = '".($tmp[2]-1)."' "; + $sql->db_Update($plugintable, " content_order=content_order+0.1 WHERE ".$qry." " ); + $sql->db_Update($plugintable, "content_order='".$tmp[1].".".($tmp[2]-1)."' WHERE content_id='".$tmp[0]."' " ); + + } + $message = CONTENT_ADMIN_ORDER_LAN_0; + + }elseif($mode == "dec"){ + + $tmp = explode("-", $order); + $tmp[0] = intval($tmp[0]); + $tmp[1] = intval($tmp[1]); + $tmp[2] = intval($tmp[2]); + if($type == "cc"){ + $mainparent = $aa -> getMainParent($tmp[0]); + $array = $aa -> getCategoryTree("", $mainparent, TRUE); + $validparent = implode(",", array_keys($array)); + $qry = " content_id REGEXP '".$aa -> CONTENTREGEXP($validparent)."' AND content_order='".($tmp[1]+1)."' "; + $sql->db_Update($plugintable, "content_order=content_order-1 WHERE ".$qry." " ); + $sql->db_Update($plugintable, "content_order=content_order+1 WHERE content_id='".$tmp[0]."' " ); + + }elseif($type == "ci"){ + $sql->db_Update($plugintable, "content_order='".$tmp[1].".".$tmp[2]."' WHERE content_parent = '".intval($qs[2])."' AND SUBSTRING_INDEX(content_order, '.', 1) = '".($tmp[1]+1)."' " ); + $sql->db_Update($plugintable, "content_order='".($tmp[1]+1).".".$tmp[2]."' WHERE content_id='".$tmp[0]."' " ); + + }elseif($type == "ai"){ + $array = $aa -> getCategoryTree("", intval($qs[1]), TRUE); + $validparent = implode(",", array_keys($array)); + $qry = " content_parent REGEXP '".$aa -> CONTENTREGEXP($validparent)."' AND SUBSTRING_INDEX(content_order, '.', -1) = '".($tmp[2]+1)."' "; + $sql->db_Update($plugintable, "content_order=content_order-0.1 WHERE ".$qry." " ); + $sql->db_Update($plugintable, "content_order='".$tmp[1].".".($tmp[2]+1)."' WHERE content_id='".$tmp[0]."' " ); + } + $message = CONTENT_ADMIN_ORDER_LAN_1; + } + $e107cache->clear("$plugintable"); + return $message; + } +} + +?> \ No newline at end of file diff --git a/e107_plugins/content/handlers/content_defines.php b/e107_plugins/content/handlers/content_defines.php new file mode 100644 index 000000000..592b67f50 --- /dev/null +++ b/e107_plugins/content/handlers/content_defines.php @@ -0,0 +1,33 @@ +"); } +if (!defined('CONTENT_ICON_LINK')) { define("CONTENT_ICON_LINK", "".CONTENT_ICON_LAN_15.""); } +if (!defined('CONTENT_ICON_DELETE')) { define("CONTENT_ICON_DELETE", "".CONTENT_ICON_LAN_1.""); } +if (!defined('CONTENT_ICON_DELETE_BASE')) { define("CONTENT_ICON_DELETE_BASE", $imagedir."delete_16.png"); } +if (!defined('CONTENT_ICON_OPTIONS')) { define("CONTENT_ICON_OPTIONS", "".CONTENT_ICON_LAN_2.""); } +if (!defined('CONTENT_ICON_USER')) { define("CONTENT_ICON_USER", "".CONTENT_ICON_LAN_3.""); } +if (!defined('CONTENT_ICON_FILE')) { define("CONTENT_ICON_FILE", "".CONTENT_ICON_LAN_4.""); } +if (!defined('CONTENT_ICON_NEW')) { define("CONTENT_ICON_NEW", "".CONTENT_ICON_LAN_5.""); } +if (!defined('CONTENT_ICON_SUBMIT')) { define("CONTENT_ICON_SUBMIT", "".CONTENT_ICON_LAN_6.""); } +if (!defined('CONTENT_ICON_SUBMIT_SMALL')) { define("CONTENT_ICON_SUBMIT_SMALL", "".CONTENT_ICON_LAN_6.""); } +if (!defined('CONTENT_ICON_AUTHORLIST')) { define("CONTENT_ICON_AUTHORLIST", "".CONTENT_ICON_LAN_7.""); } +if (!defined('CONTENT_ICON_WARNING')) { define("CONTENT_ICON_WARNING", "".CONTENT_ICON_LAN_8.""); } +if (!defined('CONTENT_ICON_OK')) { define("CONTENT_ICON_OK", "".CONTENT_ICON_LAN_9.""); } +if (!defined('CONTENT_ICON_ERROR')) { define("CONTENT_ICON_ERROR", "".CONTENT_ICON_LAN_10.""); } +if (!defined('CONTENT_ICON_ORDERCAT')) { define("CONTENT_ICON_ORDERCAT", "".CONTENT_ICON_LAN_11.""); } +if (!defined('CONTENT_ICON_ORDERALL')) { define("CONTENT_ICON_ORDERALL", "".CONTENT_ICON_LAN_12.""); } +if (!defined('CONTENT_ICON_CONTENTMANAGER')) { define("CONTENT_ICON_CONTENTMANAGER", "".CONTENT_ICON_LAN_14.""); } +if (!defined('CONTENT_ICON_CONTENTMANAGER_SMALL')) { define("CONTENT_ICON_CONTENTMANAGER_SMALL", "".CONTENT_ICON_LAN_13.""); } +if (!defined('CONTENT_ICON_ORDER_UP')) { define("CONTENT_ICON_ORDER_UP", "".CONTENT_ADMIN_ITEM_LAN_63.""); } +if (!defined('CONTENT_ICON_ORDER_DOWN')) { define("CONTENT_ICON_ORDER_DOWN", "".CONTENT_ADMIN_ITEM_LAN_64.""); } + +?> \ No newline at end of file diff --git a/e107_plugins/content/handlers/content_form_class.php b/e107_plugins/content/handlers/content_form_class.php new file mode 100644 index 000000000..e78a716c6 --- /dev/null +++ b/e107_plugins/content/handlers/content_form_class.php @@ -0,0 +1,3856 @@ +".time().") "; + +$months = array(CONTENT_ADMIN_DATE_LAN_0, CONTENT_ADMIN_DATE_LAN_1, CONTENT_ADMIN_DATE_LAN_2, CONTENT_ADMIN_DATE_LAN_3, CONTENT_ADMIN_DATE_LAN_4, CONTENT_ADMIN_DATE_LAN_5, CONTENT_ADMIN_DATE_LAN_6, CONTENT_ADMIN_DATE_LAN_7, CONTENT_ADMIN_DATE_LAN_8, CONTENT_ADMIN_DATE_LAN_9, CONTENT_ADMIN_DATE_LAN_10, CONTENT_ADMIN_DATE_LAN_11); + +if (!defined('ADMIN_WIDTH')) { define("ADMIN_WIDTH", "width:98%;"); } + +$stylespacer = "style='border:0; height:20px;'"; + +//only used in admin pages, for normal rows (+ in content_submit.php creation form) +$TOPIC_ROW_NOEXPAND = " + + {TOPIC_TOPIC} + {TOPIC_FIELD} + +"; +//only used in admin pages, for expanding rows (+ in content_submit.php creation form) +$TOPIC_ROW = " + + {TOPIC_TOPIC} + + {TOPIC_HEADING} +
    +
    {TOPIC_HELP}

    + {TOPIC_FIELD} +
    + +"; + +//only used in admin pages, for a spacer row +//$TOPIC_ROW_SPACER = ""; +$TOPIC_ROW_SPACER = ""; + +class contentform{ + + function ContentItemPreview(){ + global $ns, $sql, $aa, $qs, $tp, $mainparent; + + $TRPRE = ""; + $TRPOST = ""; + $TDPRE1 = ""; + $TDPRE2 = ""; + $TDPOST = ""; + $CONTENT_CONTENT_PREVIEW = " + + {CONTENT_CONTENT_PREVIEW_CATEGORY} + {CONTENT_CONTENT_PREVIEW_HEADING} + {CONTENT_CONTENT_PREVIEW_SUBHEADING} + {CONTENT_CONTENT_PREVIEW_SUMMARY} + {CONTENT_CONTENT_PREVIEW_TEXT} + {CONTENT_CONTENT_PREVIEW_AUTHORNAME} + {CONTENT_CONTENT_PREVIEW_AUTHOREMAIL} + {CONTENT_CONTENT_PREVIEW_STARTDATE} + {CONTENT_CONTENT_PREVIEW_ENDDATE} + {CONTENT_CONTENT_PREVIEW_COMMENT} + {CONTENT_CONTENT_PREVIEW_RATE} + {CONTENT_CONTENT_PREVIEW_PE} + {CONTENT_CONTENT_PREVIEW_CLASS} + {CONTENT_CONTENT_PREVIEW_SCORE} + {CONTENT_CONTENT_PREVIEW_META} + {CONTENT_CONTENT_PREVIEW_LAYOUT} + {CONTENT_CONTENT_PREVIEW_CUSTOM} + + {CONTENT_CONTENT_PREVIEW_PARENT} + {CONTENT_CONTENT_PREVIEW_ICON} + {CONTENT_CONTENT_PREVIEW_ATTACH} + {CONTENT_CONTENT_PREVIEW_IMAGES} + {CONTENT_CONTENT_PREVIEW_PAGENAMES} +
    \n"; + + $_POST['parent'] = intval($_POST['parent']); + $mainparent = $aa -> getMainParent( $_POST['parent'] ); + $content_pref = $aa -> getContentPref($mainparent); + $content_cat_icon_path_large = $tp -> replaceConstants($content_pref["content_cat_icon_path_large"]); + $content_cat_icon_path_small = $tp -> replaceConstants($content_pref["content_cat_icon_path_small"]); + $content_icon_path = $tp -> replaceConstants($content_pref["content_icon_path"]); + $content_image_path = $tp -> replaceConstants($content_pref["content_image_path"]); + $content_file_path = $tp -> replaceConstants($content_pref["content_file_path"]); + + $content_pref["content_icon_path_tmp"] = ($content_pref["content_icon_path_tmp"] ? $content_pref["content_icon_path_tmp"] : $content_pref["content_icon_path"]."tmp/"); + $content_pref["content_file_path_tmp"] = ($content_pref["content_file_path_tmp"] ? $content_pref["content_file_path_tmp"] : $content_pref["content_file_path"]."tmp/"); + $content_pref["content_image_path_tmp"] = ($content_pref["content_image_path_tmp"] ? $content_pref["content_image_path_tmp"] : $content_pref["content_image_path"]."tmp/"); + + $content_tmppath_icon = $tp -> replaceConstants($content_pref["content_icon_path_tmp"]); + $content_tmppath_file = $tp -> replaceConstants($content_pref["content_file_path_tmp"]); + $content_tmppath_image = $tp -> replaceConstants($content_pref["content_image_path_tmp"]); + + if($sql -> db_Select("pcontent", "content_heading", " content_id='".$_POST['parent']."' ")){ + $row = $sql -> db_Fetch(); + $PARENT = $row['content_heading']; + } + $content_heading = $tp -> post_toHTML($_POST['content_heading']); + $content_subheading = $tp -> post_toHTML($_POST['content_subheading']); + $content_summary = $tp -> post_toHTML($_POST['content_summary']); + $content_text = $_POST['content_text']; + if(e_WYSIWYG){ + $content_text = $tp->createConstants($content_text); // convert e107_images/ to {e_IMAGE} etc. + } + + //the problem with tiny_mce is it's storing e_HTTP with an image path, while it should only use the {e_xxx} variables + //this small check resolves this, and stores the paths correctly + if(strstr($content_text,e_HTTP."{e_")){ + $content_text = str_replace(e_HTTP."{e_", "{e_", $content_text); + } + $content_text = $tp->post_toHTML($content_text,TRUE); + + $CONTENT_CONTENT_PREVIEW_CATEGORY = ($_POST['parent'] ? $TRPRE.$TDPRE1.CONTENT_ADMIN_ITEM_LAN_57.$TDPOST.$TDPRE2.$PARENT.$TDPOST.$TRPOST : ""); + $CONTENT_CONTENT_PREVIEW_HEADING = ($content_heading ? $TRPRE.$TDPRE1.CONTENT_ADMIN_ITEM_LAN_11.$TDPOST.$TDPRE2.$content_heading.$TDPOST.$TRPOST : ""); + $CONTENT_CONTENT_PREVIEW_SUBHEADING = ($content_subheading ? $TRPRE.$TDPRE1.CONTENT_ADMIN_ITEM_LAN_16.$TDPOST.$TDPRE2.$content_subheading.$TDPOST.$TRPOST : ""); + $CONTENT_CONTENT_PREVIEW_SUMMARY = ($content_summary ? $TRPRE.$TDPRE1.CONTENT_ADMIN_ITEM_LAN_17.$TDPOST.$TDPRE2.$content_summary.$TDPOST.$TRPOST : ""); + $CONTENT_CONTENT_PREVIEW_TEXT = ($content_text ? $TRPRE.$TDPRE1.CONTENT_ADMIN_ITEM_LAN_18.$TDPOST.$TDPRE2.$content_text.$TDPOST.$TRPOST : ""); + $CONTENT_CONTENT_PREVIEW_AUTHORNAME = ($_POST['content_author_name'] ? $TRPRE.$TDPRE1.CONTENT_ADMIN_ITEM_LAN_10." ".CONTENT_ADMIN_ITEM_LAN_14.$TDPOST.$TDPRE2.$_POST['content_author_name'].$TDPOST.$TRPOST : ""); + $CONTENT_CONTENT_PREVIEW_AUTHOREMAIL = ($_POST['content_author_email'] ? $TRPRE.$TDPRE1.CONTENT_ADMIN_ITEM_LAN_10." ".CONTENT_ADMIN_ITEM_LAN_15.$TDPOST.$TDPRE2.$_POST['content_author_email'].$TDPOST.$TRPOST : ""); + $CONTENT_CONTENT_PREVIEW_COMMENT = $TRPRE.$TDPRE1.CONTENT_ADMIN_ITEM_LAN_36.$TDPOST.$TDPRE2.($_POST['content_comment'] ? CONTENT_ADMIN_ITEM_LAN_85 : CONTENT_ADMIN_ITEM_LAN_86).$TDPOST.$TRPOST; + $CONTENT_CONTENT_PREVIEW_RATE = $TRPRE.$TDPRE1.CONTENT_ADMIN_ITEM_LAN_37.$TDPOST.$TDPRE2.($_POST['content_rate'] ? CONTENT_ADMIN_ITEM_LAN_85 : CONTENT_ADMIN_ITEM_LAN_86).$TDPOST.$TRPOST; + $CONTENT_CONTENT_PREVIEW_PE = $TRPRE.$TDPRE1.CONTENT_ADMIN_ITEM_LAN_38.$TDPOST.$TDPRE2.($_POST['content_pe'] ? CONTENT_ADMIN_ITEM_LAN_85 : CONTENT_ADMIN_ITEM_LAN_86).$TDPOST.$TRPOST; + $CONTENT_CONTENT_PREVIEW_CLASS = $TRPRE.$TDPRE1.CONTENT_ADMIN_ITEM_LAN_39.$TDPOST.$TDPRE2.r_userclass_name($_POST['content_class']).$TDPOST.$TRPOST; + $CONTENT_CONTENT_PREVIEW_SCORE = ($_POST['content_score'] ? $TRPRE.$TDPRE1.CONTENT_ADMIN_ITEM_LAN_40.$TDPOST.$TDPRE2.($_POST['content_score']!="none" ? $_POST['content_score']."/100" : CONTENT_ADMIN_ITEM_LAN_118." ".CONTENT_ADMIN_ITEM_LAN_40." ".CONTENT_ADMIN_ITEM_LAN_119).$TDPOST.$TRPOST : ""); + $CONTENT_CONTENT_PREVIEW_META = ($_POST['content_meta'] ? $TRPRE.$TDPRE1.CONTENT_ADMIN_ITEM_LAN_53.$TDPOST.$TDPRE2.($_POST['content_meta']!="" ? $_POST['content_meta'] : CONTENT_ADMIN_ITEM_LAN_118." ".CONTENT_ADMIN_ITEM_LAN_53." ".CONTENT_ADMIN_ITEM_LAN_119).$TDPOST.$TRPOST : ""); + $CONTENT_CONTENT_PREVIEW_LAYOUT = ($_POST['content_layout'] ? $TRPRE.$TDPRE1.CONTENT_ADMIN_ITEM_LAN_92.$TDPOST.$TDPRE2.($_POST['content_layout'] == "none" || $_POST['content_layout'] =="content_content_template.php" ? CONTENT_ADMIN_ITEM_LAN_120 : substr($_POST['content_layout'],25 ,-4)).$TDPOST.$TRPOST : ""); + + //start date + if($_POST['ne_day'] != "none" && $_POST['ne_month'] != "none" && $_POST['ne_year'] != "none"){ + $CONTENT_CONTENT_PREVIEW_STARTDATE = $TRPRE.$TDPRE1.CONTENT_ADMIN_DATE_LAN_15.$TDPOST.$TDPRE2.$_POST['ne_day']." ".$months[($_POST['ne_month']-1)]." ".$_POST['ne_year'].$TDPOST.$TRPOST; + }else{ + $CONTENT_CONTENT_PREVIEW_STARTDATE = $TRPRE.$TDPRE1.CONTENT_ADMIN_DATE_LAN_15.$TDPOST.$TDPRE2.strftime("%d %b %Y", time()).$TDPOST.$TRPOST; + } + //end date + if($_POST['end_day'] != "none" && $_POST['end_month'] != "none" && $_POST['end_year'] != "none"){ + $CONTENT_CONTENT_PREVIEW_ENDDATE = $TRPRE.$TDPRE1.CONTENT_ADMIN_DATE_LAN_16.$TDPOST.$TDPRE2.$_POST['end_day']." ".$months[($_POST['end_month']-1)]." ".$_POST['end_year'].$TDPOST.$TRPOST; + }else{ + $CONTENT_CONTENT_PREVIEW_ENDDATE = $TRPRE.$TDPRE1.CONTENT_ADMIN_DATE_LAN_16.$TDPOST.$TDPRE2.CONTENT_ADMIN_ITEM_LAN_118." ".CONTENT_ADMIN_DATE_LAN_16." ".CONTENT_ADMIN_ITEM_LAN_119.$TDPOST.$TRPOST; + } + $CONTENT_CONTENT_PREVIEW_CUSTOM = ""; + + //custom tags + for($i=0;$i<$content_pref["content_admin_custom_number"];$i++){ + if($_POST["content_custom_key_{$i}"] != "" && $_POST["content_custom_value_{$i}"] != ""){ + $CONTENT_CONTENT_PREVIEW_CUSTOM .= $TRPRE.$TDPRE1.$_POST["content_custom_key_{$i}"].$TDPOST.$TDPRE2.$_POST["content_custom_value_{$i}"].$TDPOST.$TRPOST; + } + } + //custom preset tags + foreach($_POST['content_custom_preset_key'] as $k => $v){ + if($k != "" && $v != ""){ + $CONTENT_CONTENT_PREVIEW_CUSTOM .= $TRPRE.$TDPRE1.$k.$TDPOST.$TDPRE2.$v.$TDPOST.$TRPOST; + } + } + + //icon + if($_POST['content_icon'] && file_exists($content_tmppath_icon.$_POST['content_icon'])){ + $ICON = ""; + }elseif($_POST['content_icon'] && file_exists($content_icon_path.$_POST['content_icon'])){ + $ICON = ""; + }else{ + $ICON = CONTENT_ADMIN_ITEM_LAN_118." ".CONTENT_ADMIN_ITEM_LAN_114." ".CONTENT_ADMIN_ITEM_LAN_119; + } + $CONTENT_CONTENT_PREVIEW_ICON = $TRPRE.$TDPRE1.CONTENT_ADMIN_ITEM_LAN_114.$TDPOST.$TDPRE2.$ICON.$TDPOST.$TRPOST; + + //images and attachments + $file = FALSE; + $image = FALSE; + $ATTACH = $TRPRE.$TDPRE1.CONTENT_ADMIN_ITEM_LAN_24.$TDPOST.$TDPRE2; + $IMAGES = $TRPRE.$TDPRE1.CONTENT_ADMIN_ITEM_LAN_31.$TDPOST.$TDPRE2; + foreach($_POST as $k => $v){ + if(strpos($k, "content_files") === 0){ + if($v && file_exists($content_tmppath_file.$v)){ + $ATTACH .= CONTENT_ICON_FILE." ".$v."
    "; + $file = TRUE; + }elseif($v && file_exists($content_file_path.$v)){ + $ATTACH .= CONTENT_ICON_FILE." ".$v."
    "; + $file = TRUE; + } + } + if(strpos($k, "content_images") === 0){ + if($v && file_exists($content_tmppath_image.$v)){ + $IMAGES .= " "; + $image = TRUE; + }elseif($v && file_exists($content_image_path.$v)){ + $IMAGES .= " "; + $image = TRUE; + } + } + } + if($file !== TRUE){ + $ATTACH .= CONTENT_ADMIN_ITEM_LAN_118." ".CONTENT_ADMIN_ITEM_LAN_24." ".CONTENT_ADMIN_ITEM_LAN_119; + } + if($image !== TRUE){ + $IMAGES .= CONTENT_ADMIN_ITEM_LAN_118." ".CONTENT_ADMIN_ITEM_LAN_31." ".CONTENT_ADMIN_ITEM_LAN_119; + } + $CONTENT_CONTENT_PREVIEW_ATTACH = $ATTACH.$TDPOST.$TRPOST; + $CONTENT_CONTENT_PREVIEW_IMAGES = $IMAGES.$TDPOST.$TRPOST; + + $caption = CONTENT_ADMIN_ITEM_LAN_46." ".$_POST['content_heading']; + $preview = preg_replace("/\{(.*?)\}/e", '$\1', $CONTENT_CONTENT_PREVIEW); + $ns -> tablerender($caption, $preview); + } + + function show_create_content($mode, $userid="", $username=""){ + global $qs, $sql, $ns, $rs, $aa, $fl, $tp, $plugintable, $plugindir, $pref, $eArrayStorage; + global $message, $stylespacer, $TOPIC_ROW_SPACER, $TOPIC_ROW, $TOPIC_ROW_NOEXPAND; + + $months = array(CONTENT_ADMIN_DATE_LAN_0, CONTENT_ADMIN_DATE_LAN_1, CONTENT_ADMIN_DATE_LAN_2, CONTENT_ADMIN_DATE_LAN_3, CONTENT_ADMIN_DATE_LAN_4, CONTENT_ADMIN_DATE_LAN_5, CONTENT_ADMIN_DATE_LAN_6, CONTENT_ADMIN_DATE_LAN_7, CONTENT_ADMIN_DATE_LAN_8, CONTENT_ADMIN_DATE_LAN_9, CONTENT_ADMIN_DATE_LAN_10, CONTENT_ADMIN_DATE_LAN_11); + + //if create, first show category select (as preferences need to be loaded from the selected category) + if( $qs[1] == "create" && !isset($qs[2]) ){ + $text = " +
    + ".$rs -> form_open("post", e_SELF."?".e_QUERY."", "dataform", "", "enctype='multipart/form-data'")." + + "; + + $TOPIC_TOPIC = CONTENT_ADMIN_CAT_LAN_27; + $TOPIC_FIELD = $aa -> ShowOptionCat().$rs->form_hidden("parent", ""); + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW_NOEXPAND); + $text .= "
    ".CONTENT_ADMIN_MAIN_LAN_2."
    "; + $caption = CONTENT_ADMIN_MAIN_LAN_2; + $ns->tablerender($caption, $text); + return; + } + + if($mode == 'submit' || $mode=='contentmanager' || ($mode=='sa' && e_PAGE=='content_manager.php') ){ + $border = "border:1px solid #5d6e75;"; + $padding = "padding:6px;"; + $tableprop = "border-collapse: collapse; border-spacing:0px;"; + $TOPIC_ROW_NOEXPAND = " + + {TOPIC_TOPIC} + {TOPIC_FIELD} + "; + + $TOPIC_ROW = " + + {TOPIC_TOPIC} + + {TOPIC_HEADING} +
    +
    {TOPIC_HELP}

    + {TOPIC_FIELD} +
    + + "; + + $TOPIC_TITLE_ROW = "{TOPIC_CAPTION}"; + $TOPIC_ROW_SPACER = ""; + }else{ + $tableprop = ""; + $TOPIC_ROW_SPACER = ""; + } + + if($mode == "submit"){ + $mainparent = $aa -> getMainParent( intval($qs[2]) ); + $array = $aa -> getCategoryTree("", $mainparent, FALSE); + }else{ + $array = $aa -> getCategoryTree("", "", FALSE); + $mainparent = $aa -> getMainParent( (isset($qs[3]) && is_numeric($qs[3]) ? $qs[3] : intval($qs[2])) ); + } + + $content_pref = $aa -> getContentPref($mainparent); + + $content_pref["content_icon_path_tmp"] = ($content_pref["content_icon_path_tmp"] ? $content_pref["content_icon_path_tmp"] : $content_pref["content_icon_path"]."tmp/"); + $content_pref["content_file_path_tmp"] = ($content_pref["content_file_path_tmp"] ? $content_pref["content_file_path_tmp"] : $content_pref["content_file_path"]."tmp/"); + $content_pref["content_image_path_tmp"] = ($content_pref["content_image_path_tmp"] ? $content_pref["content_image_path_tmp"] : $content_pref["content_image_path"]."tmp/"); + $content_cat_icon_path_large = $tp -> replaceConstants($content_pref["content_cat_icon_path_large"]); + $content_cat_icon_path_small = $tp -> replaceConstants($content_pref["content_cat_icon_path_small"]); + $content_icon_path = $tp -> replaceConstants($content_pref["content_icon_path"]); + $content_image_path = $tp -> replaceConstants($content_pref["content_image_path"]); + $content_file_path = $tp -> replaceConstants($content_pref["content_file_path"]); + $content_tmppath_icon = $tp -> replaceConstants($content_pref["content_icon_path_tmp"]); + $content_tmppath_file = $tp -> replaceConstants($content_pref["content_file_path_tmp"]); + $content_tmppath_image = $tp -> replaceConstants($content_pref["content_image_path_tmp"]); + + if(!is_object($sql)){ $sql = new db; } + $sql2 = new db; + + //check submit permissions + if($mode == 'submit'){ + //check if current item exists (item is a (sub)category) + if($sql -> db_Select($plugintable, "content_id, content_heading, content_parent, content_pref", " content_id='".intval($qs[2])."' ")){ + //check submit perms from main parent + if($content_pref["content_submit"] && check_class($content_pref["content_submit_class"])){ + }else{ + header("location:".$plugindir."content_submit.php"); exit; + } + }else{ + header("location:".$plugindir."content_submit.php"); exit; + } + } + + //check manager permissions + if($mode == "contentmanager"){ + //get current item + if($sql -> db_Select($plugintable, "content_id, content_heading, content_parent, content_pref", " content_id='".intval($qs[2])."' ")){ + $rowpcm = $sql -> db_Fetch(); + + //if edit item (query holds item id) + if( isset($qs[1]) && $qs[1] == "edit" && is_numeric($qs[2]) ){ + //get parent + $sql2 -> db_Select($plugintable, "content_id, content_heading, content_parent, content_pref", " content_id='".$rowpcm['content_parent']."' "); + $rowpcm2 = $sql2 -> db_Fetch(); + $pcmcheckpref = $rowpcm2['content_pref']; + $p = $rowpcm['content_parent']; + //create item (query holds category id) + }else{ + $pcmcheckpref = $rowpcm['content_pref']; + $p = $qs[2]; + } + + $pcm_pref = $eArrayStorage->ReadArray($pcmcheckpref); + + //user is allowed to work here + if( (isset($pcm_pref["content_manager_personal"]) && check_class($pcm_pref["content_manager_personal"])) || (isset($pcm_pref["content_manager_category"]) && check_class($pcm_pref["content_manager_category"])) ){ + if($qs[1] == "edit"){ + //if personal manager, assign author query + if( isset($pcm_pref["content_manager_personal"]) && check_class($pcm_pref["content_manager_personal"]) ){ + if(isset($userid) && isset($username) ){ + $userid = intval($userid); + $l = strlen($userid)+1; + $userquery = " AND (content_author = '".$userid."' || LEFT(content_author, ".$l.") = '".$userid."^' OR SUBSTRING_INDEX(content_author, '^', 1) = '".$userid."' || content_author REGEXP '\\\^".$username."' ) "; + }else{ + $userquery = ""; + } + } + //if category manager, no author query is needed + if( isset($pcm_pref["content_manager_category"]) && check_class($pcm_pref["content_manager_category"]) ){ + $userquery = ""; + } + } + //user is not allowed to work here + }else{ + header("location:".$plugindir."content_manager.php"); exit; + } + } + + }else{ + $userquery = ""; + } + + //get preferences for submit page + if($mode == "submit"){ + $checksubheading = (isset($content_pref["content_submit_subheading"]) ? $content_pref["content_submit_subheading"] : ""); + $checksummary = (isset($content_pref["content_submit_summary"]) ? $content_pref["content_submit_summary"] : ""); + $checkstartdate = (isset($content_pref["content_submit_startdate"]) ? $content_pref["content_submit_startdate"] : ""); + $checkenddate = (isset($content_pref["content_submit_enddate"]) ? $content_pref["content_submit_enddate"] : ""); + $checkicon = (isset($content_pref["content_submit_icon"]) ? $content_pref["content_submit_icon"] : ""); + $checkattach = (isset($content_pref["content_submit_attach"]) ? $content_pref["content_submit_attach"] : ""); + $checkattachnumber = (isset($content_pref["content_submit_files_number"]) ? $content_pref["content_submit_files_number"] : ""); + $checkimages = (isset($content_pref["content_submit_images"]) ? $content_pref["content_submit_images"] : ""); + $checkimagesnumber = (isset($content_pref["content_submit_images_number"]) ? $content_pref["content_submit_images_number"] : ""); + $checkcomment = (isset($content_pref["content_submit_comment"]) ? $content_pref["content_submit_comment"] : ""); + $checkrating = (isset($content_pref["content_submit_rating"]) ? $content_pref["content_submit_rating"] : ""); + $checkscore = (isset($content_pref["content_submit_score"]) ? $content_pref["content_submit_score"] : ""); + $checkpe = (isset($content_pref["content_submit_pe"]) ? $content_pref["content_submit_pe"] : ""); + $checkvisibility = (isset($content_pref["content_submit_visibility"]) ? $content_pref["content_submit_visibility"] : ""); + $checkmeta = (isset($content_pref["content_submit_meta"]) ? $content_pref["content_submit_meta"] : ""); + $checkcustom = (isset($content_pref["content_submit_customtags"]) ? $content_pref["content_submit_customtags"] : ""); + $checkcustomnumber = (isset($content_pref["content_submit_custom_number"]) ? $content_pref["content_submit_custom_number"] : ""); + $checklayout = (isset($content_pref["content_submit_layout"]) ? $content_pref["content_submit_layout"] : ""); + $checkpreset = (isset($content_pref["content_submit_presettags"]) ? $content_pref["content_submit_presettags"] : ""); + + //get preferences for admin area; posted submitted item. + }elseif($mode == "sa"){ + + //show all preferences from the submit options. if submit pref is not set, check if create prefs are set and use those + $checksubheading = (isset($content_pref["content_submit_subheading"]) ? $content_pref["content_submit_subheading"] : (isset($content_pref["content_admin_subheading"]) ? $content_pref["content_admin_subheading"] : "")); + + $checksummary = (isset($content_pref["content_submit_summary"]) ? $content_pref["content_submit_summary"] : (isset($content_pref["content_admin_summary"]) ? $content_pref["content_admin_summary"] : "")); + + $checkstartdate = (isset($content_pref["content_submit_startdate"]) ? $content_pref["content_submit_startdate"] : (isset($content_pref["content_admin_startdate"]) ? $content_pref["content_admin_startdate"] : "")); + + $checkenddate = (isset($content_pref["content_submit_enddate"]) ? $content_pref["content_submit_enddate"] : (isset($content_pref["content_admin_enddate"]) ? $content_pref["content_admin_enddate"] : "")); + + $checkicon = (isset($content_pref["content_submit_icon"]) ? $content_pref["content_submit_icon"] : (isset($content_pref["content_admin_icon"]) ? $content_pref["content_admin_icon"] : "")); + + $checkattach = (isset($content_pref["content_submit_attach"]) ? $content_pref["content_submit_attach"] : (isset($content_pref["content_admin_attach"]) ? $content_pref["content_admin_attach"] : "")); + + $checkattachnumber = (isset($content_pref["content_submit_files_number"]) ? $content_pref["content_submit_files_number"] : (isset($content_pref["content_admin_files_number"]) ? $content_pref["content_admin_files_number"] : "")); + + $checkimages = (isset($content_pref["content_submit_images"]) ? $content_pref["content_submit_images"] : (isset($content_pref["content_admin_images"]) ? $content_pref["content_admin_images"] : "")); + + $checkimagesnumber = (isset($content_pref["content_submit_images_number"]) ? $content_pref["content_submit_images_number"] : (isset($content_pref["content_admin_images_number"]) ? $content_pref["content_admin_images_number"] : "")); + + $checkcomment = (isset($content_pref["content_submit_comment"]) ? $content_pref["content_submit_comment"] : (isset($content_pref["content_admin_comment"]) ? $content_pref["content_admin_comment"] : "")); + + $checkrating = (isset($content_pref["content_submit_rating"]) ? $content_pref["content_submit_rating"] : (isset($content_pref["content_admin_rating"]) ? $content_pref["content_admin_rating"] : "")); + + $checkscore = (isset($content_pref["content_submit_score"]) ? $content_pref["content_submit_score"] : (isset($content_pref["content_admin_score"]) ? $content_pref["content_admin_score"] : "")); + + $checkpe = (isset($content_pref["content_submit_pe"]) ? $content_pref["content_submit_pe"] : (isset($content_pref["content_admin_pe"]) ? $content_pref["content_admin_pe"] : "")); + + $checkvisibility = (isset($content_pref["content_submit_visibility"]) ? $content_pref["content_submit_visibility"] : (isset($content_pref["content_admin_visibility"]) ? $content_pref["content_admin_visibility"] : "")); + + $checkmeta = (isset($content_pref["content_submit_meta"]) ? $content_pref["content_submit_meta"] : (isset($content_pref["content_admin_meta"]) ? $content_pref["content_admin_meta"] : "")); + + $checkcustom = (isset($content_pref["content_submit_customtags"]) ? $content_pref["content_submit_customtags"] : (isset($content_pref["content_admin_customtags"]) ? $content_pref["content_admin_customtags"] : "")); + + $checkcustomnumber = (isset($content_pref["content_submit_custom_number"]) && $content_pref["content_submit_custom_number"] != "0" ? $content_pref["content_submit_custom_number"] : (isset($content_pref["content_admin_custom_number"]) ? $content_pref["content_admin_custom_number"] : "")); + + $checklayout = (isset($content_pref["content_submit_layout"]) ? $content_pref["content_submit_layout"] : (isset($content_pref["content_admin_layout"]) ? $content_pref["content_admin_layout"] : "")); + + $checkpreset = (isset($content_pref["content_submit_presettags"]) ? $content_pref["content_submit_presettags"] : (isset($content_pref["content_admin_presettags"]) ? $content_pref["content_admin_presettags"] : "")); + + //normal admin content create preferences + }else{ + + $checksubheading = (isset($content_pref["content_admin_subheading"]) ? $content_pref["content_admin_subheading"] : ""); + $checksummary = (isset($content_pref["content_admin_summary"]) ? $content_pref["content_admin_summary"] : ""); + $checkstartdate = (isset($content_pref["content_admin_startdate"]) ? $content_pref["content_admin_startdate"] : ""); + $checkenddate = (isset($content_pref["content_admin_enddate"]) ? $content_pref["content_admin_enddate"] : ""); + $checkicon = (isset($content_pref["content_admin_icon"]) ? $content_pref["content_admin_icon"] : ""); + $checkattach = (isset($content_pref["content_admin_attach"]) ? $content_pref["content_admin_attach"] : ""); + $checkattachnumber = (isset($content_pref["content_admin_files_number"]) ? $content_pref["content_admin_files_number"] : ""); + $checkimages = (isset($content_pref["content_admin_images"]) ? $content_pref["content_admin_images"] : ""); + $checkimagesnumber = (isset($content_pref["content_admin_images_number"]) ? $content_pref["content_admin_images_number"] : ""); + $checkcomment = (isset($content_pref["content_admin_comment"]) ? $content_pref["content_admin_comment"] : ""); + $checkrating = (isset($content_pref["content_admin_rating"]) ? $content_pref["content_admin_rating"] : ""); + $checkscore = (isset($content_pref["content_admin_score"]) ? $content_pref["content_admin_score"] : ""); + $checkpe = (isset($content_pref["content_admin_pe"]) ? $content_pref["content_admin_pe"] : ""); + $checkvisibility = (isset($content_pref["content_admin_visibility"]) ? $content_pref["content_admin_visibility"] : ""); + $checkmeta = (isset($content_pref["content_admin_meta"]) ? $content_pref["content_admin_meta"] : ""); + $checkcustom = (isset($content_pref["content_admin_customtags"]) ? $content_pref["content_admin_customtags"] : ""); + $checkcustomnumber = (isset($content_pref["content_admin_custom_number"]) ? $content_pref["content_admin_custom_number"] : ""); + $checklayout = (isset($content_pref["content_admin_layout"]) ? $content_pref["content_admin_layout"] : ""); + $checkpreset = (isset($content_pref["content_admin_presettags"]) ? $content_pref["content_admin_presettags"] : ""); + } + if($mode == "contentmanager"){ // used in contentmanager + $authordetails = $aa -> getAuthor(USERID); + } + if( !isset($authordetails) ){ + $authordetails = $aa -> getAuthor(USERID); + } + + if( ($qs[1] == "edit" || $qs[1] == "sa") && is_numeric($qs[2]) && !isset($_POST['preview_content']) && !isset($message)){ + if(!$sql -> db_Select($plugintable, "*", "content_id='".intval($qs[2])."' ".$userquery." ")){ + if($mode == "contentmanager"){ + header("location:".$plugindir."content_manager.php"); exit; + }else{ + header("location:".e_SELF."?content"); exit; + } + }else{ + $row = $sql -> db_Fetch(); + + $row['content_heading'] = $tp -> toForm($row['content_heading']); + $row['content_subheading'] = $tp -> toForm($row['content_subheading']); + $row['content_summary'] = $tp -> toForm($row['content_summary']); + $row['content_text'] = $tp -> toForm($row['content_text']); + $row['content_meta'] = $tp -> toForm($row['content_meta']); + $authordetails = $aa -> getAuthor($row['content_author']); + } + } + + if(isset($_POST['preview_content'])){ + $this -> ContentItemPreview(); + } + + //re-prepare the posted fields for the form (after preview) + if( isset($_POST['preview_content']) || isset($message) ){ + + $row['content_parent'] = $_POST['parent']; + $row['content_heading'] = $tp -> post_toForm($_POST['content_heading']); + $row['content_subheading'] = $tp -> post_toForm($_POST['content_subheading']); + $row['content_summary'] = $tp -> post_toForm($_POST['content_summary']); + $row['content_text'] = $tp -> post_toForm($_POST['content_text']); + $authordetails[0] = $_POST['content_author_id']; + $authordetails[1] = $_POST['content_author_name']; + $authordetails[2] = $_POST['content_author_email']; + $ne_day = $_POST['ne_day']; + $ne_month = $_POST['ne_month']; + $ne_year = $_POST['ne_year']; + $end_day = $_POST['end_day']; + $end_month = $_POST['end_month']; + $end_year = $_POST['end_year']; + $row['content_comment'] = $_POST['content_comment']; + $row['content_rate'] = $_POST['content_rate']; + $row['content_pe'] = $_POST['content_pe']; + $row['content_class'] = $_POST['content_class']; + $row['content_refer'] = $_POST['content_refer']; + $row['content_datestamp'] = $_POST['content_datestamp']; + $row['content_score'] = $_POST['content_score']; + $row['content_meta'] = $_POST['content_meta']; + $row['content_layout'] = $_POST['content_layout']; + $row['content_icon'] = $_POST['content_icon']; + + //images and attachments + foreach($_POST as $k => $v){ + if(strpos($k, "content_files") === 0){ + $row['content_file'] .= "[file]".$v; + } + if(strpos($k, "content_images") === 0){ + $row['content_image'] .= "[img]".$v; + } + } + //custom tags + for($i=0;$i<$content_pref["content_admin_custom_number"];$i++){ + $keystring = $tp -> post_toForm($_POST["content_custom_key_{$i}"]); + $custom["content_custom_{$keystring}"] = $tp -> post_toForm($_POST["content_custom_value_{$i}"]); + } + //preset tags + foreach($_POST['content_custom_preset_key'] as $k => $v){ + $k = $tp -> post_toForm($k); + $custom['content_custom_presettags'][$k] = $tp -> post_toForm($v); + } + } + + $content_author_id = (isset($authordetails[0]) && $authordetails[0] != "" ? $authordetails[0] : USERID); + $content_author_name = (isset($authordetails[1]) && $authordetails[1] != "" ? $authordetails[1] : USERNAME); + $content_author_email = (isset($authordetails[2]) ? $authordetails[2] : USEREMAIL); + + $formurl = e_SELF."?".e_QUERY; + $text = " +
    + ".$rs -> form_open("post", $formurl, "dataform", "", "enctype='multipart/form-data'")." + "; + + $hidden = ""; + if($mode == "contentmanager"){ + if($qs[1] == "edit"){ + $hidden .= $rs -> form_hidden("parent", $row['content_parent']); + }else{ + $hidden .= $rs -> form_hidden("parent", intval($qs[2])); + } + }else{ + if($mode == "submit"){ + $parent = "submit"; + }else{ + $parent = (isset($qs[3]) && is_numeric($qs[3]) ? $qs[3] : (isset($row['content_parent']) ? $row['content_parent'] : "") ); + } + //category parent + $TOPIC_TOPIC = CONTENT_ADMIN_CAT_LAN_27; + $TOPIC_FIELD = $aa -> ShowOptionCat($parent).$rs->form_hidden("parent", ""); + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW_NOEXPAND); + //$text .= $TOPIC_ROW_SPACER; + } + + //heading + $row['content_heading'] = (isset($row['content_heading']) ? $row['content_heading'] : ""); + $TOPIC_TOPIC = CONTENT_ADMIN_ITEM_LAN_11; + $TOPIC_FIELD = $rs -> form_text("content_heading", 74, $row['content_heading'], 250); + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW_NOEXPAND); + + if($checksubheading){ + //subheading + $row['content_subheading'] = (isset($row['content_subheading']) ? $row['content_subheading'] : ""); + $TOPIC_TOPIC = CONTENT_ADMIN_ITEM_LAN_16; + $TOPIC_FIELD = $rs -> form_text("content_subheading", 74, $row['content_subheading'], 250); + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW_NOEXPAND); + }else{ + $hidden .= $rs -> form_hidden("content_subheading", $row['content_subheading']); + } + + if($checksummary){ + //summary + $row['content_summary'] = (isset($row['content_summary']) ? $row['content_summary'] : ""); + $TOPIC_TOPIC = CONTENT_ADMIN_ITEM_LAN_17; + $TOPIC_FIELD = $rs -> form_textarea("content_summary", 74, 5, $row['content_summary']); + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW_NOEXPAND); + }else{ + $hidden .= $rs -> form_hidden("content_summary", $row['content_summary']); + } + + //text + if(e_WYSIWYG){ + $row['content_text'] = $tp->replaceConstants($row['content_text'], true); + } + require_once(e_HANDLER."ren_help.php"); + $TOPIC_TOPIC = CONTENT_ADMIN_ITEM_LAN_18; + $insertjs = (!e_WYSIWYG) ? "onselect='storeCaret(this);' onclick='storeCaret(this);' onkeyup='storeCaret(this);'": ""; + $TOPIC_FIELD = $rs -> form_textarea("content_text", 74, 20, $row['content_text'], $insertjs)."
    "; + if (!$pref['wysiwyg']) { $TOPIC_FIELD .= $rs -> form_text("helpb", 90, '', '', "helpbox")."
    ".display_help("helpb"); } + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW_NOEXPAND); + + //author + $content_author_name_value = ($content_author_name ? $content_author_name : CONTENT_ADMIN_ITEM_LAN_14); + $content_author_name_js = ($content_author_name ? "" : "onfocus=\"if(document.getElementById('dataform').content_author_name.value=='".CONTENT_ADMIN_ITEM_LAN_14."'){document.getElementById('dataform').content_author_name.value='';}\""); + $content_author_email_value = ($content_author_email ? $content_author_email : CONTENT_ADMIN_ITEM_LAN_15); + $content_author_email_js = ($content_author_email ? "" : "onfocus=\"if(document.getElementById('dataform').content_author_email.value=='".CONTENT_ADMIN_ITEM_LAN_15."'){document.getElementById('dataform').content_author_email.value='';}\""); + + $TOPIC_TOPIC = CONTENT_ADMIN_ITEM_LAN_51; + $TOPIC_FIELD = "(".CONTENT_ADMIN_ITEM_LAN_71.")
    +
    + +
    ".CONTENT_ADMIN_ITEM_LAN_14."".$rs -> form_text("content_author_name", 70, $content_author_name_value, 100, "tbox", "", "", $content_author_name_js )."
    ".CONTENT_ADMIN_ITEM_LAN_15."".$rs -> form_text("content_author_email", 70, $content_author_email_value, 100, "tbox", "", "", $content_author_email_js )." + ".$rs -> form_hidden("content_author_id", $content_author_id)." +
    "; + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW_NOEXPAND); + + if(isset($row['content_datestamp']) && $row['content_datestamp'] != "0" && $row['content_datestamp'] != ""){ + $startdate = getdate($row['content_datestamp']); + $ne_day = $startdate['mday']; + $ne_month = $startdate['mon']; + $ne_year = $startdate['year']; + }else{ + $ne_day = (isset($ne_day) ? $ne_day : "0"); + $ne_month = (isset($ne_month) ? $ne_month : "0"); + $ne_year = (isset($ne_year) ? $ne_year : "0"); + } + + $smarray = getdate(); + $current_year = $smarray['year']; + + if($checkstartdate){ + //start date + $TOPIC_TOPIC = CONTENT_ADMIN_DATE_LAN_15; + $TOPIC_HEADING = CONTENT_ADMIN_ITEM_LAN_73; + $TOPIC_HELP = CONTENT_ADMIN_DATE_LAN_17; + $TOPIC_FIELD = " + ".$rs -> form_select_open("ne_day")." + ".$rs -> form_option(CONTENT_ADMIN_DATE_LAN_12, 0, "none"); + for($count=1; $count<=31; $count++){ + $TOPIC_FIELD .= $rs -> form_option($count, (isset($ne_day) && $ne_day == $count ? "1" : "0"), $count); + } + $TOPIC_FIELD .= $rs -> form_select_close()." + ".$rs -> form_select_open("ne_month")." + ".$rs -> form_option(CONTENT_ADMIN_DATE_LAN_13, 0, "none"); + for($count=1; $count<=12; $count++){ + $TOPIC_FIELD .= $rs -> form_option($months[($count-1)], (isset($ne_month) && $ne_month == $count ? "1" : "0"), $count); + } + $TOPIC_FIELD .= $rs -> form_select_close()." + ".$rs -> form_select_open("ne_year")." + ".$rs -> form_option(CONTENT_ADMIN_DATE_LAN_14, 0, "none"); + for($count=($current_year-5); $count<=($current_year+1); $count++){ + $TOPIC_FIELD .= $rs -> form_option($count, (isset($ne_year) && $ne_year == $count ? "1" : "0"), $count); + } + $TOPIC_FIELD .= $rs -> form_select_close()." + "; + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW); + }else{ + $hidden .= $rs -> form_hidden("ne_day", $ne_day); + $hidden .= $rs -> form_hidden("ne_month", $ne_month); + $hidden .= $rs -> form_hidden("ne_year", $ne_year); + } + + + if(isset($row['content_enddate']) && $row['content_enddate'] != "0" && $row['content_enddate'] != ""){ + $enddate = getdate($row['content_enddate']); + $end_day = $enddate['mday']; + $end_month = $enddate['mon']; + $end_year = $enddate['year']; + }else{ + $end_day = (isset($end_day) ? $end_day : "0"); + $end_month = (isset($end_month) ? $end_month : "0"); + $end_year = (isset($end_year) ? $end_year : "0"); + } + + if($checkenddate){ + //end date + $TOPIC_TOPIC = CONTENT_ADMIN_DATE_LAN_16; + $TOPIC_HEADING = CONTENT_ADMIN_ITEM_LAN_74; + $TOPIC_HELP = CONTENT_ADMIN_DATE_LAN_18; + $TOPIC_FIELD = " + ".$rs -> form_select_open("end_day")." + ".$rs -> form_option(CONTENT_ADMIN_DATE_LAN_12, 0, "none"); + for($count=1; $count<=31; $count++){ + $TOPIC_FIELD .= $rs -> form_option($count, (isset($end_day) && $end_day == $count ? "1" : "0"), $count); + } + $TOPIC_FIELD .= $rs -> form_select_close()." + ".$rs -> form_select_open("end_month")." + ".$rs -> form_option(CONTENT_ADMIN_DATE_LAN_13, 0, "none"); + for($count=1; $count<=12; $count++){ + $TOPIC_FIELD .= $rs -> form_option($months[($count-1)], (isset($end_month) && $end_month == $count ? "1" : "0"), $count); + } + $TOPIC_FIELD .= $rs -> form_select_close()." + ".$rs -> form_select_open("end_year")." + ".$rs -> form_option(CONTENT_ADMIN_DATE_LAN_14, 0, "none"); + for($count=($current_year-5); $count<=($current_year+1); $count++){ + $TOPIC_FIELD .= $rs -> form_option($count, (isset($end_year) && $end_year == $count ? "1" : "0"), $count); + } + $TOPIC_FIELD .= $rs -> form_select_close()." + "; + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW); + }else{ + $hidden .= $rs -> form_hidden("end_day", $end_day); + $hidden .= $rs -> form_hidden("end_month", $end_month); + $hidden .= $rs -> form_hidden("end_year", $end_year); + } + + //$text .= $TOPIC_ROW_SPACER; + if( $checkicon || $checkattach || $checkimages ){ + //$text .= $TOPIC_ROW_SPACER; + + //upload icon + $TOPIC_TOPIC = CONTENT_ADMIN_ITEM_LAN_104; + $TOPIC_HEADING = CONTENT_ADMIN_ITEM_LAN_112; + $TOPIC_HELP = CONTENT_ADMIN_ITEM_LAN_113; + + $rejectlist = array('$.','$..','/','CVS','thumbs.db','Thumbs.db','*._$', 'index', 'null*', 'thumb_*'); + $iconlist = $fl->get_files($content_tmppath_icon,"",$rejectlist); + $filelist = $fl->get_files($content_tmppath_file,"",$rejectlist); + $imagelist = $fl->get_files($content_tmppath_image,"",$rejectlist); + + $TOPIC_FIELD = ""; + if(!FILE_UPLOADS){ + $TOPIC_FIELD .= "".CONTENT_ADMIN_ITEM_LAN_21.""; + }else{ + if(!is_writable($content_tmppath_icon)){ + $TOPIC_FIELD .= "".CONTENT_ADMIN_ITEM_LAN_22." ".$content_tmppath_icon." ".CONTENT_ADMIN_ITEM_LAN_23."
    "; + } + if(!is_writable($content_tmppath_file)){ + $TOPIC_FIELD .= "".CONTENT_ADMIN_ITEM_LAN_22." ".$content_tmppath_file." ".CONTENT_ADMIN_ITEM_LAN_23."
    "; + } + if(!is_writable($content_tmppath_image)){ + $TOPIC_FIELD .= "".CONTENT_ADMIN_ITEM_LAN_22." ".$content_tmppath_image." ".CONTENT_ADMIN_ITEM_LAN_23."
    "; + } + $js = "onclick=\"document.getElementById('parent').value = document.getElementById('parent1').options[document.getElementById('parent1').selectedIndex].label;\" "; + $TOPIC_FIELD .= "
    + + ".$rs -> form_select_open("uploadtype")." + ".($checkicon ? $rs -> form_option(CONTENT_ADMIN_ITEM_LAN_114, "0", "1") : '')." + ".($checkattach ? $rs -> form_option(CONTENT_ADMIN_ITEM_LAN_115, "0", "2") : '')." + ".($checkimages ? $rs -> form_option(CONTENT_ADMIN_ITEM_LAN_116, "0", "3") : '')." + ".$rs -> form_select_close()." + + + + "; + } + $TOPIC_FIELD .= "
    "; + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW); + } + + if($checkicon){ + //icon + $row['content_icon'] = (isset($row['content_icon']) ? $row['content_icon'] : ""); + $TOPIC_TOPIC = CONTENT_ADMIN_ITEM_LAN_20; + $TOPIC_HEADING = CONTENT_ADMIN_ITEM_LAN_75; + $TOPIC_HELP = ""; + $TOPIC_FIELD = " + ".$rs -> form_text("content_icon", 60, $row['content_icon'], 100)." + ".$rs -> form_button("button", '', CONTENT_ADMIN_ITEM_LAN_105, "onclick=\"expandit('divicon')\"")." + "; + + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW); + }else{ + $hidden .= $rs -> form_hidden("content_icon", $row['content_icon']); + } + + if($checkattach){ + //file + $TOPIC_TOPIC = CONTENT_ADMIN_ITEM_LAN_24; + $TOPIC_HEADING = CONTENT_ADMIN_ITEM_LAN_76; + $TOPIC_HELP = ""; + $TOPIC_FIELD = ""; + $filetmp = explode("[file]", $row['content_file']); + foreach($filetmp as $key => $value) { + if($value == "") { + unset($filetmp[$key]); + } + } + $attachments = array_values($filetmp); + for($i=0;$i<$checkattachnumber;$i++){ + $k=$i+1; + $num = (strlen($k) == 1 ? "0".$k : $k); + $attachments[$i] = ($attachments[$i] ? $attachments[$i] : ""); + + //choose file + $TOPIC_FIELD .= " +
    + ".$num." ".$rs -> form_text("content_files".$i."", 60, $attachments[$i], 100)." + ".$rs -> form_button("button", '', CONTENT_ADMIN_ITEM_LAN_105, "onclick=\"expandit('divfile".$i."')\"")." +
    "; + } + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW); + }else{ + $hidden .= $rs -> form_hidden("content_file", $row['content_file']); + } + + if($checkimages){ + //image + $TOPIC_TOPIC = CONTENT_ADMIN_ITEM_LAN_31; + $TOPIC_HEADING = CONTENT_ADMIN_ITEM_LAN_77; + $TOPIC_HELP = ""; + $TOPIC_FIELD = ""; + $imagestmp = explode("[img]", $row['content_image']); + foreach($imagestmp as $key => $value) { + if($value == "") { + unset($imagestmp[$key]); + } + } + $imagesarray = array_values($imagestmp); + for($i=0;$i<$checkimagesnumber;$i++){ + $k=$i+1; + $num = (strlen($k) == 1 ? "0".$k : $k); + $imagesarray[$i] = ($imagesarray[$i] ? $imagesarray[$i] : ""); + + //choose image + $TOPIC_FIELD .= " +
    + ".$num." ".$rs -> form_text("content_images".$i."", 60, $imagesarray[$i], 100)." + ".$rs -> form_button("button", '', CONTENT_ADMIN_ITEM_LAN_105, "onclick=\"expandit('divimage".$i."')\"")." +
    "; + } + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW); + }else{ + $hidden .= $rs -> form_hidden("content_image", $row['content_image']); + } + + if($checkcomment || $checkrating || $checkpe || $checkvisibility || $checkscore || $checkmeta || $checklayout ){ + //$text .= $TOPIC_ROW_SPACER; + } + if($checkcomment){ + //comment + $row['content_comment'] = (isset($row['content_comment']) ? $row['content_comment'] : ""); + $TOPIC_TOPIC = CONTENT_ADMIN_ITEM_LAN_36; + $TOPIC_FIELD = " + ".$rs -> form_radio("content_comment", "1", ($row['content_comment'] ? "1" : "0"), "", "").CONTENT_ADMIN_ITEM_LAN_85." + ".$rs -> form_radio("content_comment", "0", ($row['content_comment'] ? "0" : "1"), "", "").CONTENT_ADMIN_ITEM_LAN_86." + "; + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW_NOEXPAND); + }else{ + $hidden .= $rs -> form_hidden("content_comment", $row['content_comment']); + } + + if($checkrating){ + //rating + $row['content_rate'] = (isset($row['content_rate']) ? $row['content_rate'] : ""); + $TOPIC_TOPIC = CONTENT_ADMIN_ITEM_LAN_37; + $TOPIC_FIELD = " + ".$rs -> form_radio("content_rate", "1", ($row['content_rate'] ? "1" : "0"), "", "").CONTENT_ADMIN_ITEM_LAN_85." + ".$rs -> form_radio("content_rate", "0", ($row['content_rate'] ? "0" : "1"), "", "").CONTENT_ADMIN_ITEM_LAN_86." + "; + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW_NOEXPAND); + }else{ + $hidden .= $rs -> form_hidden("content_rate", $row['content_rate']); + } + + if($checkpe){ + //print/email/pdf icons + $row['content_pe'] = (isset($row['content_pe']) ? $row['content_pe'] : ""); + $TOPIC_TOPIC = CONTENT_ADMIN_ITEM_LAN_38; + $TOPIC_FIELD = " + ".$rs -> form_radio("content_pe", "1", ($row['content_pe'] ? "1" : "0"), "", "").CONTENT_ADMIN_ITEM_LAN_85." + ".$rs -> form_radio("content_pe", "0", ($row['content_pe'] ? "0" : "1"), "", "").CONTENT_ADMIN_ITEM_LAN_86." + "; + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW_NOEXPAND); + }else{ + $hidden .= $rs -> form_hidden("content_pe", $row['content_pe']); + } + + if($checkvisibility){ + //userclass + $row['content_class'] = (isset($row['content_class']) ? $row['content_class'] : ""); + $TOPIC_TOPIC = CONTENT_ADMIN_ITEM_LAN_39; + $TOPIC_FIELD = r_userclass("content_class",$row['content_class'], "CLASSES"); + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW_NOEXPAND); + }else{ + $hidden .= $rs -> form_hidden("content_class", $row['content_class']); + } + + if($checkscore){ + //score + $TOPIC_TOPIC = CONTENT_ADMIN_ITEM_LAN_40; + $TOPIC_FIELD = " + ".$rs -> form_select_open("content_score")." + ".$rs -> form_option(CONTENT_ADMIN_ITEM_LAN_41, 0, "none"); + for($a=1; $a<=100; $a++){ + $TOPIC_FIELD .= $rs -> form_option($a, ($row['content_score'] == $a ? "1" : "0"), $a); + } + $TOPIC_FIELD .= $rs -> form_select_close(); + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW_NOEXPAND); + }else{ + $hidden .= $rs -> form_hidden("content_score", $row['content_score']); + } + + if($checkmeta){ + //meta + $TOPIC_TOPIC = CONTENT_ADMIN_ITEM_LAN_53; + $TOPIC_FIELD = CONTENT_ADMIN_ITEM_LAN_70."
    ".$rs -> form_text("content_meta", 74, $row['content_meta'], 250); + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW_NOEXPAND); + }else{ + $hidden .= $rs -> form_hidden("content_meta", $row['content_meta']); + } + + if($checklayout){ + global $fl; + + if(!isset($content_pref["content_theme"])){ + $dir = $plugindir."templates/default"; + }else{ + if(is_readable($tp->replaceConstants($content_pref["content_theme"])."content_content_template.php")){ + $dir = $tp->replaceConstants($content_pref["content_theme"]); + }else{ + $dir = $plugindir."templates/default"; + } + } + //get_files($path, $fmask = '', $omit='standard', $recurse_level = 0, $current_level = 0, $dirs_only = FALSE) + $rejectlist = array('$.','$..','/','CVS','thumbs.db','Thumbs.db','*._$', 'index', 'null*', '.bak'); + $templatelist = $fl->get_files($dir,"content_content",$rejectlist); + + //template + $check = ""; + if(isset($row['content_layout']) && $row['content_layout'] != ""){ + $check = $row['content_layout']; + }else{ + if(isset($content_pref["content_layout"])){ + $check = $content_pref["content_layout"]; + } + } + $TOPIC_TOPIC = CONTENT_ADMIN_ITEM_LAN_92; + $TOPIC_FIELD = " + ".$rs -> form_select_open("content_layout")." + ".$rs -> form_option(CONTENT_ADMIN_ITEM_LAN_94, 0, "none"); + foreach($templatelist as $template){ + $templatename = substr($template['fname'], 25, -4); + $templatename = ($template['fname'] == "content_content_template.php" ? "default" : $templatename); + $TOPIC_FIELD .= $rs -> form_option($templatename, ($check == $template['fname'] ? "1" : "0"), $template['fname']); + } + $TOPIC_FIELD .= $rs -> form_select_close(); + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW_NOEXPAND); + }else{ + $hidden .= $rs -> form_hidden("content_layout", $row['content_layout']); + } + + if( $checkcustom && $checkcustomnumber ){ + //$text .= $TOPIC_ROW_SPACER; + } + + if(!(isset($_POST['preview_content']) || isset($message))){ + if(isset($row['content_pref']) && $row['content_pref']){ + $custom = $eArrayStorage->ReadArray($row['content_pref']); + } + } + + //custom data + $existing_custom = "0"; + $TOPIC_TOPIC = CONTENT_ADMIN_ITEM_LAN_54; + $TOPIC_HEADING = CONTENT_ADMIN_ITEM_LAN_84; + $TOPIC_HELP = CONTENT_ADMIN_ITEM_LAN_68; + $TOPIC_CHECK_VALID = FALSE; + $TOPIC_FIELD = ""; + if($checkcustom && $checkcustomnumber){ $TOPIC_FIELD = ""; } + if(!empty($custom)){ + foreach($custom as $k => $v){ + if(substr($k,0,22) != "content_custom_preset_" && $k != "content_custom_presettags"){ + $key = substr($k,15); + + $key = $tp -> post_toForm($key); + $v = $tp -> post_toForm($v); + + if($checkcustom && $checkcustomnumber){ + $TOPIC_FIELD .= " + + + + "; + }else{ + $TOPIC_FIELD .= " + ".$rs -> form_hidden("content_custom_key_".$existing_custom, $key)." + ".$rs -> form_hidden("content_custom_value_".$existing_custom, $v); + $TOPIC_CHECK_VALID = TRUE; + } + $existing_custom = $existing_custom + 1; + } + } + } + + if($checkcustom && $checkcustomnumber){ + $TOPIC_CHECK_VALID = TRUE; + for($i=$existing_custom;$i<$checkcustomnumber;$i++){ + $TOPIC_FIELD .= " + + + + "; + } + } + if($checkcustom && $checkcustomnumber){ $TOPIC_FIELD .= "
    ".$rs -> form_text("content_custom_key_".$existing_custom."", 20, $key, 100)."".$rs -> form_text("content_custom_value_".$existing_custom."", 70, $v, 250)."
    ".$rs -> form_text("content_custom_key_".$i."", 20, "", 100)."".$rs -> form_text("content_custom_value_".$i."", 70, "", 250)."
    "; } + if($TOPIC_CHECK_VALID){ $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW); } + + //preset custom data fields + if(count($content_pref["content_custom_preset_key"]) > 0){ + //$text .= $TOPIC_ROW_SPACER; + } + + for($i=0;$i parseCustomPresetTag($content_pref["content_custom_preset_key"][$i], $custom['content_custom_presettags']); + }else{ + $tmp = explode("^", $content_pref["content_custom_preset_key"][$i]); + if(is_array($custom['content_custom_presettags'][$tmp[0]])){ + $tmp[0] = $tp -> post_toForm($tmp[0]); + $hidden .= $rs -> form_hidden("content_custom_preset_key[$tmp[0]][day]", $custom['content_custom_presettags'][$tmp[0]][day]); + $hidden .= $rs -> form_hidden("content_custom_preset_key[$tmp[0]][month]", $custom['content_custom_presettags'][$tmp[0]][month]); + $hidden .= $rs -> form_hidden("content_custom_preset_key[$tmp[0]][year]", $custom['content_custom_presettags'][$tmp[0]][year]); + }else{ + $tmp[0] = $tp -> post_toForm($tmp[0]); + $hidden .= $rs -> form_hidden("content_custom_preset_key[$tmp[0]]", $custom['content_custom_presettags'][$tmp[0]]); + } + } + } + } + + $text .= $TOPIC_ROW_SPACER." + + ".($hidden ? $hidden : ""); + + $js = "onclick=\"document.getElementById('parent').value = document.getElementById('parent1').options[document.getElementById('parent1').selectedIndex].label;\" "; + if($qs[1] == "edit" || $qs[1] == "sa" || isset($_POST['editp']) ){ + if($qs[1] == "sa"){ + $text .= $rs -> form_hidden("content_refer", $row['content_refer']); + } + $text .= $rs -> form_hidden("content_datestamp", $row['content_datestamp']); + $text .= $rs -> form_button("submit", "preview_content", (isset($_POST['preview_content']) ? CONTENT_ADMIN_MAIN_LAN_27 : CONTENT_ADMIN_MAIN_LAN_26), $js); + $text .= $rs -> form_button("submit", "update_content", ($qs[1] == "sa" ? CONTENT_ADMIN_ITEM_LAN_43 : CONTENT_ADMIN_ITEM_LAN_45), $js ); + $text .= $rs -> form_hidden("content_id", $qs[2]); + $text .= $rs -> form_checkbox("update_datestamp", 1, 0)." ".CONTENT_ADMIN_ITEM_LAN_42; + }else{ + $text .= $rs -> form_button("submit", "preview_content", (isset($_POST['preview_content']) ? CONTENT_ADMIN_MAIN_LAN_27 : CONTENT_ADMIN_MAIN_LAN_26), $js); + $text .= $rs -> form_button("submit", "create_content", CONTENT_ADMIN_ITEM_LAN_44, $js); + } + $text .= " + + + + + +
    "; + + $caption = ($qs[1] == "edit" ? CONTENT_ADMIN_ITEM_LAN_45 : CONTENT_ADMIN_ITEM_LAN_44); + $ns -> tablerender($caption, $text); + } + + + function parseCustomPresetTag($tag, $values){ + global $rs, $TOPIC_ROW_NOEXPAND, $months, $tp; + + $tmp = explode("^", $tag); + + $str = ""; + if($tmp[1] == "text"){ + $str = $rs -> form_text("content_custom_preset_key[{$tmp[0]}]", $tmp[2], $tp -> post_toForm($values[$tmp[0]]), $tmp[3], "tbox", "", "", ""); + + }elseif($tmp[1] == "area"){ + $str = $rs -> form_textarea("content_custom_preset_key[{$tmp[0]}]", $tmp[2], $tmp[3], $tp -> post_toForm($values[$tmp[0]]), "", "", "", "", ""); + + }elseif($tmp[1] == "select"){ + $str = $rs -> form_select_open("content_custom_preset_key[{$tmp[0]}]", ""); + $str .= $rs -> form_option($tmp[2], ($values[$tmp[0]] == $tmp[2] ? "1" : "0"), "", ""); + for($i=3;$i post_toForm($tmp[$i]); + $str .= $rs -> form_option($tmp[$i], ($values[$tmp[0]] == $tmp[$i] ? "1" : "0"), $tmp[$i], ""); + } + $str .= $rs -> form_select_close(); + + }elseif($tmp[1] == "date"){ + $str = $rs -> form_select_open("content_custom_preset_key[{$tmp[0]}][day]", "")." + ".$rs -> form_option(CONTENT_ADMIN_DATE_LAN_12, "0", ""); + for($i=1;$i<=31;$i++){ + $str .= $rs -> form_option($i, ($values[$tmp[0]]['day'] == $i ? "1" : "0"), $i, ""); + } + $str .= $rs -> form_select_close(); + + $str .= $rs -> form_select_open("content_custom_preset_key[{$tmp[0]}][month]", "")." + ".$rs -> form_option(CONTENT_ADMIN_DATE_LAN_13, "0", ""); + for($i=1;$i<=12;$i++){ + $str .= $rs -> form_option($months[($i-1)], ($values[$tmp[0]]['month'] == $i ? "1" : "0"), $i, ""); + } + $str .= $rs -> form_select_close(); + + $str .= $rs -> form_select_open("content_custom_preset_key[{$tmp[0]}][year]", "")." + ".$rs -> form_option(CONTENT_ADMIN_DATE_LAN_14, "0", ""); + for($i=$tmp[2];$i<=$tmp[3];$i++){ + $str .= $rs -> form_option($i, ($values[$tmp[0]]['year'] == $i ? "1" : "0"), $i, ""); + } + $str .= $rs -> form_select_close(); + + }elseif($tmp[1] == "radio"){ + for($i=2;$i form_radio("content_custom_preset_key[{$tmp[0]}]", $tmp[$i], ($values[$tmp[0]] == $tmp[$i] ? "1" : "0"), "", "")." ".$tmp[$i]; + $i++; + } + + }elseif($tmp[1] == "checkbox"){ + $str = $rs -> form_checkbox("content_custom_preset_key[{$tmp[0]}]", $tp -> post_toForm($tmp[2]), ($values[$tmp[0]] == $tmp[2] ? "1" : "0"), "", ""); + } + + $TOPIC_TOPIC = $tmp[0]; + $TOPIC_FIELD = $str; + $text = preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW_NOEXPAND); + + return $text; + } + + + + function show_manage_content($mode, $userid="", $username=""){ + global $qs, $sql, $ns, $rs, $aa, $plugintable, $plugindir, $tp, $eArrayStorage; + + if($mode != "contentmanager"){ + //category parent + global $TOPIC_TOPIC, $TOPIC_FIELD, $TOPIC_ROW_NOEXPAND; + $TOPIC_TOPIC = CONTENT_ADMIN_CAT_LAN_27; + $parent = (is_numeric($qs[1]) ? $qs[1] : ""); + $TOPIC_FIELD = $aa -> ShowOptionCat($parent).$rs->form_hidden("parent", ""); + $text = "
    + "; + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW_NOEXPAND); + $text .= "
    ".CONTENT_ADMIN_MAIN_LAN_2."
    "; + $caption = CONTENT_ADMIN_MAIN_LAN_2; + $ns -> tablerender($caption, $text); + } + + if(!isset($qs[1])){ + return; + } + + $mainparent = $aa -> getMainParent($qs[1]); + $content_pref = $aa -> getContentPref($mainparent); + $content_cat_icon_path_large = $tp -> replaceConstants($content_pref["content_cat_icon_path_large"]); + $content_cat_icon_path_small = $tp -> replaceConstants($content_pref["content_cat_icon_path_small"]); + $content_icon_path = $tp -> replaceConstants($content_pref["content_icon_path"]); + $content_image_path = $tp -> replaceConstants($content_pref["content_image_path"]); + $content_file_path = $tp -> replaceConstants($content_pref["content_file_path"]); + + if($mode == "contentmanager"){ + $personalmanagercheck = FALSE; + if($sql -> db_Select($plugintable, "content_id, content_heading, content_pref", " content_id='".intval($qs[1])."' ")){ + $rowpcm = $sql -> db_Fetch(); + $curpref = $eArrayStorage->ReadArray($rowpcm['content_pref']); + + //only show personal items + if( isset($curpref["content_manager_personal"]) && check_class($curpref["content_manager_personal"]) ){ + $l = strlen($userid)+1; + $qryuser = " AND (content_author = '".$userid."' || LEFT(content_author, ".$l.") = '".$userid."^' OR SUBSTRING_INDEX(content_author, '^', 1) = '".$userid."' || content_author REGEXP '\\\^".$username."' ) "; + $personalmanagercheck = TRUE; + } + //show all items in this category + if(isset($curpref["content_manager_category"]) && check_class($curpref["content_manager_category"]) ){ + $qryuser = ''; + $personalmanagercheck = TRUE; + } + } + if($personalmanagercheck == TRUE){ + /* + $qryuser = ""; + if(getperms("0")){ + $userid = USERID; + $username = USERNAME; + }else{ + //use user restriction (personal admin) + if(isset($userid) && isset($username) ){ + $userid = intval($userid); + $qryuser = " AND (content_author = '".$userid."' OR SUBSTRING_INDEX(content_author, '^', 1) = '".$userid."' OR SUBSTRING_INDEX(content_author, '^', 2) = '".$userid."^".$username."' OR content_author REGEXP '".$username."' )"; + + //$qryuser = " AND (content_author = '".$userid."' || LEFT(content_author, ".$l.") = '".$userid."^' OR SUBSTRING_INDEX(content_author, '^', 1) = '".$userid."' || content_author REGEXP '\\\^".$username."' ) "; + } + } + */ + $formtarget = $plugindir."content_manager.php?content.".intval($qs[1]); + $qrycat = " content_parent = '".intval($qs[1])."' "; + $qryfirst = " content_parent = '".intval($qs[1])."' "; + $qryletter = ""; + + }else{ + header("location:".$plugindir."content_manager.php"); exit; + } + }else{ + $array = $aa -> getCategoryTree("", intval($qs[1]), TRUE); + $validparent = implode(",", array_keys($array)); + $qrycat = " content_parent REGEXP '".$aa -> CONTENTREGEXP($validparent)."' "; + $qryuser = ""; + if( !(isset($qs[2]) && is_numeric($qs[2])) ){ + $formtarget = e_SELF."?content.".intval($qs[1]); + $qryfirst = " ".$qrycat." "; + $qryletter = ""; + } + } + + $text = ""; + // -------- SHOW FIRST LETTERS FIRSTNAMES ------------------------------------ + if(!is_object($sql)){ $sql = new db; } + $distinctfirstletter = $sql -> db_Select($plugintable, " DISTINCT(content_heading) ", "content_refer != 'sa' AND ".$qryfirst." ".$qryuser." ORDER BY content_heading ASC "); + while($row = $sql -> db_Fetch()){ + $head = $tp->toHTML($row['content_heading'], TRUE); + if(ord($head) < 128) { + $head_sub = strtoupper(substr($head,0,1)); + }else{ + $head_sub = substr($head,0,2); + } + $arrletters[] = $head_sub; + } + $arrletters = array_unique($arrletters); + $arrletters = array_values($arrletters); + sort($arrletters); + + if ($distinctfirstletter == 0){ + $text .= "
    ".CONTENT_ADMIN_ITEM_LAN_4."
    "; + $ns -> tablerender(CONTENT_ADMIN_ITEM_LAN_5, $text); + return; + + }elseif ($distinctfirstletter != 1){ + + $text .= " +
    +
    + + + + +
    ".CONTENT_ADMIN_ITEM_LAN_6."
    "; + for($i=0;$i"; + } + } + $text .= " + +
    +
    +
    "; + } + // --------------------------------------------------------------------------- + + // -------- CHECK FOR FIRST LETTER SUBMISSION -------------------------------- + $letter=(isset($_POST['letter']) ? $_POST['letter'] : ""); + if ($letter != "" && $letter != "all" ) { $qryletter .= " AND content_heading LIKE '".$tp->toDB($letter)."%' "; }else{ $qryletter .= ""; } + + $qryitem = " ".$qrycat." AND content_refer != 'sa' ".$qryletter." ".$qryuser." ORDER BY content_datestamp DESC"; + // --------------------------------------------------------------------------- + + $sql2 = new db; + if(!$content_total = $sql2 -> db_Select($plugintable, "content_id, content_heading, content_subheading, content_author, content_icon", $qryitem)){ + $text .= "
    ".CONTENT_ADMIN_ITEM_LAN_4."
    "; + }else{ + if($content_total < 50 || (isset($letter) && $letter!='') ){ + $text .= " +
    + ".$rs -> form_open("post", e_SELF."?".e_QUERY, "deletecontentform","","", "")." + + + + + + + + "; + while($row = $sql2 -> db_Fetch()){ + $delete_heading = str_replace("'", "\'", $row['content_heading']); + $authordetails = $aa -> getAuthor($row['content_author']); + $caticon = $content_icon_path.$row['content_icon']; + $deleteicon = CONTENT_ICON_DELETE; + $cid = $row['content_id']; + $row['content_heading'] = $tp->toHTML($row['content_heading'], TRUE, ""); + $row['content_subheading'] = $tp->toHTML($row['content_subheading'], TRUE, ""); + $text .= " + + + + + + + "; + } + $text .= "
    ".CONTENT_ADMIN_ITEM_LAN_8."".CONTENT_ADMIN_ITEM_LAN_9."".CONTENT_ADMIN_ITEM_LAN_10."".CONTENT_ADMIN_ITEM_LAN_11."".CONTENT_ADMIN_ITEM_LAN_12."
    ".$cid."".($row['content_icon'] ? "" : " ")."".($authordetails[0] != "0" ? "".CONTENT_ICON_USER."" : "")." ".$authordetails[1]." + ".CONTENT_ICON_LINK." + ".$row['content_heading']." ".($row['content_subheading'] ? "[".$row['content_subheading']."]" : "")." + ".CONTENT_ICON_EDIT." + toJS(CONTENT_ADMIN_JS_LAN_1."\\n\\n[".CONTENT_ADMIN_JS_LAN_6." ".$cid." : ".$delete_heading."]")."')\"/> +
    + ".$rs -> form_close()." +
    "; + } else { + $text .= "
    ".CONTENT_ADMIN_ITEM_LAN_7."
    "; + } + } + $ns -> tablerender(CONTENT_ADMIN_ITEM_LAN_5, $text); + } + + + + //show_submitted("contentmanager", USERID, USERNAME, $qs[2]); + function show_submitted($cat=''){ + global $qs, $rs, $ns, $aa, $plugintable, $tp; + + $catqry = ''; + if($cat && is_numeric($cat)){ + $catqry = " AND content_parent='".intval($cat)."' "; + } + if(!is_object($sql)){ $sql = new db; } + if(!$content_total = $sql -> db_Select($plugintable, "content_id, content_heading, content_subheading, content_author, content_icon, content_parent", "content_refer = 'sa' ".$catqry." ")){ + $text .= "
    ".CONTENT_ADMIN_ITEM_LAN_50."
    "; + }else{ + $array = $aa -> getCategoryTree("", "", FALSE); + + $text = " +
    + ".$rs -> form_open("post", e_SELF, "submittedform","","", "")." + + + + + + + + + "; + while($row = $sql -> db_Fetch()){ + + if(array_key_exists($row['content_parent'], $array)){ + $mainparent = $array[$row['content_parent']][0]; + $mainparentheading = $array[$row['content_parent']][1]." [".$array[$row['content_parent']][count($array[$row['content_parent']])-1]."]"; + $content_pref = $aa -> getContentPref($mainparent); + $iconpath = ($content_pref["content_icon_path"] ? $content_pref["content_icon_path"] : "{e_PLUGIN}content/images/icon/" ); + $content_icon_path = $tp -> replaceConstants($iconpath); + $icon = $content_icon_path.$row['content_icon']; + } + $delete_heading = str_replace("'", "\'", $row['content_heading']); + $authordetails = $aa -> getAuthor($row['content_author']); + $delid = $row['content_id']; + + $row['content_heading'] = $tp->toHTML($row['content_heading'], TRUE, ""); + $row['content_subheading'] = $tp->toHTML($row['content_subheading'], TRUE, ""); + + $text .= " + + + + + + + + "; + } + $text .= "
    ".CONTENT_ADMIN_ITEM_LAN_8."".CONTENT_ADMIN_ITEM_LAN_9."".CONTENT_ADMIN_ITEM_LAN_48."".CONTENT_ADMIN_ITEM_LAN_10."".CONTENT_ADMIN_ITEM_LAN_11."".CONTENT_ADMIN_ITEM_LAN_12."
    ".$delid." + ".($row['content_icon'] ? "" : " ")." + ".$mainparentheading." + ".($authordetails[0] != "0" ? "".CONTENT_ICON_USER."" : "")." ".$authordetails[1]." + + ".$row['content_heading']." ".($row['content_subheading'] ? "
    [".$row['content_subheading']."]" : "")." +
    + ".CONTENT_ICON_EDIT." + toJS(CONTENT_ADMIN_JS_LAN_10."\\n\\n[".CONTENT_ADMIN_JS_LAN_6." ".$delid." : ".$delete_heading."]")."')\"/> +
    + ".$rs -> form_close()." +
    "; + } + $ns -> tablerender(CONTENT_ADMIN_ITEM_LAN_49, $text); + } + + + function manage_cat(){ + global $qs, $sql, $ns, $rs, $aa, $plugintable, $plugindir, $tp, $stylespacer, $eArrayStorage; + + $catarray = $aa -> getCategoryTree("", "", FALSE); + $array = array_keys($catarray); + + if(!is_array($array)){ + $text = "
    ".CONTENT_ADMIN_CAT_LAN_9."
    "; + }else{ + $text = " +
    + ".$rs -> form_open("post", e_SELF."?".$qs[0], "catform","","", "")." + + + + + + + + "; + + if(!is_object($sql)){ $sql = new db; } + foreach($array as $catid){ + if(!$category_total = $sql -> db_Select($plugintable, "*", "content_id='".intval($catid)."' ")){ + $text .= "
    ".CONTENT_ADMIN_CAT_LAN_9."
    "; + }else{ + $row = $sql -> db_Fetch(); + + $content_pref = $aa -> getContentPref($catarray[$catid][0]); + $content_cat_icon_path_large = $tp -> replaceConstants($content_pref["content_cat_icon_path_large"]); + $content_cat_icon_path_small = $tp -> replaceConstants($content_pref["content_cat_icon_path_small"]); + $delete_heading = str_replace("'", "\'", $row['content_heading']); + $authordetails = $aa -> getAuthor($row['content_author']); + $caticon = $content_cat_icon_path_large.$row['content_icon']; + + $pre = ""; + if($row['content_parent'] == "0"){ //main parent level + $class = "forumheader"; + $mainparentid = $row['content_id']; + }else{ //sub level + $class = "forumheader3"; + for($b=0;$b<(count($catarray[$catid])/2)-1;$b++){ + $pre .= "_"; + } + } + + $options = "".CONTENT_ICON_EDIT." + toJS(CONTENT_ADMIN_JS_LAN_9."\\n\\n".CONTENT_ADMIN_JS_LAN_0."\\n\\n[".CONTENT_ADMIN_JS_LAN_6." ".$catid." : ".$delete_heading."]\\n\\n")."')\"/>"; + + $row['content_heading'] = $tp->toHTML($row['content_heading'], TRUE, ""); + $row['content_subheading'] = $tp->toHTML($row['content_subheading'], TRUE, ""); + + $text .= " + ".($row['content_parent'] == 0 ? "" : "")." + + + + + + + "; + } + } + $text .= " +
    ".CONTENT_ADMIN_CAT_LAN_24."".CONTENT_ADMIN_CAT_LAN_25."".CONTENT_ADMIN_CAT_LAN_18."".CONTENT_ADMIN_CAT_LAN_19."".CONTENT_ADMIN_CAT_LAN_20."
    ".$catid."".($row['content_icon'] ? "" : " ")."".($authordetails[0] != "0" ? "".CONTENT_ICON_USER."" : "")." ".$authordetails[1]." + ".CONTENT_ICON_LINK." + ".$pre.$row['content_heading']." ".($row['content_subheading'] ? "[".$row['content_subheading']."]" : "")." + + ".$options." +
    + ".$rs -> form_close()." +
    "; + } + $ns -> tablerender(CONTENT_ADMIN_CAT_LAN_10, $text); + unset($row['content_id'], $row['content_heading'], $row['content_subheading'], $row['content_text'], $row['content_icon']); + } + + function manager(){ + global $qs, $sql, $ns, $rs, $aa, $plugintable, $plugindir, $tp, $stylespacer, $eArrayStorage; + + $catarray = $aa -> getCategoryTree("", "", FALSE); + $array = array_keys($catarray); + + if(!is_array($array)){ + $text = "
    ".CONTENT_ADMIN_CAT_LAN_9."
    "; + }else{ + $text = " +
    + ".$rs -> form_open("post", e_SELF."?".$qs[0], "catform","","", "")." + + + + + + "; + + if(!is_object($sql)){ $sql = new db; } + foreach($array as $catid){ + if(!$category_total = $sql -> db_Select($plugintable, "*", "content_id='".intval($catid)."' ")){ + $text .= "
    ".CONTENT_ADMIN_CAT_LAN_9."
    "; + }else{ + $row = $sql -> db_Fetch(); + + $content_pref = $eArrayStorage->ReadArray($row['content_pref']); + $content_cat_icon_path_large = $tp -> replaceConstants($content_pref["content_cat_icon_path_large"]); + $content_cat_icon_path_small = $tp -> replaceConstants($content_pref["content_cat_icon_path_small"]); + $delete_heading = str_replace("'", "\'", $row['content_heading']); + $authordetails = $aa -> getAuthor($row['content_author']); + $caticon = $content_cat_icon_path_large.$row['content_icon']; + + $pre = ""; + if($row['content_parent'] == "0"){ //main parent level + $class = "forumheader3"; + $mainparentid = $row['content_id']; + }else{ //sub level + $class = "forumheader3"; + for($b=0;$b<(count($catarray[$catid])/2)-1;$b++){ + $pre .= "_"; + } + } + + //$pcmusers = ""; + $options = "".CONTENT_ICON_CONTENTMANAGER_SMALL.""; + /* + if(isset($row['content_pref'])){ + $pcmcontent_pref = $eArrayStorage->ReadArray($row['content_pref']); + } + if(isset($pcmcontent_pref["content_manager_allowed_{$catid}"])){ + $pcm = explode(",", $pcmcontent_pref["content_manager_allowed_{$catid}"]); + if($pcm[0]==""){ unset($pcm[0]); } + $pcmusers = count($pcm); + $options .= " ".($pcmusers ? "(".$pcmusers." ".($pcmusers == 1 ? CONTENT_ADMIN_CAT_LAN_54 : CONTENT_ADMIN_CAT_LAN_55).")" : ""); + } + */ + + $row['content_heading'] = $tp->toHTML($row['content_heading'], TRUE, ""); + $row['content_subheading'] = $tp->toHTML($row['content_subheading'], TRUE, ""); + + $text .= " + ".($row['content_parent'] == 0 ? "" : "")." + + + + + "; + } + } + $text .= " +
    ".CONTENT_ADMIN_CAT_LAN_24."".CONTENT_ADMIN_CAT_LAN_19."".CONTENT_ADMIN_CAT_LAN_20."
    ".$catid." + ".CONTENT_ICON_LINK." + ".$pre.$row['content_heading']." ".($row['content_subheading'] ? "[".$row['content_subheading']."]" : "")." + + ".$options." +
    + ".$rs -> form_close()." +
    "; + } + $ns -> tablerender(CONTENT_ADMIN_CAT_LAN_10, $text); + unset($row['content_id'], $row['content_heading'], $row['content_subheading'], $row['content_text'], $row['content_icon']); + } + + + function manager_category(){ + global $plugintable, $qs, $sql, $ns, $rs, $aa, $eArrayStorage; + + if(!getperms("0")){ js_location(e_SELF); } + if(!is_numeric($qs[1])){ js_location(e_SELF); } + + if(!is_object($sql)){ $sql = new db; } + if(!$sql -> db_Select($plugintable, "content_id, content_heading, content_pref", "content_id='".intval($qs[1])."' ")){ + js_location(e_SELF."?manager"); + }else{ + $row = $sql -> db_Fetch(); + $caption = CONTENT_ADMIN_CAT_LAN_30." : ".$row['content_heading']; + } + $content_pref = $eArrayStorage->ReadArray($row['content_pref']); + $qs[1] = intval($qs[1]); + + $text = " +
    + ".$rs -> form_open("post", e_SELF."?".e_QUERY, "managerform", "", "enctype='multipart/form-data'")." + + + + + + + + + + + + + + + + +
    + ".CONTENT_ADMIN_MANAGER_LAN_0."
    ".CONTENT_ADMIN_MANAGER_LAN_1."
    +
    + ".r_userclass("content_manager_approve", $content_pref["content_manager_approve"], 'off', "public,guest,nobody,member,admin,classes")." +
    + ".CONTENT_ADMIN_MANAGER_LAN_2."
    ".CONTENT_ADMIN_MANAGER_LAN_3."
    +
    + ".r_userclass("content_manager_personal", $content_pref["content_manager_personal"], 'off', "public,guest,nobody,member,admin,classes")." +
    + ".CONTENT_ADMIN_MANAGER_LAN_4."
    ".CONTENT_ADMIN_MANAGER_LAN_5."
    +
    + ".r_userclass("content_manager_category", $content_pref["content_manager_category"], 'off', "public,guest,nobody,member,admin,classes")." +
    + ".$rs -> form_button("submit", "update_manager", LAN_SAVE)." + ".$rs -> form_hidden("options_type", $qs[1])." +
    + ".$rs -> form_close()." +
    "; + + $ns -> tablerender($caption, $text); + } + + function show_create_category(){ + global $qs, $plugintable, $plugindir, $sql, $ns, $rs, $aa, $fl, $pref, $tp; + global $message, $content_parent, $content_heading, $content_subheading, $content_text, $content_icon, $content_comment, $content_rate, $content_pe, $content_class; + global $stylespacer, $TOPIC_ROW_SPACER, $TOPIC_ROW, $TOPIC_ROW_NOEXPAND; + + $months = array(CONTENT_ADMIN_DATE_LAN_0, CONTENT_ADMIN_DATE_LAN_1, CONTENT_ADMIN_DATE_LAN_2, CONTENT_ADMIN_DATE_LAN_3, CONTENT_ADMIN_DATE_LAN_4, CONTENT_ADMIN_DATE_LAN_5, CONTENT_ADMIN_DATE_LAN_6, CONTENT_ADMIN_DATE_LAN_7, CONTENT_ADMIN_DATE_LAN_8, CONTENT_ADMIN_DATE_LAN_9, CONTENT_ADMIN_DATE_LAN_10, CONTENT_ADMIN_DATE_LAN_11); + + if(!is_object($sql)){ $sql = new db; } + $formurl = e_SELF."?".e_QUERY; + $array = $aa -> getCategoryTree("", "", FALSE); + $mainparent = $aa -> getMainParent( (isset($qs[3]) && is_numeric($qs[3]) ? $qs[3] : (isset($qs[2]) && is_numeric($qs[2]) ? $qs[2] : "0") ) ); + $content_pref = $aa -> getContentPref($mainparent); + $content_cat_icon_path_small = $tp -> replaceConstants($content_pref["content_cat_icon_path_small"]); + $content_cat_icon_path_large = $tp -> replaceConstants($content_pref["content_cat_icon_path_large"]); + + if( $qs[0] == "cat" && $qs[1] == "create" && isset($qs[2]) && is_numeric($qs[2]) ){ + if(!$sql -> db_Select($plugintable, "*", "content_id='".intval($qs[2])."' ")){ + header("location:".e_SELF."?cat"); exit; + } + $formurl = e_SELF."?".e_QUERY; + } + if( $qs[0] == "cat" && $qs[1] == "edit" && isset($qs[2]) && is_numeric($qs[2]) ){ + if(!$sql -> db_Select($plugintable, "*", "content_id='".intval($qs[2])."' ")){ + header("location:".e_SELF."?cat"); exit; + }else{ + $row = $sql -> db_Fetch(); + if(substr($row['content_parent'],0,1) != "0"){ + header("location:".e_SELF."?cat"); exit; + } + $menuheading = $row['content_heading']; + } + $formurl = e_SELF."?".e_QUERY; + } + + if(isset($_POST['preview_category'])){ + $formurl = e_SELF."?".e_QUERY; + $cat_heading = $tp -> post_toHTML($_POST['cat_heading']); + $cat_subheading = $tp -> post_toHTML($_POST['cat_subheading']); + //$cat_text = $tp -> post_toHTML($_POST['cat_text']); + if(e_WYSIWYG){ + $_POST['cat_text'] = $tp->createConstants($_POST['cat_text']); // convert e107_images/ to {e_IMAGE} etc. + } + $cat_text = $tp->post_toHTML($_POST['cat_text'],TRUE); + + $text = " +
    + + + + + + + + + + + + + + +
    ".$cat_heading."
    ".$cat_subheading."
    ".$cat_text."
     
    ".CONTENT_ADMIN_DATE_LAN_15." + ".($_POST['ne_day'] != "none" ? $_POST['ne_day'] : "")." ".$months[($_POST['ne_month']-1)]." ".($_POST['ne_year'] != "none" ? $_POST['ne_year'] : "")." +
    ".CONTENT_ADMIN_DATE_LAN_16." + ".($_POST['end_day'] != "none" ? $_POST['end_day'] : "")." ".$months[($_POST['end_month']-1)]." ".($_POST['end_year'] != "none" ? $_POST['end_year'] : "")." +
    ".CONTENT_ADMIN_CAT_LAN_17."".r_userclass_name($_POST['cat_class'])."
    ".CONTENT_ADMIN_CAT_LAN_14."".($_POST['cat_comment'] == "1" ? CONTENT_ADMIN_ITEM_LAN_85 : CONTENT_ADMIN_ITEM_LAN_86)."
    ".CONTENT_ADMIN_CAT_LAN_15."".($_POST['cat_rate'] == "1" ? CONTENT_ADMIN_ITEM_LAN_85 : CONTENT_ADMIN_ITEM_LAN_86)."
    ".CONTENT_ADMIN_CAT_LAN_16."".($_POST['cat_pe'] == "1" ? CONTENT_ADMIN_ITEM_LAN_85 : CONTENT_ADMIN_ITEM_LAN_86)."
    +
    "; + + $ns -> tablerender($cat_heading, $text); + } + + if( isset($_POST['preview_category']) || isset($message) || isset($_POST['uploadcaticon']) ){ + $row['content_heading'] = $tp -> post_toForm($_POST['cat_heading']); + $row['content_subheading'] = $tp -> post_toForm($_POST['cat_subheading']); + //$row['content_text'] = $tp -> post_toForm($_POST['cat_text']); + if(e_WYSIWYG){ + $_POST['cat_text'] = $tp->toHTML($_POST['cat_text'],$parseBB = TRUE); // parse the bbcodes to we can edit as html. + $_POST['cat_text'] = $tp->replaceConstants($_POST['cat_text'],TRUE); // eg. replace {e_IMAGE} with e107_images/ and NOT ../e107_images + } + $row['content_text'] = $tp -> post_toForm($_POST['cat_text']); + $ne_day = $_POST['ne_day']; + $ne_month = $_POST['ne_month']; + $ne_year = $_POST['ne_year']; + $end_day = $_POST['end_day']; + $end_month = $_POST['end_month']; + $end_year = $_POST['end_year']; + $row['content_icon'] = $_POST['cat_icon']; + $row['content_comment'] = $_POST['cat_comment']; + $row['content_rate'] = $_POST['cat_rate']; + $row['content_pe'] = $_POST['cat_pe']; + $row['content_class'] = $_POST['cat_class']; + }else{ + if(e_WYSIWYG){ + $row['content_text'] = $tp->replaceConstants($row['content_text'],TRUE); // eg. replace {e_IMAGE} with e107_images/ and NOT ../e107_images + } + } + + //check which areas should be visible (dependent on options in admin:create category) + $checksubheading = (isset($content_pref["content_admincat_subheading"]) ? $content_pref["content_admincat_subheading"] : (isset($content_pref["content_admincat_subheading"]) ? $content_pref["content_admincat_subheading"] : "")); + + $checkstartdate = (isset($content_pref["content_admincat_startdate"]) ? $content_pref["content_admincat_startdate"] : (isset($content_pref["content_admincat_startdate"]) ? $content_pref["content_admincat_startdate"] : "")); + + $checkenddate = (isset($content_pref["content_admincat_enddate"]) ? $content_pref["content_admincat_enddate"] : (isset($content_pref["content_admincat_enddate"]) ? $content_pref["content_admincat_enddate"] : "")); + + $checkuploadicon = (isset($content_pref["content_admincat_uploadicon"]) ? $content_pref["content_admincat_uploadicon"] : (isset($content_pref["content_admincat_uploadicon"]) ? $content_pref["content_admincat_uploadicon"] : "")); + + $checkselecticon = (isset($content_pref["content_admincat_selecticon"]) ? $content_pref["content_admincat_selecticon"] : (isset($content_pref["content_admincat_selecticon"]) ? $content_pref["content_admincat_selecticon"] : "")); + + $checkcomment = (isset($content_pref["content_admincat_comment"]) ? $content_pref["content_admincat_comment"] : (isset($content_pref["content_admincat_comment"]) ? $content_pref["content_admincat_comment"] : "")); + + $checkrating = (isset($content_pref["content_admincat_rating"]) ? $content_pref["content_admincat_rating"] : (isset($content_pref["content_admincat_rating"]) ? $content_pref["content_admincat_rating"] : "")); + + $checkpe = (isset($content_pref["content_admincat_pe"]) ? $content_pref["content_admincat_pe"] : (isset($content_pref["content_admincat_pe"]) ? $content_pref["content_admincat_pe"] : "")); + + $checkvisibility = (isset($content_pref["content_admincat_visibility"]) ? $content_pref["content_admincat_visibility"] : (isset($content_pref["content_admincat_visibility"]) ? $content_pref["content_admincat_visibility"] : "")); + + $text = " +
    + ".$rs -> form_open("post", $formurl, "dataform", "", "enctype='multipart/form-data'")." + "; + + //category parent + $TOPIC_TOPIC = CONTENT_ADMIN_CAT_LAN_27; + if($qs[1] == "create"){ + $parent = (isset($qs[3]) && is_numeric($qs[3]) ? $qs[3] : (isset($qs[2]) && is_numeric($qs[2]) ? $qs[2] : "0") ); + }elseif($qs[1] == "edit"){ + if(isset($qs[3]) && is_numeric($qs[3])){ + $parent = $qs[3]; + }else{ + $parent = ( strpos($row['content_parent'], ".") ? substr($row['content_parent'],2) : ""); + } + } + $TOPIC_FIELD = $aa -> ShowOptionCat($parent).$rs->form_hidden("parent", ""); + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW_NOEXPAND); + $text .= $TOPIC_ROW_SPACER; + + $row['content_heading'] = (isset($row['content_heading']) ? $row['content_heading'] : ""); + $TOPIC_TOPIC = CONTENT_ADMIN_CAT_LAN_2; + $TOPIC_FIELD = $rs -> form_text("cat_heading", 90, $row['content_heading'], 250); + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW_NOEXPAND); + + if($checksubheading){ + $row['content_subheading'] = (isset($row['content_subheading']) ? $row['content_subheading'] : ""); + $TOPIC_TOPIC = CONTENT_ADMIN_CAT_LAN_3; + $TOPIC_FIELD = $rs -> form_text("cat_subheading", 90, $row['content_subheading'], 250); + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW_NOEXPAND); + }else{ + $hidden .= $rs -> form_hidden("cat_subheading", $row['content_subheading']); + } + + $row['content_text'] = (isset($row['content_text']) ? $row['content_text'] : ""); + require_once(e_HANDLER."ren_help.php"); + $TOPIC_TOPIC = CONTENT_ADMIN_CAT_LAN_4; + $insertjs = (!$pref['wysiwyg'] ? "onselect='storeCaret(this);' onclick='storeCaret(this);' onkeyup='storeCaret(this);'" : ""); + $TOPIC_FIELD = $rs -> form_textarea("cat_text", 80, 20, $row['content_text'], $insertjs)."
    "; + if (!$pref['wysiwyg']) { $TOPIC_FIELD .= $rs -> form_text("helpb", 90, '', '', "helpbox")."
    ". display_help("helpb"); } + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW_NOEXPAND); + + if(isset($row['content_datestamp']) && $row['content_datestamp'] != "0"){ + $startdate = getdate($row['content_datestamp']); + $ne_day = $startdate['mday']; + $ne_month = $startdate['mon']; + $ne_year = $startdate['year']; + }else{ + $ne_day = (isset($ne_day) ? $ne_day : ""); + $ne_month = (isset($ne_month) ? $ne_month : ""); + $ne_year = (isset($ne_year) ? $ne_year : ""); + } + if(isset($row['content_enddate']) && $row['content_enddate'] != "0"){ + $enddate = getdate($row['content_enddate']); + $end_day = $enddate['mday']; + $end_month = $enddate['mon']; + $end_year = $enddate['year']; + }else{ + $end_day = (isset($end_day) ? $end_day : ""); + $end_month = (isset($end_month) ? $end_month : ""); + $end_year = (isset($end_year) ? $end_year : ""); + } + + $smarray = getdate(); + $current_year = $smarray['year']; + + $text .= $TOPIC_ROW_SPACER; + + if($checkstartdate){ + $TOPIC_TOPIC = CONTENT_ADMIN_DATE_LAN_15; + $TOPIC_HEADING = CONTENT_ADMIN_ITEM_LAN_73; + $TOPIC_HELP = CONTENT_ADMIN_DATE_LAN_17; + $TOPIC_FIELD = " + ".$rs -> form_select_open("ne_day")." + ".$rs -> form_option(CONTENT_ADMIN_DATE_LAN_12, 0, "none"); + for($count=1; $count<=31; $count++){ + $TOPIC_FIELD .= $rs -> form_option($count, ($ne_day == $count ? "1" : "0"), $count); + } + $TOPIC_FIELD .= $rs -> form_select_close()." + ".$rs -> form_select_open("ne_month")." + ".$rs -> form_option(CONTENT_ADMIN_DATE_LAN_13, 0, "none"); + for($count=1; $count<=12; $count++){ + $TOPIC_FIELD .= $rs -> form_option($months[($count-1)], ($ne_month == $count ? "1" : "0"), $count); + } + $TOPIC_FIELD .= $rs -> form_select_close()." + ".$rs -> form_select_open("ne_year")." + ".$rs -> form_option(CONTENT_ADMIN_DATE_LAN_14, 0, "none"); + for($count=($current_year-5); $count<=$current_year; $count++){ + $TOPIC_FIELD .= $rs -> form_option($count, ($ne_year == $count ? "1" : "0"), $count); + } + $TOPIC_FIELD .= $rs -> form_select_close(); + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW); + }else{ + $hidden .= $rs -> form_hidden("ne_day", $ne_day); + $hidden .= $rs -> form_hidden("ne_month", $ne_month); + $hidden .= $rs -> form_hidden("ne_year", $ne_year); + } + + if($checkenddate){ + $TOPIC_TOPIC = CONTENT_ADMIN_DATE_LAN_16; + $TOPIC_HEADING = CONTENT_ADMIN_ITEM_LAN_74; + $TOPIC_HELP = CONTENT_ADMIN_DATE_LAN_18; + $TOPIC_FIELD = " + ".$rs -> form_select_open("end_day")." + ".$rs -> form_option(CONTENT_ADMIN_DATE_LAN_12, 1, "none"); + for($count=1; $count<=31; $count++){ + $TOPIC_FIELD .= $rs -> form_option($count, ($end_day == $count ? "1" : "0"), $count); + } + $TOPIC_FIELD .= $rs -> form_select_close()." + ".$rs -> form_select_open("end_month")." + ".$rs -> form_option(CONTENT_ADMIN_DATE_LAN_13, 1, "none"); + for($count=1; $count<=12; $count++){ + $TOPIC_FIELD .= $rs -> form_option($months[($count-1)], ($end_month == $count ? "1" : "0"), $count); + } + $TOPIC_FIELD .= $rs -> form_select_close()." + ".$rs -> form_select_open("end_year")." + ".$rs -> form_option(CONTENT_ADMIN_DATE_LAN_14, 1, "none"); + for($count=($current_year-5); $count<=$current_year; $count++){ + $TOPIC_FIELD .= $rs -> form_option($count, ($end_year == $count ? "1" : "0"), $count); + } + $TOPIC_FIELD .= $rs -> form_select_close(); + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW); + }else{ + $hidden .= $rs -> form_hidden("end_day", $end_day); + $hidden .= $rs -> form_hidden("end_month", $end_month); + $hidden .= $rs -> form_hidden("end_year", $end_year); + } + + $rejectlist = array('$.','$..','/','CVS','thumbs.db','Thumbs.db','*._$', 'index', 'null*'); + $iconlist = $fl->get_files($content_cat_icon_path_large,"",$rejectlist); + + if($checkuploadicon){ + $TOPIC_TOPIC = CONTENT_ADMIN_CAT_LAN_63; + $TOPIC_HEADING = CONTENT_ADMIN_CAT_LAN_61; + $TOPIC_HELP = ""; + $TOPIC_FIELD = ""; + if(!FILE_UPLOADS){ + $TOPIC_FIELD .= "".CONTENT_ADMIN_ITEM_LAN_21.""; + }else{ + if(!is_writable($content_cat_icon_path_large)){ + $TOPIC_FIELD .= "".CONTENT_ADMIN_ITEM_LAN_22." ".$content_cat_icon_path_large." ".CONTENT_ADMIN_ITEM_LAN_23."
    "; + } + $TOPIC_FIELD .= CONTENT_ADMIN_CAT_LAN_62." + + + + "; + } + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW); + } + + if($checkselecticon){ + $row['content_icon'] = (isset($row['content_icon']) ? $row['content_icon'] : ""); + $TOPIC_TOPIC = CONTENT_ADMIN_CAT_LAN_5; + $TOPIC_FIELD = " + ".$rs -> form_text("cat_icon", 60, $row['content_icon'], 100)." + ".$rs -> form_button("button", '', CONTENT_ADMIN_CAT_LAN_8, "onclick=\"expandit('divcaticon')\"")." + "; + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW_NOEXPAND); + }else{ + $hidden .= $rs -> form_hidden("cat_icon", $row['content_icon']); + } + + if($checkcomment){ + $row['content_comment'] = (isset($row['content_comment']) ? $row['content_comment'] : ""); + $TOPIC_TOPIC = CONTENT_ADMIN_CAT_LAN_14; + $TOPIC_FIELD = " + ".$rs -> form_radio("cat_comment", "1", ($row['content_comment'] ? "1" : "0"), "", "").CONTENT_ADMIN_ITEM_LAN_85." + ".$rs -> form_radio("cat_comment", "0", ($row['content_comment'] ? "0" : "1"), "", "").CONTENT_ADMIN_ITEM_LAN_86; + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW_NOEXPAND); + }else{ + $hidden .= $rs -> form_hidden("cat_comment", $row['content_comment']); + } + + if($checkrating){ + $row['content_rate'] = (isset($row['content_rate']) ? $row['content_rate'] : ""); + $TOPIC_TOPIC = CONTENT_ADMIN_CAT_LAN_15; + $TOPIC_FIELD = " + ".$rs -> form_radio("cat_rate", "1", ($row['content_rate'] ? "1" : "0"), "", "").CONTENT_ADMIN_ITEM_LAN_85." + ".$rs -> form_radio("cat_rate", "0", ($row['content_rate'] ? "0" : "1"), "", "").CONTENT_ADMIN_ITEM_LAN_86; + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW_NOEXPAND); + }else{ + $hidden .= $rs -> form_hidden("cat_rate", $row['content_rate']); + } + + if($checkpe){ + $row['content_pe'] = (isset($row['content_pe']) ? $row['content_pe'] : ""); + $TOPIC_TOPIC = CONTENT_ADMIN_CAT_LAN_16; + $TOPIC_FIELD = " + ".$rs -> form_radio("cat_pe", "1", ($row['content_pe'] ? "1" : "0"), "", "").CONTENT_ADMIN_ITEM_LAN_85." + ".$rs -> form_radio("cat_pe", "0", ($row['content_pe'] ? "0" : "1"), "", "").CONTENT_ADMIN_ITEM_LAN_86; + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW_NOEXPAND); + }else{ + $hidden .= $rs -> form_hidden("cat_pe", $row['content_pe']); + } + + if($checkvisibility){ + $row['content_class'] = (isset($row['content_class']) ? $row['content_class'] : ""); + $TOPIC_TOPIC = CONTENT_ADMIN_CAT_LAN_17; + $TOPIC_FIELD = r_userclass("cat_class",$row['content_class'], "CLASSES"); + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW_NOEXPAND); + }else{ + $hidden .= $rs -> form_hidden("cat_class", $row['content_class']); + } + + $text .= $TOPIC_ROW_SPACER; + $text .= " + + + +
    ".$hidden; + if($qs[1] == "edit" && is_numeric($qs[2]) ){ + $js = "onclick=\"document.getElementById('parent').value = document.getElementById('parent1').options[document.getElementById('parent1').selectedIndex].label;\" "; + $text .= $rs -> form_button("submit", "preview_category", (isset($_POST['preview_category']) ? CONTENT_ADMIN_MAIN_LAN_27 : CONTENT_ADMIN_MAIN_LAN_26), $js); + $text .= $rs -> form_button("submit", "update_category", CONTENT_ADMIN_CAT_LAN_7, $js).$rs -> form_button("submit", "category_clear", CONTENT_ADMIN_CAT_LAN_21).$rs -> form_hidden("cat_id", $qs[2]).$rs -> form_hidden("id", $qs[2]).$rs -> form_hidden("menuheading", $menuheading); + + $caption = CONTENT_ADMIN_CAT_LAN_1; + }else{ + $js = "onclick=\"document.getElementById('parent').value = document.getElementById('parent1').options[document.getElementById('parent1').selectedIndex].label;\" "; + $text .= $rs -> form_button("submit", "preview_category", (isset($_POST['preview_category']) ? CONTENT_ADMIN_MAIN_LAN_27 : CONTENT_ADMIN_MAIN_LAN_26), $js); + $text .= $rs -> form_button("submit", "create_category", CONTENT_ADMIN_CAT_LAN_6, $js); + $caption = CONTENT_ADMIN_CAT_LAN_0; + } + $text .= " +
    + ".$rs -> form_close()." +
    "; + + $ns -> tablerender($caption, $text); + } + + + + function show_contentmanager($mode, $userid="", $username=""){ + global $content_shortcodes, $row, $tp, $sql, $ns, $rs, $plugintable, $plugindir, $aa, $eArrayStorage; + global $CONTENT_CONTENTMANAGER_CATEGORY, $CONTENT_CONTENTMANAGER_TABLE, $CONTENT_CONTENTMANAGER_TABLE_START, $CONTENT_CONTENTMANAGER_TABLE_END, $content_pref, $pref; + $personalmanagercheck = FALSE; + + if(!isset($CONTENT_CONTENTMANAGER_TABLE)){ + if(is_readable(e_THEME.$pref['sitetheme']."/content/content_manager_template.php")){ + require_once(e_THEME.$pref['sitetheme']."/content/content_manager_template.php"); + }else{ + require_once(e_PLUGIN."content/templates/content_manager_template.php"); + } + } + $array = $aa -> getCategoryTree("", "", TRUE); + $catarray = array_keys($array); + $content_contentmanager_table_string = ""; + foreach($catarray as $catid){ + if($sql -> db_Select($plugintable, "content_id, content_heading, content_pref", " content_id='".intval($catid)."' ")){ + $row = $sql -> db_Fetch(); + $content_pref = $eArrayStorage->ReadArray($row['content_pref']); + if( (isset($content_pref["content_manager_approve"]) && check_class($content_pref["content_manager_approve"])) || (isset($content_pref["content_manager_personal"]) && check_class($content_pref["content_manager_personal"])) || (isset($content_pref["content_manager_category"]) && check_class($content_pref["content_manager_category"])) ){ + $personalmanagercheck = TRUE; + $content_contentmanager_table_string .= $tp -> parseTemplate($CONTENT_CONTENTMANAGER_TABLE, FALSE, $content_shortcodes); + } + } + } + if($personalmanagercheck == TRUE){ + $text = $CONTENT_CONTENTMANAGER_TABLE_START.$content_contentmanager_table_string.$CONTENT_CONTENTMANAGER_TABLE_END; + $ns -> tablerender(CONTENT_ADMIN_ITEM_LAN_56, $text); + }else{ + header("location:".$plugindir."content.php"); exit; + } + } + + + + function show_order(){ + global $qs, $sql, $ns, $rs, $aa, $plugintable, $plugindir, $tp, $stylespacer; + + if(!getperms("0")){ header("location:".e_SELF); exit; } + + $catarray = $aa -> getCategoryTree("", "", FALSE); + $array = array_keys($catarray); + + //number of main parents + $mp = $sql -> db_Count($plugintable, "(*)", "WHERE content_parent='0' AND content_refer != 'sa' "); + + if(!is_array($array)){ + $text = "
    ".CONTENT_ADMIN_CAT_LAN_9."
    "; + }else{ + $text = " +
    + ".$rs -> form_open("post", e_SELF."?order", "orderform")." + + + + + + + + + + "; + + if(!is_object($sql)){ $sql = new db; } + foreach($array as $catid){ + if(!$category_total = $sql -> db_Select($plugintable, "*", "content_id='".intval($catid)."' ")){ + $text .= "
    ".CONTENT_ADMIN_CAT_LAN_9."
    "; + }else{ + $row = $sql -> db_Fetch(); + + $content_pref = $aa -> getContentPref($catarray[$catid][0]); + $content_cat_icon_path_large = $tp -> replaceConstants($content_pref["content_cat_icon_path_large"]); + $content_cat_icon_path_small = $tp -> replaceConstants($content_pref["content_cat_icon_path_small"]); + $authordetails = $aa -> getAuthor($row['content_author']); + $caticon = $content_cat_icon_path_large.$row['content_icon']; + + $pre = ""; + if($row['content_parent'] == "0"){ //main parent level + $class = "forumheader"; + }else{ //sub level + $class = "forumheader3"; + for($b=0;$b<(count($catarray[$catid])/2)-1;$b++){ + $pre .= "_"; + } + } + + //count subcategories for a main parent + if($row['content_parent'] == 0){ + $ordermax = $mp; + }else{ + $mainparent = $aa -> getMainParent($row['content_id']); + $subs = $aa -> getCategoryTree("", $mainparent, FALSE); + $ordermax = count($subs)-1; + } + + //count items in category + $ordercat = ""; + $ordercatall = ""; + $up = ""; + $down = ""; + $selectorder = ""; + + $sqlc = new db; + $n = $sqlc -> db_Count($plugintable, "(*)", "WHERE content_parent='".intval($catid)."' AND content_refer != 'sa' "); + if($n > 1){ + $ordercat = "".CONTENT_ICON_ORDERCAT.""; + $ordercatall = ($row['content_parent'] == 0 ? "".CONTENT_ICON_ORDERALL."" : ""); + } + $amount = "(".($n == 1 ? $n." ".CONTENT_ADMIN_CAT_LAN_56 : $n." ".CONTENT_ADMIN_CAT_LAN_57).")"; + + //if($ordermax > 1){ + //up arrow + if($row['content_order'] != 1 && $row['content_order'] != 0){ + $up = "".CONTENT_ICON_ORDER_UP." "; + }else{ + $up = "   "; + } + //down arrow + if($row['content_order'] != $ordermax){ + $down = "".CONTENT_ICON_ORDER_DOWN.""; + }else{ + $down = "   "; + } + //select box + //if($ordermax > 1){ + + $selectorder = " + "; + //} + //} + $row['content_heading'] = $tp->toHTML($row['content_heading'], TRUE, ""); + $row['content_subheading'] = $tp->toHTML($row['content_subheading'], TRUE, ""); + + $text .= " + ".($row['content_parent'] == 0 ? "" : "")." + + + + + + + + + "; + } + } + $text .= " + + + + + +
    ".CONTENT_ADMIN_CAT_LAN_24."".CONTENT_ADMIN_CAT_LAN_25."".CONTENT_ADMIN_CAT_LAN_18."".CONTENT_ADMIN_CAT_LAN_19."".CONTENT_ADMIN_ITEM_LAN_58."".CONTENT_ADMIN_ITEM_LAN_59."".CONTENT_ADMIN_ITEM_LAN_60."
    ".$catid."".($row['content_icon'] ? "" : " ")."".($authordetails[0] != "0" ? "".CONTENT_ICON_USER."" : "")." ".$authordetails[1]." + ".CONTENT_ICON_LINK." + ".$pre.$row['content_heading']." ".($row['content_subheading'] ? "[".$row['content_subheading']."]" : "")." ".$amount." + + ".$ordercat." + ".$ordercatall." + + ".$up." + ".$down." + + ".$selectorder." +
      + ".$rs -> form_button("submit", "update_order", CONTENT_ADMIN_ITEM_LAN_61)." +
    + ".$rs -> form_close()." +
    "; + } + $ns -> tablerender(CONTENT_ADMIN_ITEM_LAN_62, $text); + } + + + + function show_content_order($mode){ + global $sql, $ns, $rs, $qs, $plugintable, $plugindir, $aa, $tp; + + $allcats = $aa -> getCategoryTree("", "", FALSE); + if($mode == "ci"){ + $formtarget = e_SELF."?order.".$qs[1].".".$qs[2]; + $qry = "content_parent = '".intval($qs[2])."' "; + $order = "SUBSTRING_INDEX(content_order, '.', 1)+0"; + + }elseif($mode == "ai"){ + $array = $aa -> getCategoryTree("", intval($qs[1]), FALSE); + $validparent = implode(",", array_keys($array)); + $qry = " content_parent REGEXP '".$aa -> CONTENTREGEXP($validparent)."' "; + $formtarget = e_SELF."?order.".$qs[1]; + $order = "SUBSTRING_INDEX(content_order, '.', -1)+0"; + } + $content_pref = $aa -> getContentPref(intval($qs[1])); + $content_icon_path = $tp -> replaceConstants($content_pref["content_icon_path"]); + + $sqlo = new db; + if(!$content_total = $sqlo -> db_Select($plugintable, "content_id, content_heading, content_author, content_parent, content_order", "content_refer != 'sa' AND ".$qry." ORDER BY ".$order." ASC, content_heading DESC ")){ + $text = "
    ".CONTENT_ADMIN_ITEM_LAN_4."
    "; + }else{ + $text = " +
    + ".$rs -> form_open("post", $formtarget, "orderform")." + + + + + + + + + "; + + while($row = $sqlo -> db_Fetch()){ + $delete_heading = str_replace("'", "\'", $row['content_heading']); + $authordetails = $aa -> getAuthor($row['content_author']); + $caticon = (isset($row['content_icon']) ? $content_icon_path.$row['content_icon'] : ""); + $deleteicon = CONTENT_ICON_DELETE; + + $tmp = explode(".", $row['content_order']); + if(!$tmp[1]){ $tmp[1] = "0"; } + $row['content_order'] = $tmp[0]."-".$tmp[1]; + + if($mode == "ci"){ + $ordercheck = $tmp[0]; + $ordercheck2 = $tmp[1]; + $qrystring = "order.".$qs[1].".".$qs[2]; + }elseif($mode == "ai"){ + $ordercheck = $tmp[1]; + $ordercheck2 = $tmp[0]; + $qrystring = "order.".$qs[1]; + } + $cid = $row['content_id']; + $corder = $row['content_order']; + + if(array_key_exists($row['content_parent'], $allcats)){ + $mainparentid = $allcats[$row['content_parent']][0]; + } + //up arrow + if($ordercheck != 1 && $ordercheck != 0){ + $up = "".CONTENT_ICON_ORDER_UP." "; + }else{ + $up = "   "; + } + //down arrow + if($ordercheck != $content_total){ + $down = "".CONTENT_ICON_ORDER_DOWN.""; + }else{ + $down = "   "; + } + $row['content_heading'] = $tp->toHTML($row['content_heading'], TRUE, ""); + + $text .= " + + + + + + + "; + } + $text .= " + + + + +
    ".CONTENT_ADMIN_MAIN_LAN_2."
    ".CONTENT_ADMIN_ITEM_LAN_8."".CONTENT_ADMIN_ITEM_LAN_10."".CONTENT_ADMIN_ITEM_LAN_11."".CONTENT_ADMIN_ITEM_LAN_59."".CONTENT_ADMIN_ITEM_LAN_60."
    ".$cid." + ".($authordetails[0] != "0" ? "".CONTENT_ICON_USER."" : "")." ".$authordetails[1]." + + ".CONTENT_ICON_LINK." + ".$row['content_heading']." (".$row['content_order'].") + ".$up." + ".$down." + + +
      + ".$rs -> form_button("submit", "update_order", CONTENT_ADMIN_ITEM_LAN_61)." +
    + ".$rs -> form_close()." +
    "; + } + $ns -> tablerender(CONTENT_ADMIN_ITEM_LAN_65, $text); + return; + } + + function show_options(){ + global $sql, $ns, $rs, $aa, $plugintable, $plugindir, $tp, $stylespacer; + + $lan_file = $plugindir."languages/".e_LANGUAGE."/lan_content_options.php"; + include_once(file_exists($lan_file) ? $lan_file : $plugindir."languages/English/lan_content_options.php"); + + $text = " +
    + ".$rs -> form_open("post", e_SELF."?option", "optionsform","","", "")." + + + + + + + + + "; + + $content_pref = $aa -> getContentPref(0); + $content_cat_icon_path_large = $tp -> replaceConstants($content_pref["content_cat_icon_path_large"]); + $content_cat_icon_path_small = $tp -> replaceConstants($content_pref["content_cat_icon_path_small"]); + + $text .= " + + + + + + + + + + "; + + $sqlo = new db; + if($category_total = $sqlo -> db_Select($plugintable, "*", "content_parent='0' ")){ + while($row = $sqlo -> db_Fetch()){ + + $content_pref = $aa -> getContentPref($row['content_id']); + $content_cat_icon_path_large = $tp -> replaceConstants($content_pref["content_cat_icon_path_large"]); + $content_cat_icon_path_small = $tp -> replaceConstants($content_pref["content_cat_icon_path_small"]); + $authordetails = $aa -> getAuthor($row['content_author']); + $caticon = $content_cat_icon_path_large.$row['content_icon']; + + $text .= " + + + + + + + + "; + //".$rs -> form_checkbox("content_inherit[".$row['content_id']."]", 1, (isset($content_pref['content_inherit']) ? "1" : "0"))." + } + } + + $text .= " + + + + +
    ".CONTENT_ADMIN_CAT_LAN_24."".CONTENT_ADMIN_CAT_LAN_25."".CONTENT_ADMIN_CAT_LAN_18."".CONTENT_ADMIN_CAT_LAN_19."".CONTENT_ADMIN_CAT_LAN_20."".CONTENT_ADMIN_OPT_LAN_167."
    ".CONTENT_ADMIN_OPT_LAN_1." + ".CONTENT_ICON_OPTIONS." +
    ".$row['content_id']."".($row['content_icon'] ? "" : " ")."".($authordetails[0] != "0" ? "".CONTENT_ICON_USER."" : "")." ".$authordetails[1]." + ".CONTENT_ICON_LINK." + ".$row['content_heading']." ".($row['content_subheading'] ? "[".$row['content_subheading']."]" : "")." + + ".CONTENT_ICON_OPTIONS." + + + +
    + +
    + ".$rs -> form_close()." +
    "; + + $ns -> tablerender(CONTENT_ADMIN_MENU_LAN_6, $text); + } + + + + function show_options_cat(){ + global $qs, $id, $sql, $ns, $rs, $aa, $content_pref, $pref, $content_cat_icon_path_large, $content_cat_icon_path_small, $plugintable, $plugindir; + global $fl, $stylespacer, $tp; + + if($qs[1] == "default"){ + $id = "0"; + $caption = CONTENT_ADMIN_OPT_LAN_0." : ".CONTENT_ADMIN_OPT_LAN_1; + }elseif(is_numeric($qs[1])){ + $id = $qs[1]; + $sqlo = new db; + if(!$sqlo -> db_Select($plugintable, "content_heading", "content_id='".intval($id)."' AND content_parent = '0' ")){ + header("location:".e_SELF."?option"); exit; + }else{ + while($rowo = $sqlo -> db_Fetch()){ + $caption = CONTENT_ADMIN_OPT_LAN_0." : ".$rowo['content_heading']; + } + } + }else{ + header("location:".e_SELF."?option"); exit; + } + //check prefs two times to insure they are shown, if none present, the first inserts them, the second retrieves them + //$content_pref = $aa -> getContentPref($id); + $content_pref = $aa -> getContentPref($id); + + //define some variables + $TOPIC_TABLE_END = $this->pref_submit().""; + $TOPIC_TITLE_ROW = "{TOPIC_CAPTION}"; + $TOPIC_TABLE_START = ""; + + $TOPIC_ROW_NOEXPAND = " + + {TOPIC_TOPIC} + {TOPIC_FIELD} + + "; + + $TOPIC_ROW = " + + {TOPIC_TOPIC} + + {TOPIC_HEADING} +
    +
    {TOPIC_HELP}

    + {TOPIC_FIELD} +
    + + "; + + $text = " + "; + + $text .= " +
    "; + +?> \ No newline at end of file diff --git a/e107_plugins/forum/templates/forum_template.php b/e107_plugins/forum/templates/forum_template.php new file mode 100644 index 000000000..c3eb9a583 --- /dev/null +++ b/e107_plugins/forum/templates/forum_template.php @@ -0,0 +1,73 @@ +\n
    \n\n\n\n\n\n\n"; +} +if (!isset($FORUM_MAIN_PARENT)) +{ + $FORUM_MAIN_PARENT = " \n\n"; +} +if (!isset($FORUM_MAIN_FORUM)) +{ + $FORUM_MAIN_FORUM = "\n\n\n\n\n\n"; +} +if (!isset($FORUM_MAIN_END)) +{ + $FORUM_MAIN_END = "
    {FORUMTITLE}{THREADTITLE}{REPLYTITLE}{LASTPOSTITLE}
    {PARENTNAME} {PARENTSTATUS}
    {NEWFLAG}{FORUMNAME}
    {FORUMDESCRIPTION}{FORUMSUBFORUMS}
    {THREADS}{REPLIES}{LASTPOST}
    \n
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    {INFOTITLE}
    {LOGO}{USERINFO}
    {INFO}
    {FORUMINFO}
    {USERLIST}
    {STATLINK}
    \n
    \n
    \n\n\n\n\n\n\n
    {ICONKEY}{SEARCH}{PERMS}\n
    \n
    \n"; +} + +if (!isset($FORUM_NEWPOSTS_START)) +{ + $FORUM_NEWPOSTS_START = "
    \n
    \n\n\n\n\n\n"; +} + +if (!isset($FORUM_NEWPOSTS_MAIN)) +{ + $FORUM_NEWPOSTS_MAIN = "\n\n\n\n"; +} + +if (!isset($FORUM_NEWPOSTS_END)) +{ + $FORUM_NEWPOSTS_END = "
     {NEWTHREADTITLE}{POSTEDTITLE}
    {NEWIMAGE}{NEWSPOSTNAME}{STARTERTITLE}
    "; +} + +if (!isset($FORUM_TRACK_START)) +{ + $FORUM_TRACK_START = "
    \n
    \n\n\n\n\n"; + + if (!isset($FORUM_TRACK_MAIN)) + { + $FORUM_TRACK_MAIN = " + + + + "; + } +} + +if (!isset($FORUM_TRACK_END)) +{ + $FORUM_TRACK_END = "
    {TRACKTITLE}
    {NEWIMAGE}{TRACKPOSTNAME}{UNTRACK}
    \n
    \n
    "; +} + +?> \ No newline at end of file diff --git a/e107_plugins/forum/templates/forum_viewforum_template.php b/e107_plugins/forum/templates/forum_viewforum_template.php new file mode 100644 index 000000000..7d15257f7 --- /dev/null +++ b/e107_plugins/forum/templates/forum_viewforum_template.php @@ -0,0 +1,271 @@ + +
    + + + + + {SUBFORUMS} + + + +
    {BREADCRUMB}
    + {FORUMTITLE}
    +
    + + + + + + +
    + {THREADPAGES} + + {NEWTHREADBUTTON} +
    + +
    + + + + + + + + + "; +} + +if(!$FORUM_VIEW_START_CONTAINER) +{ + $FORUM_VIEW_START_CONTAINER = " +
    +
    +
     {THREADTITLE}{STARTERTITLE}{REPLYTITLE}{VIEWTITLE}{LASTPOSTITLE}
    + + + + {SUBFORUMS} +
    {BREADCRUMB}
    +
    + "; +} + + +if (!$FORUM_VIEW_FORUM) { + $FORUM_VIEW_FORUM = " + + {ICON} + + + + + + + +
    {THREADTYPE}{THREADNAME}
    {PAGES}
    {ADMIN_ICONS}
    + + + + {POSTER}
    {THREADDATE} + {REPLIES} + {VIEWS} + {LASTPOST} + "; +} + +if (!$FORUM_VIEW_FORUM_STICKY) { + $FORUM_VIEW_FORUM_STICKY = " + + {ICON} + + + + + + + +
    {THREADTYPE}{THREADNAME} {PAGES}{ADMIN_ICONS}
    + + + + {POSTER}
    {THREADDATE} + {REPLIES} + {VIEWS} + {LASTPOST} + "; +} + +if (!$FORUM_VIEW_FORUM_ANNOUNCE) { + $FORUM_VIEW_FORUM_ANNOUNCE = " + + {ICON} + + + + + + + +
    {THREADTYPE}{THREADNAME} {PAGES}{ADMIN_ICONS}
    + + + + {POSTER}
    {THREADDATE} + {REPLIES} + {VIEWS} + {LASTPOST} + "; +} + +if (!$FORUM_VIEW_END) { + $FORUM_VIEW_END = " + + + + + + + + + + + +
    {THREADPAGES} + + {NEWTHREADBUTTON} +
    + {FORUMJUMP} +
    + +
    + + + + + +
    {MODERATORS}{BROWSERS}
    +
    + +
    + + + + + +
    {ICONKEY}{PERMS}

    {SEARCH} +
    +
    + +
    +
    + ".LAN_431." + ".LAN_432." + ".LAN_433." +
    +
    Powered by e107 Forum System
    +"; +} + + +if(!$FORUM_VIEW_END_CONTAINER) +{ + $FORUM_VIEW_END_CONTAINER = " + + + + +
    + {FORUMJUMP} +
    +
    Powered by e107 Forum System
    +"; +} + + +if (!$FORUM_VIEW_SUB_START) + { + $FORUM_VIEW_SUB_START = " + + +
    +
    + + + + + + + + + "; +} + +if (!$FORUM_VIEW_SUB) { + $FORUM_VIEW_SUB = " + + + + + + + + "; +} + +if (!$FORUM_VIEW_SUB_END) { + $FORUM_VIEW_SUB_END = " +
     ".FORLAN_20."".FORLAN_21."".LAN_55."".FORLAN_22."
    {NEWFLAG}{SUB_FORUMTITLE}
    {SUB_DESCRIPTION}
    {SUB_THREADS}{SUB_REPLIES}{SUB_LASTPOST}


    +
    + + + "; +} + +if (!$FORUM_IMPORTANT_ROW) { + $FORUM_IMPORTANT_ROW = " ".LAN_411.""; +} + +if (!$FORUM_NORMAL_ROW) { + $FORUM_NORMAL_ROW = " ".LAN_412.""; +} + +$FORUM_CRUMB['sitename']['value'] = "{SITENAME}"; +$FORUM_CRUMB['sitename']['sep'] = " :: "; + +$FORUM_CRUMB['forums']['value'] = "{FORUMS_TITLE}"; +$FORUM_CRUMB['forums']['sep'] = " :: "; + +$FORUM_CRUMB['parent']['value'] = "{PARENT_TITLE}"; +$FORUM_CRUMB['parent']['sep'] = " :: "; + +$FORUM_CRUMB['subparent']['value'] = "{SUBPARENT_TITLE}"; +$FORUM_CRUMB['subparent']['sep'] = " :: "; + +$FORUM_CRUMB['forum']['value'] = "{FORUM_TITLE}"; + +?> \ No newline at end of file diff --git a/e107_plugins/forum/templates/forum_viewtopic_template.php b/e107_plugins/forum/templates/forum_viewtopic_template.php new file mode 100644 index 000000000..758e5ae63 --- /dev/null +++ b/e107_plugins/forum/templates/forum_viewtopic_template.php @@ -0,0 +1,257 @@ +
    [ ".LAN_29." "; +$sc_style['LASTEDIT']['post'] = " ]"; + +$sc_style['LEVEL']['pre'] = "
    "; +$sc_style['LEVEL']['post'] = "
    "; + +$sc_style['ANON_IP']['pre'] = "
    "; +$sc_style['ANON_IP']['post'] = "
    "; + +$location_tpl = (array_key_exists('user_location', $currentUser) ? "{USER_EXTENDED=location.text}: {USER_EXTENDED=location.value}" : ""); + +$FORUMSTART = "
    +
    + + + + + + + + + +
    + {BACKLINK} + +
      + {TRACK} +
    +
    + + {NEXTPREV} + +
    + {THREADNAME} +
    +
    + + + + + + + + + + +
    + {GOTOPAGES} + + {BUTTONS} +
    +
    + {MODERATORS} +
    +
    + {THREADSTATUS} +
    + +
    + + + + + "; + +$FORUMTHREADSTYLE = " + + + + + + + + + + + + + + "; + +$FORUMEND = "
    + ".LAN_402." + + ".LAN_403." +
    + {NEWFLAG} + {POSTER} + {ANON_IP} + + + + + + +
    + {THREADDATESTAMP} + + {REPORTIMG}{EDITIMG}{QUOTEIMG} +
    +
    + {CUSTOMTITLE} + {AVATAR} +
    + {LEVEL=special} + {LEVEL=pic} + {LEVEL=userid} + {JOINED} + {$location_tpl}
    + {POSTS} +
    +
    {POLL} + {POST} + {LASTEDIT} + {SIGNATURE} +
    + + {TOP} + + + + + + + +
    + {PROFILEIMG} + {EMAILIMG} + {WEBSITEIMG} + {PRIVMESSAGE} + + {MODOPTIONS} +
    +
    +
    {QUICKREPLY}
    + + + + + + + + + +
    {GOTOPAGES}  + + {BUTTONS} +
    + {FORUMJUMP} +
    +
    + +
    + ".LAN_431." ".LAN_432." ".LAN_433."
    Powered by e107 Forum System
    "; + +$FORUMREPLYSTYLE = " + + {NEWFLAG} + {POSTER} + {ANON_IP} + + + + + + + +
    + {THREADDATESTAMP} + + {REPORTIMG}{EDITIMG}{QUOTEIMG} +
    + + + + + {CUSTOMTITLE} + {AVATAR} +
    + {LEVEL=special} + {LEVEL=pic} + {LEVEL=userid} + {JOINED} + {$location_tpl}
    + {POSTS} +
    + + {POST} + {LASTEDIT} + {SIGNATURE} + + + + + + {TOP} + + + + + + + + +
    + {PROFILEIMG} + {EMAILIMG} + {WEBSITEIMG} + {PRIVMESSAGE} + + {MODOPTIONS} +
    + + + + + + "; + +$FORUM_CRUMB['sitename']['value'] = "{SITENAME}"; +$FORUM_CRUMB['sitename']['sep'] = " :: "; + +$FORUM_CRUMB['forums']['value'] = "{FORUMS_TITLE}"; +$FORUM_CRUMB['forums']['sep'] = " :: "; + +$FORUM_CRUMB['parent']['value'] = "{PARENT_TITLE}"; +$FORUM_CRUMB['parent']['sep'] = " :: "; + +$FORUM_CRUMB['subparent']['value'] = "{SUBPARENT_TITLE}"; +$FORUM_CRUMB['subparent']['sep'] = " :: "; + +$FORUM_CRUMB['forum']['value'] = "{FORUM_TITLE}"; + +?> \ No newline at end of file diff --git a/e107_plugins/gsitemap/admin_config.php b/e107_plugins/gsitemap/admin_config.php new file mode 100644 index 000000000..d7528edad --- /dev/null +++ b/e107_plugins/gsitemap/admin_config.php @@ -0,0 +1,506 @@ +freq_list = array + ( + "always" => GSLAN_11, + "hourly" => GSLAN_12, + "daily" => GSLAN_13, + "weekly" => GSLAN_14, + "monthly" => GSLAN_15, + "yearly" => GSLAN_16, + "never" => GSLAN_17 + ); + + if(isset($_POST['edit'])) + { + $this -> editSme(); + } + + if(isset($_POST['delete'])) + { + $this -> deleteSme(); + } + + if(isset($_POST['add_link'])) + { + $this -> addLink(); + } + + if(isset($_POST['import_links'])) + { + $this -> importLink(); + } + + + if($this -> message) + { + echo "
    ".$this -> message."

    "; + } + + + if(e_QUERY == "new") + { + $this -> doForm(); + } + else if(e_QUERY == "import") + { + $this -> importSme(); + } + else if(e_QUERY == "instructions") + { + $this -> instructions(); + } + else if(!$_POST['edit']) + { + $this -> showList(); + } + } + +/*+----------------------#######################################################################################---------------------+*/ + + function showList() + { + global $sql,$ns,$tp; + $gen = new convert; + $count = $sql -> db_Select("gsitemap", "*", "gsitemap_id !=0 ORDER BY gsitemap_order ASC"); + + $text = "
    + + "; + + if (!$count) + { + $text .= " +
    + ".GSLAN_39." + +
    "; + $ns -> tablerender("
    ".GSLAN_40."
    ", $text); + require_once(e_ADMIN."footer.php"); + exit; + } + else + { + $text .= " + +
    + + + + + + + + + + + + "; + + $glArray = $sql -> db_getList(); + foreach($glArray as $row2) + { + $datestamp = $gen->convert_date($row2['gsitemap_lastmod'], "short"); + + $text .= " + + + + + + + + + + "; + } + } + + $text .= "
    Id".GSLAN_25."".GSLAN_26."".GSLAN_27."".GSLAN_28."".GSLAN_9."".LAN_OPTIONS."
    ".$row2['gsitemap_id'] ."".$tp->toHTML($row2['gsitemap_name'],"","defs")."".$row2['gsitemap_url']."".$datestamp."".$this->freq_list[($row2['gsitemap_freq'])]."".$row2['gsitemap_priority'] ." +
    + + toJS(LAN_CONFIRMDEL." [".$row2['gsitemap_name']."]")."') \" src='".e_IMAGE."admin_images/delete_16.png' alt='".LAN_DELETE."' title='".LAN_DELETE."' style='border:0px' /> +
    +
    \n



    "; + $ns -> tablerender("
    ".GSLAN_24."
    ", $text); + } + +/*+----------------------#######################################################################################---------------------+*/ + + function editSme() + { + global $sql, $tp; + $e_idt = array_keys($_POST['edit']); + + if($sql -> db_Select("gsitemap", "*", "gsitemap_id='".$e_idt[0]."' ")) + { + $foo = $sql -> db_Fetch(); + $foo['gsitemap_name'] = $tp -> toFORM($foo['gsitemap_name']); + $foo['gsitemap_url'] = $tp -> toFORM($foo['gsitemap_url']); + + $this -> doForm($foo); + } + } + +/*+----------------------#######################################################################################---------------------+*/ + + function doForm($editArray=FALSE) + { + global $sql,$ns; + $count = $sql -> db_Select("gsitemap", "*", "gsitemap_id !=0 ORDER BY gsitemap_id ASC"); + $text = " +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ".GSLAN_25." +   + +
    ".GSLAN_26." +   + + +
    ".GSLAN_10." +   + +
    ".GSLAN_9."
    +  
    +
    ".GSLAN_30." +
    ".GSLAN_31.""; + $text .= r_userclass("gsitemap_active", $editArray['gsitemap_active'], "nobody,public,guest,member,admin,classes,language"); + $text .=" +
    "; + if(is_array($editArray)) + { + $text .= " + "; + } + else + { + $text .= ""; + } + + $text .= "
    +
    + "; + + $ns -> tablerender("
    ".GSLAN_29."
    ", $text); + + + } + +/*+----------------------#######################################################################################---------------------+*/ + + function addLink() + { + global $sql, $tp; + $gsitemap_name = $tp -> toDB($_POST['gsitemap_name']); + $gsitemap_url = $tp -> toDB($_POST['gsitemap_url']); + + if(isset($_POST['gsitemap_id'])) + { + $this -> message = $sql -> db_Update("gsitemap", "gsitemap_name='$gsitemap_name', gsitemap_url='$gsitemap_url', gsitemap_priority='".$_POST['gsitemap_priority']."', gsitemap_lastmod='".$_POST['gsitemap_lastmod']."', gsitemap_freq= '".$_POST['gsitemap_freq']."', gsitemap_order='".$_POST['gsitemap_order']."', gsitemap_active='".$_POST['gsitemap_active']."' WHERE gsitemap_id='".$_POST['gsitemap_id']."' ") ? LAN_UPDATED : LAN_UPDATED_FAILED; + } + else + { + $this -> message = ($sql -> db_Insert("gsitemap", "0, '".$_POST['gsitemap_name']."', '".$gsitemap_url."', '".$_POST['gsitemap_lastmod']."', '".$_POST['gsitemap_freq']."', '".$_POST['gsitemap_priority']."', '".$_POST['gsitemap_cat']."', '".$_POST['gsitemap_order']."', '".$_POST['gsitemap_img']."', '".$_POST['gsitemap_active']."' ")) ? LAN_CREATED : LAN_CREATED_FAILED; + } + } + +/*+----------------------#######################################################################################---------------------+*/ + + function deleteSme() + { + global $sql; + $d_idt = array_keys($_POST['delete']); + $this -> message = ($sql -> db_Delete("gsitemap", "gsitemap_id='".$d_idt[0]."'")) ? LAN_DELETED : LAN_DELETED_FAILED; + } + +/*+----------------------#######################################################################################---------------------+*/ + + function importSme() + { + global $sql, $sql2, $PLUGINS_DIRECTORY, $ns; + $importArray = array(); + + /* sitelinks ... */ + $sql -> db_Select("links", "*", "ORDER BY link_order ASC", "no-where"); + $nfArray = $sql -> db_getList(); + foreach($nfArray as $row) + { + if(!$sql -> db_Select("gsitemap", "*", "gsitemap_name='".$row['link_name']."' ")) + { + $importArray[] = array('name' => $row['link_name'], 'url' => $row['link_url'], 'type' => GSLAN_1); + } + } + + /* custom pages ... */ + $sql -> db_Select("page", "*", "ORDER BY page_datestamp ASC", "no-where"); + $nfArray = $sql -> db_getList(); + foreach($nfArray as $row) + { + if(!$sql -> db_Select("gsitemap", "*", "gsitemap_name='".$row['page_title']."' ")) + { + $importArray[] = array('name' => $row['page_title'], 'url' => "page.php?".$row['page_id'],'type' => "Custom Page"); + } + } + + + + /* forums ... */ + $sql -> db_Select("forum", "*", "forum_parent!='0' ORDER BY forum_order ASC"); + $nfArray = $sql -> db_getList(); + foreach($nfArray as $row) + { + if(!$sql -> db_Select("gsitemap", "*", "gsitemap_name='".$row['forum_name']."' ")) + { + $importArray[] = array('name' => $row['forum_name'], 'url' => $PLUGINS_DIRECTORY."forum/forum_viewforum.php?".$row['forum_id'], 'type' => "Forum"); + } + } + + + /* content pages ... */ + $sql -> db_Select("pcontent", "content_id, content_heading", "LEFT(content_parent,1) = '0' ORDER BY content_heading"); + $nfArray = $sql -> db_getList(); + foreach($nfArray as $row) + { + $sql2 -> db_Select("pcontent", "content_id, content_heading", "content_parent = '".$row['content_id']."' AND content_refer != 'sa' ORDER BY content_heading"); + $nfArray2 = $sql2 -> db_getList(); + foreach($nfArray2 as $row2) + { + if(!$sql -> db_Select("gsitemap", "*", "gsitemap_name='".$row2['content_heading']."' ")) + { + $importArray[] = array('name' => $row2['content_heading'], 'url' => $PLUGINS_DIRECTORY."content/content.php?content.".$row2['content_id'], 'type' => $row['content_heading']); + } + } + + } + + + /* end */ + + + + $text = " +
    + + + + + + + + + + + + + "; + + foreach($importArray as $ia) + { + $text .= " + + + + + + + "; + } + + + + + + + $text .= " + + + +
    ".GSLAN_6."
    ".GSLAN_2."".GSLAN_3."".GSLAN_4."".GSLAN_5."
    ".$ia['type']."".$ia['name']."".str_replace(SITEURL,"",$ia['url'])."
    +
    ".GSLAN_8."   ".GSLAN_9." :    ".GSLAN_10." + + +

    + + +
    + +
    +
    + "; + + $ns -> tablerender("
    ".GSLAN_7."
    ", $text); + } + +/*+----------------------#######################################################################################---------------------+*/ + + function importLink() + { + global $sql, $tp; + foreach($_POST['importid'] as $import) + { + list($name, $url, $type) = explode("^", $import); + $name = $tp -> toDB($name); + $url = $tp -> toDB($url); + $sql -> db_Insert("gsitemap", "0, '$name', '$url', '".time()."', '".$_POST['import_freq']."', '".$_POST['import_priority']."', '$type', '0', '', '0' "); + } + $this -> message = count($_POST['importid'])." link(s) imported."; + } + +/*+----------------------#######################################################################################---------------------+*/ + + function instructions() + { + global $ns, $PLUGINS_DIRECTORY; + + $text = "".GSLAN_33."

    +
    +
    \n + +
    + "; + + $TOPIC_CAPTION = CONTENT_ADMIN_OPT_LAN_MENU_3; + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_TITLE_ROW); + + //content_admin_sections + $TOPIC_TOPIC = CONTENT_ADMIN_OPT_LAN_SECTION_1; + $TOPIC_FIELD = "
    + ".$rs -> form_checkbox("content_admin_subheading", 1, (isset($content_pref['content_admin_subheading']) ? "1" : "0"))." ".CONTENT_ADMIN_OPT_LAN_SECTION_32."
    + ".$rs -> form_checkbox("content_admin_summary", 1, (isset($content_pref['content_admin_summary']) ? "1" : "0"))." ".CONTENT_ADMIN_OPT_LAN_SECTION_38."
    + ".$rs -> form_checkbox("content_admin_startdate", 1, (isset($content_pref['content_admin_startdate']) ? "1" : "0"))." ".CONTENT_ADMIN_OPT_LAN_SECTION_33."
    + ".$rs -> form_checkbox("content_admin_enddate", 1, (isset($content_pref['content_admin_enddate']) ? "1" : "0"))." ".CONTENT_ADMIN_OPT_LAN_SECTION_34."
    + ".$rs -> form_checkbox("content_admin_icon", 1, (isset($content_pref['content_admin_icon']) ? "1" : "0"))." ".CONTENT_ADMIN_OPT_LAN_SECTION_27."
    + ".$rs -> form_checkbox("content_admin_attach", 1, (isset($content_pref['content_admin_attach']) ? "1" : "0"))." ".CONTENT_ADMIN_OPT_LAN_SECTION_2."
    + ".$rs -> form_checkbox("content_admin_images", 1, (isset($content_pref['content_admin_images']) ? "1" : "0"))." ".CONTENT_ADMIN_OPT_LAN_SECTION_3."
    + ".$rs -> form_checkbox("content_admin_comment", 1, (isset($content_pref['content_admin_comment']) ? "1" : "0"))." ".CONTENT_ADMIN_OPT_LAN_SECTION_4."
    +
    + ".$rs -> form_checkbox("content_admin_rating", 1, (isset($content_pref['content_admin_rating']) ? "1" : "0"))." ".CONTENT_ADMIN_OPT_LAN_SECTION_5."
    + ".$rs -> form_checkbox("content_admin_score", 1, (isset($content_pref['content_admin_score']) ? "1" : "0"))." ".CONTENT_ADMIN_OPT_LAN_SECTION_6."
    + ".$rs -> form_checkbox("content_admin_pe", 1, (isset($content_pref['content_admin_pe']) ? "1" : "0"))." ".CONTENT_ADMIN_OPT_LAN_SECTION_20."
    + ".$rs -> form_checkbox("content_admin_visibility", 1, (isset($content_pref['content_admin_visibility']) ? "1" : "0"))." ".CONTENT_ADMIN_OPT_LAN_SECTION_7."
    + ".$rs -> form_checkbox("content_admin_meta", 1, (isset($content_pref['content_admin_meta']) ? "1" : "0"))." ".CONTENT_ADMIN_OPT_LAN_SECTION_8."
    + ".$rs -> form_checkbox("content_admin_layout", 1, (isset($content_pref['content_admin_layout']) ? "1" : "0"))." ".CONTENT_ADMIN_OPT_LAN_SECTION_9."
    + ".$rs -> form_checkbox("content_admin_customtags", 1, (isset($content_pref['content_admin_customtags']) ? "1" : "0"))." ".CONTENT_ADMIN_OPT_LAN_SECTION_10."
    + ".$rs -> form_checkbox("content_admin_presettags", 1, (isset($content_pref['content_admin_presettags']) ? "1" : "0"))." ".CONTENT_ADMIN_OPT_LAN_SECTION_11."
    +
    + "; + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW_NOEXPAND); + + //content_admin_images_number_ + $TOPIC_TOPIC = CONTENT_ADMIN_OPT_LAN_3; + $TOPIC_FIELD = " + ".$rs -> form_select_open("content_admin_images_number"); + $content_pref['content_admin_images_number'] = ($content_pref['content_admin_images_number'] ? $content_pref['content_admin_images_number'] : "10"); + for($i=1;$i<16;$i++){ + $k=$i*2; + $TOPIC_FIELD .= $rs -> form_option($k, ($content_pref['content_admin_images_number'] == $k ? "1" : "0"), $k); + } + $TOPIC_FIELD .= $rs -> form_select_close(); + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW_NOEXPAND); + + //content_admin_files_number_ + $TOPIC_TOPIC = CONTENT_ADMIN_OPT_LAN_4; + $TOPIC_FIELD = " + ".$rs -> form_select_open("content_admin_files_number"); + $content_pref['content_admin_files_number'] = ($content_pref['content_admin_files_number'] ? $content_pref['content_admin_files_number'] : "1"); + for($i=1;$i<6;$i++){ + $TOPIC_FIELD .= $rs -> form_option($i, ($content_pref['content_admin_files_number'] == $i ? "1" : "0"), $i); + } + $TOPIC_FIELD .= $rs -> form_select_close(); + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW_NOEXPAND); + + //content_admin_custom_number_ + $TOPIC_TOPIC = CONTENT_ADMIN_OPT_LAN_5; + $TOPIC_FIELD = " + ".$rs -> form_select_open("content_admin_custom_number"); + for($i=0;$i<11;$i++){ + $TOPIC_FIELD .= $rs -> form_option($i, ($content_pref['content_admin_custom_number'] == $i ? "1" : "0"), $i); + } + $TOPIC_FIELD .= $rs -> form_select_close(); + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW_NOEXPAND); + + //content_admin_custom_preset_ + $TOPIC_TOPIC = CONTENT_ADMIN_OPT_LAN_6; + $TOPIC_HEADING = CONTENT_ADMIN_OPT_LAN_7; + $TOPIC_HELP = ""; + $i=0; + $existing = 0; + $TOPIC_FIELD = " +
    "; + for($i=0;$i form_text("content_custom_preset_key[$existing]", 50, $content_pref['content_custom_preset_key'][$existing], 100)." + ".$rs -> form_button("button", "x", "x", "onclick=\"document.getElementById('content_custom_preset_key[$existing]').value='';\"", "", "")." + "; + $existing++; + } + } + $TOPIC_FIELD .= " +
    +
    +

    "; + + $url = e_PLUGIN."content/handlers/content_preset.php"; + $selectjs = "onchange=\"if(this.options[this.selectedIndex].value != 'none'){ return window.open(this.options[this.selectedIndex].value, 'myWindow', 'status = 1, height = 400, width = 400, resizable = 1'); }\""; + $TOPIC_FIELD .= " +
    + ".$rs -> form_select_open("type", $selectjs)." + ".$rs -> form_option(CONTENT_PRESET_LAN_25, "1", "none", "")." + ".$rs -> form_option(CONTENT_PRESET_LAN_26, "", $url."?text", "")." + ".$rs -> form_option(CONTENT_PRESET_LAN_27, "", $url."?area", "")." + ".$rs -> form_option(CONTENT_PRESET_LAN_28, "", $url."?select", "")." + ".$rs -> form_option(CONTENT_PRESET_LAN_29, "", $url."?date", "")." + ".$rs -> form_option(CONTENT_PRESET_LAN_30, "", $url."?checkbox", "")." + ".$rs -> form_option(CONTENT_PRESET_LAN_31, "", $url."?radio", "")." + ".$rs -> form_select_close()." +

    "; + $text .= preg_replace("/\{(.*?)\}/e", '$\1', $TOPIC_ROW); + + $text .= $TOPIC_TABLE_END; + + + $text .= " + +

    +"; + +?> \ No newline at end of file diff --git a/e107_plugins/featurebox/templates/default.php b/e107_plugins/featurebox/templates/default.php new file mode 100644 index 000000000..32f460e61 --- /dev/null +++ b/e107_plugins/featurebox/templates/default.php @@ -0,0 +1,28 @@ +$fb_title
    +
    +$fb_text +"; + +?> \ No newline at end of file diff --git a/e107_plugins/forum/e_emailprint.php b/e107_plugins/forum/e_emailprint.php new file mode 100755 index 000000000..6c4d09bdf --- /dev/null +++ b/e107_plugins/forum/e_emailprint.php @@ -0,0 +1,57 @@ +thread_get($thread_id,0,999); + $thread_name = $tp -> toHTML($thread_info[0]['thread_name'], TRUE); + $text = "".$thread_name."
    + ".$thread_info[0]['user_name'].", ".$gen->convert_date($thread_info[0]['thread_datestamp'], "forum")."

    + ".$tp -> toHTML($thread_info[0]['thread_thread'], TRUE); + + + $count = 1; + + unset($thread_info[0], $thread_info['head']); + foreach($thread_info as $reply) + { + $text .= "

    Re: ".$thread_name."
    + ".$reply['user_name'].", ".$gen->convert_date($reply['thread_datestamp'], "forum")."

    + ".$tp -> toHTML($reply['thread_thread'], TRUE); + } + + +// return "
    ".print_r($thread_info,TRUE)."
    "; + return $text; +} + +function email_item($thread_id) +{ + global $tp; + $gen = new convert; + include_once(e_PLUGIN.'forum/forum_class.php'); + $forum = new e107forum; + $thread_info = $forum->thread_get($thread_id,0,999); + + $thread_name = $tp -> toHTML($thread_info[0]['thread_name'], TRUE); + $text = "".$thread_name."
    + ".$thread_info[0]['user_name'].", ".$gen->convert_date($thread_info[0]['thread_datestamp'], "forum")."

    + ".$tp -> toHTML($thread_info[0]['thread_thread'], TRUE); + + $count = 1; + + unset($thread_info[0], $thread_info['head']); + foreach($thread_info as $reply) + { + $text .= "

    Re: ".$thread_name."
    + ".$reply['user_name'].", ".$gen->convert_date($reply['thread_datestamp'], "forum")."

    + ".$tp -> toHTML($reply['thread_thread'], TRUE); + } + return $text; +} + +?> \ No newline at end of file diff --git a/e107_plugins/forum/e_frontpage.php b/e107_plugins/forum/e_frontpage.php new file mode 100644 index 000000000..dc29f1e40 --- /dev/null +++ b/e107_plugins/forum/e_frontpage.php @@ -0,0 +1,10 @@ + $PLUGINS_DIRECTORY.'forum/forum.php', 'title' => FOR_FP_1); + +?> \ No newline at end of file diff --git a/e107_plugins/forum/e_latest.php b/e107_plugins/forum/e_latest.php new file mode 100644 index 000000000..b751b031c --- /dev/null +++ b/e107_plugins/forum/e_latest.php @@ -0,0 +1,15 @@ +db_Count('generic', '(*)', "WHERE gen_type='reported_post' OR gen_type='Reported Forum Post'"); +$text .= "
    + "; + +if ($reported_posts) { + $text .= "".ADLAN_LAT_6.": ".$reported_posts.""; +} else { + $text .= ADLAN_LAT_6.": ".$reported_posts; +} + +$text .= '
    '; +?> diff --git a/e107_plugins/forum/e_linkgen.php b/e107_plugins/forum/e_linkgen.php new file mode 100644 index 000000000..74de2650b --- /dev/null +++ b/e107_plugins/forum/e_linkgen.php @@ -0,0 +1,37 @@ + + diff --git a/e107_plugins/forum/e_list.php b/e107_plugins/forum/e_list.php new file mode 100644 index 000000000..c94e33b6d --- /dev/null +++ b/e107_plugins/forum/e_list.php @@ -0,0 +1,152 @@ + db_Select("plugin", "*", "plugin_path = 'forum' AND plugin_installflag = '1' ")) + { + return; + } + + $LIST_CAPTION = $arr[0]; + $LIST_DISPLAYSTYLE = ($arr[2] ? "" : "none"); + + $bullet = $this -> getBullet($arr[6], $mode); + + if($mode == "new_page" || $mode == "new_menu" ) + { + $lvisit = $this -> getlvisit(); + $qry = " + SELECT tp.thread_name AS parent_name, tp.thread_id as parent_id, f.forum_id, f.forum_name, f.forum_class, u.user_name, lp.user_name AS lp_name, t.thread_thread, t.thread_id, t.thread_views as tviews, t.thread_name, tp.thread_parent, t.thread_datestamp, t.thread_user, tp.thread_views, tp.thread_lastpost, tp.thread_lastuser, tp.thread_total_replies + FROM #forum_t AS t + LEFT JOIN #forum_t AS tp ON t.thread_parent = tp.thread_id + LEFT JOIN #forum AS f ON f.forum_id = t.thread_forum_id + LEFT JOIN #user AS u ON t.thread_user = u.user_id + LEFT JOIN #user AS lp ON tp.thread_lastuser = lp.user_id + WHERE f.forum_class REGEXP '".e_CLASS_REGEXP."' + AND t.thread_datestamp > $lvisit + ORDER BY t.thread_datestamp DESC LIMIT 0,".intval($arr[7]); + } + else + { + $qry = " + SELECT t.thread_id, t.thread_name AS parent_name, t.thread_datestamp, t.thread_user, t.thread_views, t.thread_lastpost, t.thread_lastuser, t.thread_total_replies, f.forum_id, f.forum_name, f.forum_class, u.user_name, lp.user_name AS lp_name + FROM #forum_t AS t + LEFT JOIN #forum AS f ON f.forum_id = t.thread_forum_id + LEFT JOIN #user AS u ON t.thread_user = u.user_id + LEFT JOIN #user AS lp ON t.thread_lastuser = lp.user_id + WHERE t.thread_parent=0 AND f.forum_class REGEXP '".e_CLASS_REGEXP."' + ORDER BY t.thread_lastpost DESC LIMIT 0,".intval($arr[7]); + + } + + if(!$results = $sql->db_Select_gen($qry)) + { + $LIST_DATA = LIST_FORUM_2; + } + else + { + $forumArray = $sql->db_getList(); + $path = e_PLUGIN."forum/"; + + foreach($forumArray as $forumInfo) + { + extract($forumInfo); + + //last user + $r_id = substr($thread_lastuser, 0, strpos($thread_lastuser, ".")); + $r_name = substr($thread_lastuser, (strpos($thread_lastuser, ".")+1)); + if (strstr($thread_lastuser, chr(1))) { + $tmp = explode(chr(1), $thread_lastuser); + $r_name = $tmp[0]; + } + $thread_lastuser = $r_id; + + //user + $u_id = substr($thread_user, 0, strpos($thread_user, ".")); + $u_name = substr($thread_user, (strpos($thread_user, ".")+1)); + $thread_user = $u_id; + + if ($thread_anon) { + $tmp = explode(chr(1), $thread_anon); + $thread_user = $tmp[0]; + $thread_user_ip = $tmp[1]; + } + + $gen = new convert; + $r_datestamp = $gen->convert_date($thread_lastpost, "short"); + if($thread_total_replies) + { + $LASTPOST = ""; + if($lp_name) + { + $LASTPOST = "$lp_name"; + } + else + { + if($thread_lastuser{0} == "0") + { + $LASTPOST = substr($thread_lastuser, 2); + } + else + { + //$LASTPOST = NFPM_L16; + } + } + $LASTPOST .= " ".LIST_FORUM_6." $r_datestamp"; + } + else + { + $LASTPOST = " - "; + $LASTPOSTDATE = ""; + } + + if($parent_name == "") + { + $parent_name = $thread_name; + } + $rowheading = $this -> parse_heading($parent_name, $mode); + if($parent_id) + { + $lnk = $thread_id.".post"; + } + else + { + $lnk = $thread_id; + } + $HEADING = "".$rowheading.""; + $AUTHOR = ($arr[3] ? ($thread_anon ? $thread_user : "$user_name") : ""); + $CATEGORY = ($arr[4] ? "$forum_name" : ""); + $DATE = ($arr[5] ? $this -> getListDate($thread_datestamp, $mode) : ""); + $ICON = $bullet; + $VIEWS = $thread_views; + $REPLIES = $thread_total_replies; + if($thread_total_replies) + { + $INFO = "[ ".LIST_FORUM_3." ".$VIEWS.", ".LIST_FORUM_4." ".$REPLIES.", ".LIST_FORUM_5." ".$LASTPOST." ]"; + } + else + { + $INFO = "[ ".LIST_FORUM_3." ".intval($tviews)." ]"; + } + $LIST_DATA[$mode][] = array( $ICON, $HEADING, $AUTHOR, $CATEGORY, $DATE, $INFO ); + } + } + + +?> \ No newline at end of file diff --git a/e107_plugins/forum/e_rss.php b/e107_plugins/forum/e_rss.php new file mode 100644 index 000000000..4ca1f0737 --- /dev/null +++ b/e107_plugins/forum/e_rss.php @@ -0,0 +1,276 @@ +$v){ + $eplug_rss_feed[] = $v; +} + +function get_forum_rss(){ + $rss = array(); + + //forum threads (old url) + $feed['name'] = "Forum / threads"; + $feed['url'] = '6'; + $feed['topic_id'] = ''; + $feed['path'] = 'forum|threads'; + $feed['text'] = 'this is the rss feed for the forum_threads entries'; + $feed['class'] = '1'; + $feed['limit'] = '9'; + $rss[] = $feed; + + //forum threads (new url) + $feed['name'] = "Forum / threads"; + $feed['url'] = 'forumthreads'; + $feed['topic_id'] = ''; + $feed['path'] = 'forum|threads'; + $feed['text'] = 'this is the rss feed for the forum_threads entries'; + $feed['class'] = '0'; + $feed['limit'] = '9'; + $rss[] = $feed; + + //forum posts (old url) + $feed['name'] = "Forum / posts"; + $feed['url'] = '7'; + $feed['topic_id'] = ''; + $feed['path'] = 'forum|posts'; + $feed['text'] = 'this is the rss feed for the forum_posts entries'; + $feed['class'] = '1'; + $feed['limit'] = '9'; + $rss[] = $feed; + + //forum posts (new url) + $feed['name'] = "Forum / posts"; + $feed['url'] = 'forumposts'; + $feed['topic_id'] = ''; + $feed['path'] = 'forum|posts'; + $feed['text'] = 'this is the rss feed for the forum_posts entries'; + $feed['class'] = '0'; + $feed['limit'] = '9'; + $rss[] = $feed; + + //forum topic (old url) + $feed['name'] = "Forum / topic"; + $feed['url'] = '8'; + $feed['topic_id'] = '*'; + $feed['path'] = 'forum|topic'; + $feed['text'] = 'this is the rss feed for the forum_topic entries'; + $feed['class'] = '1'; + $feed['limit'] = '9'; + $rss[] = $feed; + + //forum topic (new url) + $feed['name'] = "Forum / topic"; + $feed['url'] = 'forumtopic'; + $feed['topic_id'] = '*'; + $feed['path'] = 'forum|topic'; + $feed['text'] = 'this is the rss feed for the forum_topic entries'; + $feed['class'] = '0'; + $feed['limit'] = '9'; + $rss[] = $feed; + + //forum name (old url) + $feed['name'] = "Forum / name"; + $feed['url'] = '11'; + $feed['topic_id'] = '*'; + $feed['path'] = 'forum|name'; + $feed['text'] = 'this is the rss feed for the forum_name entries'; + $feed['class'] = '1'; + $feed['limit'] = '9'; + $rss[] = $feed; + + //forum name (new url) + $feed['name'] = "Forum / name"; + $feed['url'] = 'forumname'; + $feed['topic_id'] = '*'; + $feed['path'] = 'forum|name'; + $feed['text'] = 'this is the rss feed for the forum_name entries'; + $feed['class'] = '0'; + $feed['limit'] = '9'; + $rss[] = $feed; + + return $rss; +} +//##### ------------------------------------------------------------------------------------ + + +//##### create rss data, return as array $eplug_rss_data ----------------------------------- +$sqlrss = new db; + +switch($this->parm){ + + case threads: + case 6: + $this -> rssQuery = + "SELECT t.thread_thread, t.thread_id, t.thread_name, t.thread_datestamp, t.thread_parent, t.thread_user, t.thread_views, t.thread_lastpost, t.thread_lastuser, t.thread_total_replies, u.user_name, u.user_email FROM #forum_t AS t + LEFT JOIN #user AS u ON SUBSTRING_INDEX(t.thread_user,'.',1) = u.user_id + LEFT JOIN #forum AS f ON f.forum_id = t.thread_forum_id + WHERE f.forum_class IN (0, 251, 252) AND t.thread_parent=0 + ORDER BY t.thread_datestamp DESC LIMIT 0,".$this -> limit; + $sqlrss->db_Select_gen($this -> rssQuery); + $tmp = $sqlrss->db_getList(); + + $rss = array(); + $i=0; + foreach($tmp as $value) { + + if($value['user_name']) { + $rss[$i]['author'] = $value['user_name']; + $rss[$i]['author_email'] = $value['user_email']; // must include an email address to be valid. + } else { + $tmp=explode(".", $value['thread_user'], 2); + list($rss[$i]['author'], $ip) = explode(chr(1), $tmp[1]); + } + + $rss[$i]['title'] = $value['thread_name']; + $rss[$i]['link'] = $e107->base_path.$PLUGINS_DIRECTORY."forum/forum_viewtopic.php?".$value['thread_id']; + $rss[$i]['description'] = $value['thread_thread']; + $rss[$i]['datestamp'] = $value['thread_datestamp']; + + $i++; + } + break; + + case posts: + case 7: + $this -> rssQuery = "SELECT tp.thread_name AS parent_name, t.thread_thread, t.thread_id, t.thread_name, t.thread_datestamp, t.thread_parent, t.thread_user, t.thread_views, t.thread_lastpost, t.thread_lastuser, t.thread_total_replies, f.forum_id, f.forum_name, f.forum_class, u.user_name, u.user_email FROM #forum_t AS t + LEFT JOIN #user AS u ON SUBSTRING_INDEX(t.thread_user,'.',1) = u.user_id + LEFT JOIN #forum_t AS tp ON t.thread_parent = tp.thread_id + LEFT JOIN #forum AS f ON f.forum_id = t.thread_forum_id + WHERE f.forum_class IN (0, 251, 252) + ORDER BY t.thread_datestamp DESC LIMIT 0,".$this -> limit; + $sqlrss->db_Select_gen($this -> rssQuery); + $tmp = $sqlrss->db_getList(); + $rss = array(); + $i=0; + foreach($tmp as $value) { + + if($value['user_name']) { + $rss[$i]['author'] = $value['user_name']; + $rss[$i]['author_email'] = $value['user_email']; // must include an email address to be valid. + } else { + $tmp=explode(".", $value['thread_user'], 2); + list($rss[$i]['author'], $ip) = explode(chr(1), $tmp[1]); + } + + if($value['parent_name']) { + $rss[$i]['title'] = "Re: ".$value['parent_name']; + $rss[$i]['link'] = $e107->base_path.$PLUGINS_DIRECTORY."forum/forum_viewtopic.php?".$value['thread_parent']; + } else { + $rss[$i]['title'] = $value['thread_name']; + $rss[$i]['link'] = $e107->base_path.$PLUGINS_DIRECTORY."forum/forum_viewtopic.php?".$value['thread_id']; + } + + $rss[$i]['description'] = $value['thread_thread']; + $rss[$i]['datestamp'] = $value['thread_datestamp']; + + $i++; + } + break; + + case topic: + case 8: + if(!$this -> topicid) { + return FALSE; + } + + /* get thread ... */ + $this -> rssQuery = "SELECT t.thread_name, t.thread_thread, t.thread_id, t.thread_name, t.thread_datestamp, t.thread_parent, t.thread_user, t.thread_views, t.thread_lastpost, f.forum_id, f.forum_name, f.forum_class, u.user_name + FROM #forum_t AS t + LEFT JOIN #user AS u ON SUBSTRING_INDEX(t.thread_user,'.',1) = u.user_id + LEFT JOIN #forum AS f ON f.forum_id = t.thread_forum_id + WHERE f.forum_class IN (0, 251, 255) AND t.thread_id=".intval($this -> topicid); + $sqlrss->db_Select_gen($this -> rssQuery); + $topic = $sqlrss->db_Fetch(); + + /* get replies ... */ + $this -> rssQuery = "SELECT t.thread_name, t.thread_thread, t.thread_id, t.thread_name, t.thread_datestamp, t.thread_parent, t.thread_user, t.thread_views, t.thread_lastpost, f.forum_id, f.forum_name, f.forum_class, u.user_name, u.user_email + FROM #forum_t AS t + LEFT JOIN #user AS u ON SUBSTRING_INDEX(t.thread_user,'.',1) = u.user_id + LEFT JOIN #forum AS f ON f.forum_id = t.thread_forum_id + WHERE f.forum_class IN (0, 251, 255) AND t.thread_parent=".intval($this -> topicid); + $sqlrss->db_Select_gen($this -> rssQuery); + $replies = $sqlrss->db_getList(); + + $rss = array(); + $i = 0; + + if($value['user_name']) { + $rss[$i]['author'] = $value['user_name'] . " ( ".$e107->base_path."user.php?id.".intval($value['thread_user'])." )"; + } else { + $tmp=explode(".", $value['thread_user'], 2); + list($rss[$i]['author'], $ip) = explode(chr(1), $tmp[1]); + } + + $rss[$i]['title'] = $topic['thread_name']; + $rss[$i]['link'] = $e107->base_path.$PLUGINS_DIRECTORY."forum/forum_viewtopic.php?".$topic['thread_id']; + $rss[$i]['description'] = $topic['thread_thread']; + $rss[$i]['datestamp'] = $topic['thread_datestamp']; + $i ++; + foreach($replies as $value) { + if($value['user_name']) { + $rss[$i]['author'] = $value['user_name']; + $rss[$i]['author_email'] = $value['user_email']; // must include an email address to be valid. + } else { + $tmp=explode(".", $value['thread_user'], 2); + list($rss[$i]['author'], $ip) = explode(chr(1), $tmp[1]); + } + $rss[$i]['title'] = "Re: ".$topic['thread_name']; + $rss[$i]['link'] = $e107->base_path.$PLUGINS_DIRECTORY."forum/forum_viewtopic.php?".$this -> topicid; + $rss[$i]['description'] = $value['thread_thread']; + $rss[$i]['datestamp'] = $value['thread_datestamp']; + $i++; + } + break; + + case name: + case 11: + if(!$this -> topicid) { + return FALSE; + } + + $this -> rssQuery = " + SELECT f.forum_id, f.forum_name, f.forum_class, tp.thread_name AS parent_name, t.*, u.user_name, u.user_email + FROM #forum_t as t + LEFT JOIN #user AS u ON SUBSTRING_INDEX(t.thread_user,'.',1) = u.user_id + LEFT JOIN #forum_t AS tp ON t.thread_parent = tp.thread_id + LEFT JOIN #forum AS f ON f.forum_id = t.thread_forum_id + WHERE t.thread_forum_id = ".intval($this->topicid)." AND f.forum_class IN (0, 251, 255) + ORDER BY t.thread_datestamp DESC LIMIT 0,".$this -> limit; + + $sqlrss->db_Select_gen($this -> rssQuery); + $tmp = $sqlrss->db_getList(); + $this -> contentType = $this -> contentType." : ".$tmp[1]['forum_name']; + $rss = array(); + $i=0; + foreach($tmp as $value) { + if($value['user_name']) { + $rss[$i]['author'] = $value['user_name']; + $rss[$i]['author_email'] = $value['user_email']; + } else { + $tmp=explode(".", $value['thread_user'], 2); + list($rss[$i]['author'], $ip) = explode(chr(1), $tmp[1]); + } + + if($value['parent_name']) { + $rss[$i]['title'] = "Re: ".$value['parent_name']; + $rss[$i]['link'] = $e107->base_path.$PLUGINS_DIRECTORY."forum/forum_viewtopic.php?".$value['thread_id'].".post"; + } else { + $rss[$i]['title'] = $value['thread_name']; + $rss[$i]['link'] = $e107->base_path.$PLUGINS_DIRECTORY."forum/forum_viewtopic.php?".$value['thread_id']; + } + $rss[$i]['description'] = $value['thread_thread']; + $rss[$i]['datestamp'] = $value['thread_datestamp']; + $i++; + } + break; +} + +$eplug_rss_data[] = $rss; +//##### ------------------------------------------------------------------------------------ + +?> \ No newline at end of file diff --git a/e107_plugins/forum/e_search.php b/e107_plugins/forum/e_search.php new file mode 100644 index 000000000..3acc91332 --- /dev/null +++ b/e107_plugins/forum/e_search.php @@ -0,0 +1,17 @@ + e_PLUGIN.'forum/search/search_parser.php', + 'qtype' => FOR_SCH_LAN_1, + 'refpage' => 'forum', + 'advanced' => e_PLUGIN.'forum/search/search_advanced.php', + 'id' => 'forum' + ); + +?> \ No newline at end of file diff --git a/e107_plugins/forum/e_status.php b/e107_plugins/forum/e_status.php new file mode 100644 index 000000000..a0c79087a --- /dev/null +++ b/e107_plugins/forum/e_status.php @@ -0,0 +1,6 @@ + db_Count("forum_t"); +$text .= "
    ".E_16_FORUM." ".ADLAN_113.": ".$forum_posts."
    "; +?> \ No newline at end of file diff --git a/e107_plugins/forum/forum.php b/e107_plugins/forum/forum.php new file mode 100644 index 000000000..7d88d969c --- /dev/null +++ b/e107_plugins/forum/forum.php @@ -0,0 +1,525 @@ +db_Update("user", "user_realm='".$tp -> toDB($tmp, true)."' WHERE user_id='".USERID."' "); + header("location:".e_SELF."?track"); + exit; +} + +//Mark all threads as read +if (e_QUERY == "mark.all.as.read") +{ + $forum->forum_markasread('all'); + header("location:".e_SELF); + exit; +} + +//Mark all threads in specific forum as read +if (strstr(e_QUERY, 'mfar')) +{ + $tmp = explode(".", e_QUERY); + $forum_id = intval($tmp[1]); + $forum->forum_markasread($forum_id); + header("location:".e_SELF); + exit; +} + +if (e_QUERY == 'rules') +{ + include_once(HEADERF); + forum_rules('show'); + include_once(FOOTERF); + exit; +} + +$gen = new convert; + +$FORUMTITLE = LAN_46; +$THREADTITLE = LAN_47; +$REPLYTITLE = LAN_48; +$LASTPOSTITLE = LAN_49; +$INFOTITLE = LAN_191; +$LOGO = IMAGE_e; +$NEWTHREADTITLE = LAN_424; +$POSTEDTITLE = LAN_423; +$NEWIMAGE = IMAGE_new_small; +$TRACKTITLE = LAN_397; + +$rules_text = forum_rules('check'); +$USERINFO = "".LAN_429." | ".LAN_430.""; +if(USER) +{ + $USERINFO .= " | ".LAN_431." | ".LAN_432." | ".LAN_435.""; + if($pref['forum_attach'] && (check_class($pref['upload_class']) || getperms('0'))) + { + $USERINFO .= " | ".FORLAN_442.""; + } +} +if($rules_text != '') +{ + $USERINFO .= " | ".LAN_433.""; +} +$total_topics = $sql->db_Count("forum_t", "(*)", " WHERE thread_parent='0' "); +$total_replies = $sql->db_Count("forum_t", "(*)", " WHERE thread_parent!='0' "); +$total_members = $sql->db_Count("user"); +$newest_member = $sql->db_Select("user", "*", "user_ban='0' ORDER BY user_join DESC LIMIT 0,1"); +list($nuser_id, $nuser_name) = $sql->db_Fetch(); +if(!defined("e_TRACKING_DISABLED")) +{ + $member_users = $sql->db_Select("online", "*", "online_location REGEXP('forum.php') AND online_user_id!='0' "); + $guest_users = $sql->db_Select("online", "*", "online_location REGEXP('forum.php') AND online_user_id='0' "); + $users = $member_users+$guest_users; + $USERLIST = LAN_426; + global $listuserson; + $c = 0; + if(is_array($listuserson)) + { + foreach($listuserson as $uinfo => $pinfo) + { + list($oid, $oname) = explode(".", $uinfo, 2); + $c ++; + $USERLIST .= "$oname".($c == MEMBERS_ONLINE ? "." :", "); + } + } + $USERLIST .= "
    ".LAN_427." ".LAN_436; +} +$STATLINK = "".LAN_441."\n"; +$ICONKEY = " +\n + + + + + + +\n
    ".IMAGE_new_small."".LAN_79."".IMAGE_nonew_small."".LAN_80."".IMAGE_closed_small."".LAN_394."
    \n"; + +$SEARCH = " +
    +

    + + + + +

    +
    \n"; + +$PERMS = (USER == TRUE || ANON == TRUE ? LAN_204." - ".LAN_206." - ".LAN_208 : LAN_205." - ".LAN_207." - ".LAN_209); + +$INFO = ""; +if (USER == TRUE) +{ + $total_new_threads = $sql->db_Count('forum_t', '(*)', "WHERE thread_datestamp>'".USERLV."' "); + if (USERVIEWED != "") + { + $tmp = explode("..", USERVIEWED); + $total_read_threads = count($tmp); + } + else + { + $total_read_threads = 0; + } + + $INFO = LAN_30." ".USERNAME."
    "; + $lastvisit_datestamp = $gen->convert_date(USERLV, 'long'); + $datestamp = $gen->convert_date(time(), "long"); + if (!$total_new_threads) + { + $INFO .= LAN_31; + } + elseif($total_new_threads == 1) + { + $INFO .= LAN_32; + } + else + { + $INFO .= LAN_33." ".$total_new_threads." ".LAN_34." "; + } + $INFO .= LAN_35; + if ($total_new_threads == $total_read_threads && $total_new_threads != 0 && $total_read_threads >= $total_new_threads) + { + $INFO .= LAN_198; + $allread = TRUE; + } + elseif($total_read_threads != 0) + { + $INFO .= " (".LAN_196.$total_read_threads.LAN_197.")"; + } + + $INFO .= "
    + ".LAN_36." ".$lastvisit_datestamp."
    + ".LAN_37." ".$datestamp; +} +else +{ + $INFO .= ""; + if (ANON == TRUE) + { + $INFO .= LAN_410."
    ".LAN_44." ".LAN_437." ".LAN_438; + } + elseif(USER == FALSE) + { + $INFO .= LAN_410."
    ".LAN_45." ".LAN_439." ".LAN_440; + } +} + +if (USER && $allread != TRUE && $total_new_threads && $total_new_threads >= $total_read_threads) +{ + $INFO .= "
    ".LAN_199."".(e_QUERY != "new" ? ", ".LAN_421."" : ""); +} + +if (USER && USERREALM && e_QUERY != "track") +{ + $INFO .= "
    ".LAN_393.""; +} + +$FORUMINFO = LAN_192.($total_topics+$total_replies)." ".LAN_404." ($total_topics ".($total_topics == 1 ? LAN_411 : LAN_413).", $total_replies ".($total_replies == 1 ? LAN_412 : LAN_414).").".(!defined("e_TRACKING_DISABLED") ? "" : "
    ".$users." ".($users == 1 ? LAN_415 : LAN_416)." (".$member_users." ".($member_users == 1 ? LAN_417 : LAN_419).", ".$guest_users." ".($guest_users == 1 ? LAN_418 : LAN_420).")
    ".LAN_42.$total_members."
    ".LAN_41."".$nuser_name.".\n"); + +if (!isset($FORUM_MAIN_START)) +{ + if (file_exists(THEME."forum_template.php")) + { + include_once(THEME."forum_template.php"); + } +} +include(e_PLUGIN."forum/templates/forum_template.php"); +require_once(HEADERF); + +$parent_list = $forum->forum_getparents(); +$forum_list = $forum->forum_getforums(); +$sub_list = $forum->forum_getsubs(); +$newflag_list = $forum->forum_newflag_list(); + +if (!$parent_list) +{ + $ns->tablerender(PAGE_NAME, "
    ".LAN_51."
    ", array('forum', '51')); + require_once(FOOTERF); + exit; +} + +$forum_string = ""; +foreach ($parent_list as $parent) { + $status = parse_parent($parent); + $PARENTSTATUS = $status[0]; + if ($status[1]) { + $PARENTNAME = $parent['forum_name']; + $forum_string .= preg_replace("/\{(.*?)\}/e", '$\1', $FORUM_MAIN_PARENT); + // $forums = $forum->forum_getforums($parent['forum_id']); + if (!count($forum_list[$parent['forum_id']])) + { + $text .= "".LAN_52.""; + } + else + { + foreach($forum_list[$parent['forum_id']] as $f) + { + if ($f['forum_class'] == e_UC_ADMIN && ADMIN) + { + $forum_string .= parse_forum($f, LAN_406); + } + elseif($f['forum_class'] == e_UC_MEMBER && USER) + { + $forum_string .= parse_forum($f, LAN_407); + } + elseif($f['forum_class'] == e_UC_READONLY) + { + $forum_string .= parse_forum($f, LAN_408); + } + elseif($f['forum_class'] && check_class($f['forum_class'])) + { + $forum_string .= parse_forum($f, LAN_409); + } + elseif(!$f['forum_class']) + { + $forum_string .= parse_forum($f); + } + } + if (isset($FORUM_MAIN_PARENT_END)) + { + $forum_string .= preg_replace("/\{(.*?)\}/e", '$\1', $FORUM_MAIN_PARENT_END); + } + } + } +} + +function parse_parent($parent) +{ + if(check_class($parent['forum_class'])) + { + $status[0]=""; + $status[1] = TRUE; + if(!check_class($parent['forum_postclass'])) + { + $status[0] = "( ".LAN_405." )"; + } + } + else + { + $status[1] = FALSE; + } + return $status; +} + +function parse_forum($f, $restricted_string = "") +{ + global $FORUM_MAIN_FORUM, $gen, $forum, $tp, $newflag_list, $sub_list; + + if(USER && is_array($newflag_list) && in_array($f['forum_id'], $newflag_list)) + { + $NEWFLAG = "".IMAGE_new.""; + } + else + { + $NEWFLAG = IMAGE_nonew; + } + + if(substr($f['forum_name'], 0, 1) == "*") + { + $f['forum_name'] = substr($f['forum_name'], 1); + } + $f['forum_name'] = $tp -> toHTML($f['forum_name'], TRUE, "no_hook"); + $f['forum_description'] = $tp -> toHTML($f['forum_description'], TRUE, "no_hook"); + + $FORUMNAME = "{$f['forum_name']}"; + $FORUMDESCRIPTION = $f['forum_description'].($restricted_string ? "
    $restricted_string" : ""); + $THREADS = $f['forum_threads']; + $REPLIES = $f['forum_replies']; + $FORUMSUBFORUMS = ""; + + if(is_array($sub_list[$f['forum_parent']][$f['forum_id']])) + { + list($lastpost_datestamp, $lastpost_thread) = explode(".", $f['forum_lastpost_info']); + $ret = parse_subs($sub_list[$f['forum_parent']][$f['forum_id']], $lastpost_datestamp); + $FORUMSUBFORUMS = "
    ".FORLAN_444.": {$ret['text']}
    "; + $THREADS += $ret['threads']; + $REPLIES += $ret['replies']; + if(isset($ret['lastpost_info'])) + { + $f['forum_lastpost_info'] = $ret['lastpost_info']; + $f['user_name'] = $ret['user_name']; + } + } + + if ($f['forum_lastpost_user']) + { + list($lastpost_datestamp, $lastpost_thread) = explode(".", $f['forum_lastpost_info']); + $tmp = explode(".", $f['forum_lastpost_user'], 2); + if ($f['user_name']) + { + $lastpost_name = "{$f['user_name']}"; + } + else + { + if(!$tmp[1]) + { + $lastpost_name = FORLAN_443; + } + else + { + $lastpost_name = $tp->toHTML($tmp[1]); + } + } + $lastpost_datestamp = $gen->convert_date($lastpost_datestamp, 'forum'); + $LASTPOST = $lastpost_datestamp.'
    '.$lastpost_name." ".IMAGE_post2.''; + } + else + { + $LASTPOST = "-"; + } + return(preg_replace("/\{(.*?)\}/e", '$\1', $FORUM_MAIN_FORUM)); +} + +function parse_subs($subList, $lastpost_datestamp) +{ + $ret = array(); + $ret['text'] = ""; + foreach($subList as $sub) + { + $ret['text'] .= ($ret['text'] ? ", " : ""); + $ret['text'] .= "{$sub['forum_name']}"; + $ret['threads'] += $sub['forum_threads']; + $ret['replies'] += $sub['forum_replies']; + $tmp = explode(".", $sub['forum_lastpost_info']); + if($tmp[0] > $lastpost_datestamp) + { + $ret['lastpost_info'] = $sub['forum_lastpost_info']; + $ret['user_name'] = $sub['user_name']; + $lastpost_datestamp = $tmp[0]; + } + } + return $ret; +} + +if (e_QUERY == "track") +{ + $sql2 = new db; + $tmp = explode("-", USERREALM); + foreach($tmp as $key => $value) + { + if ($value) + { + if($sql->db_Select("forum_t", "thread_id, thread_datestamp, thread_name", "thread_id='".intval($value)."' ")) + { + $row = $sql->db_Fetch(); + //extract($row); + $NEWIMAGE = IMAGE_nonew_small; + if ($row['thread_datestamp'] > USERLV && (strpos(USERVIEWED, ".".$row['thread_id'].".") === FALSE)) + { + $NEWIMAGE = IMAGE_new_small; + } + elseif($sql2->db_SELECT("forum_t", "thread_id", "thread_parent='{$row['thread_id']}' AND thread_datestamp > '".USERLV."' ")) + { + while ($xrow = $sql2->db_Fetch()) + { + if (strpos(USERVIEWED, ".".$xrow['thread_id'].".") === FALSE) + { + $NEWIMAGE = IMAGE_new_small; + } + } + } + $result = preg_split("/\]/", $row['thread_name']); + $TRACKPOSTNAME = (($result[1] && $row['thread_name']{0} == "[") ? $result[0]."] ".preg_replace("/\[.*\]/", "", $row['thread_name'])."" : "".$row['thread_name'].""); + $UNTRACK = "".LAN_392.""; + $forum_trackstring .= preg_replace("/\{(.*?)\}/e", '$\1', $FORUM_TRACK_MAIN); + } + } + } + + $forum_track_start = preg_replace("/\{(.*?)\}/e", '$\1', $FORUM_TRACK_START); + $forum_track_end = preg_replace("/\{(.*?)\}/e", '$\1', $FORUM_TRACK_END); + + if ($pref['forum_enclose']) + { + $ns->tablerender($pref['forum_title'], $forum_track_start.$forum_trackstring.$forum_track_end, array('forum', 'main1')); + } + else + { + echo $forum_track_start.$forum_trackstring.$forum_track_end; + } +} + +if (e_QUERY == "new") +{ + $newpostList = $forum->post_getnew(10); + foreach($newpostList as $post) + { + list($author_id, $author_info) = explode(".", $post['thread_user'], 2); + list($author_name, $tmp) = explode(chr(1), $author_info); + $datestamp = $gen->convert_date($post['thread_datestamp'], "forum"); + if($author_id == 0) + { + $STARTERTITLE = $author_name."
    ".$datestamp; + } + else + { + $STARTERTITLE = "$author_name
    ".$datestamp; + } + if($post['post_subject']) + { + $NEWSPOSTNAME = "".LAN_425.$tp->toHTML($post['post_subject'], TRUE, 'no_make_clickable, no_hook').""; + } + else + { + $NEWSPOSTNAME = "".$tp->toHTML($post['thread_name'], TRUE, 'no_make_clickable, no_hook').""; + } + + $forum_newstring .= preg_replace("/\{(.*?)\}/e", '$\1', $FORUM_NEWPOSTS_MAIN); + } + + if (!$newpostList) + { + $NEWSPOSTNAME = LAN_198; + $forum_newstring = preg_replace("/\{(.*?)\}/e", '$\1', $FORUM_NEWPOSTS_MAIN); + } + $forum_new_start = preg_replace("/\{(.*?)\}/e", '$\1', $FORUM_NEWPOSTS_START); + $forum_new_end = preg_replace("/\{(.*?)\}/e", '$\1', $FORUM_NEWPOSTS_END); + + if ($pref['forum_enclose']) + { + $ns->tablerender($pref['forum_title'], $forum_new_start.$forum_newstring.$forum_new_end, array('forum', 'main2')); + } + else + { + echo $forum_new_start.$forum_newstring.$forum_new_end; + } +} + +$forum_main_start = preg_replace("/\{(.*?)\}/e", '$\1', $FORUM_MAIN_START); +$forum_main_end = preg_replace("/\{(.*?)\}/e", '$\1', $FORUM_MAIN_END); +if ($pref['forum_enclose']) +{ + $ns->tablerender($pref['forum_title'], $forum_main_start.$forum_string.$forum_main_end, array('forum', 'main3')); +} +else +{ + echo $forum_main_start.$forum_string.$forum_main_end; +} +require_once(FOOTERF); + +function forum_rules($action = 'check') +{ + global $tp, $sql, $ns; + if (ADMIN == TRUE) + { + $type = 'forum_rules_admin'; + } + elseif(USER == TRUE) + { + $type = 'forum_rules_member'; + } + else + { + $type = 'forum_rules_guest'; + } + $result = $sql->db_Select('generic', 'gen_chardata', "gen_type = '$type' AND gen_intdata = 1"); + if ($action == 'check') + { + if ($result) + { + return TRUE; + } + else + { + return FALSE; + } + } + if ($result) + { + $row = $sql->db_Fetch(); + $rules_text = $tp->toHTML($row['gen_chardata'], TRUE); + } + else + { + $rules_text = FORLAN_441; + } + $ns->tablerender(LAN_433, "
    {$rules_text}
    ", array('forum', 'forum_rules')); +} +?> \ No newline at end of file diff --git a/e107_plugins/forum/forum_admin.php b/e107_plugins/forum/forum_admin.php new file mode 100644 index 000000000..c6f771842 --- /dev/null +++ b/e107_plugins/forum/forum_admin.php @@ -0,0 +1,1506 @@ +"); +define("IMAGE_sub", "".FORLAN_145.""); +define("IMAGE_nosub", "".FORLAN_145.""); + +$deltest = array_flip($_POST); +if (e_QUERY) +{ + $tmp = explode(".", e_QUERY); + $action = $tmp[0]; + $sub_action = $tmp[1]; + $id = $tmp[2]; + unset($tmp); +} + +if(isset($_POST['delete'])) +{ + $tmp = array_pop(array_flip($_POST['delete'])); + list($delete, $del_id) = explode("_", $tmp); +} + +if(isset($_POST['setMods'])) +{ + foreach($_POST['mods'] as $fid => $modid) + { + $sql->db_Update('forum',"forum_moderators = '{$modid}' WHERE forum_id = {$fid}"); + } + $forum->show_message(FORLAN_144); +} + +if(isset($_POST['tools'])) +{ + $msg = ""; + if(isset($_POST['forum_all'])) + { + $fList[]='all'; + } + else + { + foreach(array_keys($_POST['forumlist']) as $k) + { + $fList[] = $k; + } + } + foreach($fList as $fid) + { + if(isset($_POST['counts'])) + { + $for->forum_update_counts($fid, $_POST['counts_threads']); + $msg .= FORLAN_167.": $fid
    "; + } + if(isset($_POST['lastpost'])) + { + $with_threads = (isset($_POST['lastpost_nothread'])) ? FALSE : TRUE; + $for->update_lastpost('forum', $fid, $with_threads); + $msg .= FORLAN_168.": $fid
    "; + } + } + if(isset($_POST['userpostcounts'])) + { + $list = $for->get_user_counts(); + foreach($list as $uid => $cnt) + { + $sql->db_Update("user","user_forums = '{$cnt}' WHERE user_id = '{$uid}'"); + } + $msg .= FORLAN_169."
    "; + } + + $forum->show_message($msg); +} + +if(isset($_POST['create_sub'])) +{ + $fid = intval($sub_action); + $_name = $tp->toDB($_POST['subname_new']); + $_desc = $tp->toDB($_POST['subdesc_new']); + $_order = intval($_POST['suborder_new']); + if($_name != "" && $sql->db_Select('forum', '*', "forum_id = {$fid}")) + { + $row = $sql->db_Fetch(); + if($sql->db_Insert("forum", "0, '{$_name}', '{$_desc}', '{$row['forum_parent']}', '{$fid}', '".time()."', '{$row['forum_moderators']}', 0, 0, '', '', '{$row['forum_class']}', '{$_order}', '{$row['forum_postclass']}'")) + { + $forum->show_message(LAN_CREATED); + } + else + { + $forum->show_message(LAN_CREATED_FAILED); + } + } +} + +if(isset($_POST['update_subs'])) +{ + $msg = ""; + foreach(array_keys($_POST['subname']) as $id) + { + if($_POST['subname'][$id] == "") + { + if ($sql->db_Delete("forum", "forum_id='$id' ")) + { + $msg .= FORLAN_150." ".$id." ".LAN_DELETED."
    "; + $cnt = $sql->db_Delete("forum_t", "thread_forum_id = {$id}"); + $msg .= $cnt." ".FORLAN_152." ".LAN_DELETED."
    "; + } + } + else + { + $_name = $tp->toDB($_POST['subname'][$id]); + $_desc = $tp->toDB($_POST['subdesc'][$id]); + $_order = intval($_POST['suborder'][$id]); + if($sql->db_Update("forum", "forum_name='{$_name}', forum_description='{$_desc}', forum_order='{$_order}' WHERE forum_id = {$id}")) + { + $msg .= FORLAN_150." ".$id." ".LAN_UPDATED."
    "; + } + } + } + if($msg) + { + $forum->show_message($msg); + } +} + +if(isset($_POST['submit_parent'])) +{ + $_POST['forum_name'] = $tp->toDB($_POST['forum_name']); + $sql->db_Insert("forum", "0, '".$_POST['forum_name']."', '', '0', '0', '".time()."', '', '0', '0', '', '', '".$_POST['forum_class']."', '0', '{$_POST['forum_postclass']}'"); + $forum->show_message(FORLAN_13); +} + +if(isset($_POST['update_parent'])) +{ + $_POST['forum_name'] = $tp->toDB($_POST['forum_name']); + $sql->db_Update("forum", "forum_name='".$_POST['forum_name']."', forum_class='".$_POST['forum_class']."', forum_postclass='{$_POST['forum_postclass']}' WHERE forum_id=$id"); + $forum->show_message(FORLAN_14); + $action = "main"; +} + +if(isset($_POST['submit_forum'])) +{ + $mods = $_POST['forum_moderators']; + $_POST['forum_name'] = $tp->toDB($_POST['forum_name']); + $_POST['forum_description'] = $tp->toDB($_POST['forum_description']); + $sql->db_Insert("forum", "0, '".$_POST['forum_name']."', '".$_POST['forum_description']."', '".$_POST['forum_parent']."', '0', '".time()."', '".$mods."', 0, 0, '', '', '".$_POST['forum_class']."', 0, '{$_POST['forum_postclass']}'"); + $forum->show_message(FORLAN_11); +} + +if(isset($_POST['update_forum'])) +{ + $mods = $_POST['forum_moderators']; + $_POST['forum_name'] = $tp->toDB($_POST['forum_name']); + $_POST['forum_description'] = $tp->toDB($_POST['forum_description']); + $forum_parent = $row['forum_id']; + $sql->db_Update("forum", "forum_name='".$_POST['forum_name']."', forum_description='".$_POST['forum_description']."', forum_parent='".$_POST['forum_parent']."', forum_moderators='".$mods."', forum_class='".$_POST['forum_class']."', forum_postclass='{$_POST['forum_postclass']}' WHERE forum_id=$id"); + $sql->db_Update("forum", "forum_moderators='".$mods."', forum_class='".$_POST['forum_class']."', forum_postclass='{$_POST['forum_postclass']}' WHERE forum_sub=$id"); + $forum->show_message(FORLAN_12); + $action = "main"; +} + +if (isset($_POST['update_order'])) +{ + extract($_POST); + while (list($key, $id) = each($forum_order)) + { + $tmp = explode(".", $id); + $sql->db_Update("forum", "forum_order=".$tmp[1]." WHERE forum_id=".$tmp[0]); + } + $forum->show_message(FORLAN_73); +} + +if (isset($_POST['updateoptions'])) +{ + $pref['email_notify'] = $_POST['email_notify']; + $pref['email_notify_on'] = $_POST['email_notify_on']; + $pref['forum_poll'] = $_POST['forum_poll']; + $pref['forum_popular'] = $_POST['forum_popular']; + $pref['forum_track'] = $_POST['forum_track']; + $pref['forum_eprefix'] = $_POST['forum_eprefix']; + $pref['forum_enclose'] = $_POST['forum_enclose']; + $pref['forum_title'] = $_POST['forum_title']; + $pref['forum_postspage'] = $_POST['forum_postspage']; + $pref['html_post'] = $_POST['html_post']; + $pref['forum_attach'] = $_POST['forum_attach']; + $pref['forum_redirect'] = $_POST['forum_redirect']; + $pref['forum_user_customtitle'] = $_POST['forum_user_customtitle']; + $pref['reported_post_email'] = $_POST['reported_post_email']; + $pref['forum_tooltip'] = $_POST['forum_tooltip']; + $pref['forum_tiplength'] = $_POST['forum_tiplength']; + $pref['forum_hilightsticky'] = $_POST['forum_hilightsticky']; + $pref['forum_maxwidth'] = $_POST['forum_maxwidth']; + $pref['forum_linkimg'] = $_POST['forum_linkimg']; + save_prefs(); + $forum->show_message(FORLAN_10); +} + +if (isset($_POST['do_prune'])) +{ + $msg = $for->forum_prune($_POST['prune_type'], $_POST['prune_days'], $_POST['pruneForum']); + $forum->show_message($msg); + $action = "main"; +} + +if (isset($_POST['set_ranks'])) +{ + extract($_POST); + for($a = 0; $a <= 9; $a++) + { + $r_names .= $tp->toDB($rank_names[$a]).","; + $r_thresholds .= $tp->toDB($rank_thresholds[$a]).","; + $r_images .= $tp->toDB($rank_images[$a]).","; + } + $pref['rank_main_admin'] = $_POST['rank_main_admin']; + $pref['rank_main_admin_image'] = $_POST['rank_main_admin_image']; + $pref['rank_admin'] = $_POST['rank_admin']; + $pref['rank_admin_image'] = $_POST['rank_admin_image']; + $pref['rank_moderator'] = $_POST['rank_moderator']; + $pref['rank_moderator_image'] = $_POST['rank_moderator_image']; + $pref['forum_levels'] = $r_names; + $pref['forum_thresholds'] = $r_thresholds; + $pref['forum_images'] = $r_images; + save_prefs(); + $forum->show_message(FORLAN_95); +} + +if (isset($_POST['frsubmit'])) +{ + $guestrules = $tp->toDB($_POST['guestrules']); + $memberrules = $tp->toDB($_POST['memberrules']); + $adminrules = $tp->toDB($_POST['adminrules']); + if(!$sql->db_Update("generic", "gen_chardata ='$guestrules', gen_intdata='".$_POST['guest_active']."' WHERE gen_type='forum_rules_guest' ")) + { + $sql -> db_Insert("generic", "0, 'forum_rules_guest', '".time()."', 0, '', '".$_POST['guest_active']."', '$guestrules' "); + } + if(!$sql->db_Update("generic", "gen_chardata ='$memberrules', gen_intdata='".$_POST['member_active']."' WHERE gen_type='forum_rules_member' ")) + { + $sql -> db_Insert("generic", "0, 'forum_rules_member', '".time()."', 0, '', '".$_POST['member_active']."', '$memberrules' "); + } + if(!$sql->db_Update("generic", "gen_chardata ='$adminrules', gen_intdata='".$_POST['admin_active']."' WHERE gen_type='forum_rules_admin' ")) + { + $sql -> db_Insert("generic", "0, 'forum_rules_admin', '".time()."', 0, '', '".$_POST['admin_active']."', '$adminrules' "); + } +} + + +if ($delete == 'main') { + if ($sql->db_Delete("forum", "forum_id='$del_id' ")) { + $forum->show_message(FORLAN_96); + } +} + +if ($action == "create") +{ + if ($sql->db_Select("forum", "*", "forum_parent='0' ")) + { + $forum->create_forums($sub_action, $id); + } + else + { + header("location:".e_ADMIN."forum.php"); + exit; + } +} + +if ($delete == 'cat') +{ + if ($sql->db_Delete("forum", "forum_id='$del_id' ")) + { + $sql->db_Delete("forum", "forum_parent='$del_id' "); + $forum->show_message(FORLAN_97); + $action = "main"; + } +} + +if($action == "delete") +{ + $forum->delete_item(intval($sub_action)); +} + +if ($action == "cat") { + $forum->create_parents($sub_action, $id); +} + +if ($action == "order") { + $forum->show_existing_forums($sub_action, $id, TRUE); +} + +if ($action == "opt") +{ + $forum->show_prefs(); +} + +if ($action == "mods") +{ + $forum->show_mods(); +} + +if ($action == "tools") +{ + $forum->show_tools(); +} + +if ($action == "prune") +{ + $forum->show_prune(); +} + +if ($action == "rank") +{ + $forum->show_levels(); +} + +if ($action == "rules") +{ + $forum->show_rules(); +} + +if($action == 'subs') +{ + $forum->show_subs($sub_action); +} + +if ($delete == 'reported') +{ + $sql->db_Delete("generic", "gen_id='$del_id' "); + $forum->show_message(FORLAN_118); +} + + +if ($action == "sr") +{ + $forum->show_reported($sub_action); +} + +if (!e_QUERY || $action == "main") +{ + $forum->show_existing_forums($sub_action, $id); +} + +//$forum->show_options($action); +require_once(e_ADMIN."footer.php"); +function headerjs() +{ + global $tp; + // These functions need to be removed and replaced with the generic jsconfirm() function. + $headerjs = ""; + return $headerjs; +} + +class forum +{ + + function show_options($action) + { + global $sql; + if ($action == "") + { + $action = "main"; + } + // ##### Display options --------------------------------------------------------------------------------------------------------- + $var['main']['text'] = FORLAN_76; + $var['main']['link'] = e_SELF; + $var['cat']['text'] = FORLAN_83; + $var['cat']['link'] = e_SELF."?cat"; + if ($sql->db_Select("forum", "*", "forum_parent='0' ")) + { + $var['create']['text'] = FORLAN_77; + $var['create']['link'] = e_SELF."?create"; + } + $var['order']['text'] = FORLAN_78; + $var['order']['link'] = e_SELF."?order"; + $var['opt']['text'] = FORLAN_79; + $var['opt']['link'] = e_SELF."?opt"; + $var['prune']['text'] = FORLAN_59; + $var['prune']['link'] = e_SELF."?prune"; + $var['rank']['text'] = FORLAN_63; + $var['rank']['link'] = e_SELF."?rank"; + $var['rules']['text'] = FORLAN_123; + $var['rules']['link'] = e_SELF."?rules"; + $var['sr']['text'] = FORLAN_116; + $var['sr']['link'] = e_SELF."?sr"; + $var['mods']['text'] = FORLAN_33; + $var['mods']['link'] = e_SELF."?mods"; + $var['tools']['text'] = FORLAN_153; + $var['tools']['link'] = e_SELF."?tools"; + + show_admin_menu(FORLAN_7, $action, $var); + } + + function delete_item($id) + { + global $sql; + $id = intval($id); + $confirm = isset($_POST['confirm']) ? TRUE : FALSE; + + if($sql->db_Select('forum', '*', "forum_id = {$id}")) + { + $txt = ""; + $row = $sql->db_Fetch(); + if($row['forum_parent'] == 0) + { + $txt .= $this->delete_parent($id, $confirm); + } + elseif($row['forum_sub'] > 0) + { + $txt .= $this->delete_sub($id, $confirm); + } + else + { + $txt .= $this->delete_forum($id, $confirm); + } + if($confirm) + { + $this->show_message($txt); + } + else + { + $this->delete_show_confirm($txt); + } + } + } + + function delete_parent($id, $confirm = FALSE) + { + global $sql; + $ret = ""; + if($sql->db_Select("forum", "forum_id", "forum_parent = {$id} AND forum_sub = 0")) + { + $fList = $sql->db_getList(); + foreach($fList as $f) + { + $ret .= $this->delete_forum($f['forum_id'], $confirm); + } + } + if($confirm) + { + if($sql->db_Delete("forum", "forum_id = {$id}")) + { + $ret .= "Forum parent successfully deleted"; + } + else + { + $ret .= "Forum parent could not be deleted"; + } + return $ret; + } + return "The forum parent has the following info:
    ".$ret; + + } + + function delete_forum($id, $confirm = FALSE) + { + global $sql, $tp; + $ret = ""; + if($sql->db_Select("forum", "forum_id", "forum_sub = {$id}")) + { + $fList = $sql->db_getList(); + foreach($fList as $f) + { + $ret .= $this->delete_sub($f['forum_id'], $confirm); + } + } + if($confirm) + { + $cnt = $sql->db_Delete("forum_t","thread_forum_id = {$id}"); + $ret .= $cnt." forum {$id} thread(s) deleted
    "; + if($sql->db_Delete("forum", "forum_id = {$id}")) + { + $ret .= "Forum {$id} successfully deleted"; + } + else + { + $ret .= "Forum {$id} could not be deleted"; + } + return $ret; + } + + $sql->db_Select("forum", "*", "forum_id = {$id}"); + $row = $sql->db_Fetch(); + return "Forum {$id} [".$tp->toHTML($row['forum_name'])."] has {$row['forum_threads']} threads, {$row['forum_replies']} replies.
    ".$ret; + } + + function delete_sub($id, $confirm = FALSE) + { + global $sql, $tp; + if($confirm) + { + $cnt = $sql->db_Delete("forum_t","thread_forum_id = {$id}"); + $ret .= $cnt." Sub-forum {$id} thread(s) deleted
    "; + if($sql->db_Delete("forum", "forum_id = {$id}")) + { + $ret .= "Sub-forum {$id} successfully deleted"; + } + else + { + $ret .= "Sub-forum {$id} could not be deleted"; + } + return $ret; + } + + $sql->db_Select("forum", "*", "forum_id = {$id}"); + $row = $sql->db_Fetch(); + return "Sub-forum {$id} [".$tp->toHTML($row['forum_name'])."] has {$row['forum_threads']} threads, {$row['forum_replies']} replies.
    ".$ret; + } + + function delete_show_confirm($txt) + { + global $ns; + $this->show_message($txt); + $txt = " +
    +
    ".FORLAN_180."

    + +
    +
    + "; + $ns->tablerender(FORLAN_181, $txt); + } + + function show_subs($id) + { + global $sql, $tp, $ns; + $txt = " +
    + + + + + + + + + "; + if($sql->db_Select('forum', 'forum_id, forum_name, forum_description, forum_order', "forum_sub = {$id} ORDER by forum_order ASC")) + { + $subList = $sql->db_getList(); + foreach($subList as $sub) + { + $txt .= " + + + + + + + + "; + } + $txt .= " + + + + + + + "; + + } + else + { + $txt .= ""; + } + + $txt .= " + + + + + + + + + + + + + + + + + +
    ".FORLAN_151."".FORLAN_31."".FORLAN_32."".FORLAN_37."".FORLAN_20."
    {$sub['forum_id']} + ".ADMIN_DELETE_ICON." +
     
    ".FORLAN_146."
    ".FORLAN_151."".FORLAN_31."".FORLAN_32."".FORLAN_37." 
      
    +
    + "; + $ns->tablerender(FORLAN_149, $txt); + } + + function show_existing_forums($sub_action, $id, $mode = FALSE) + { + global $sql, $rs, $ns, $sql2, $sql3, $tp, $for; + + $subList = $for->forum_getsubs(); + if (!is_object($sql2)) + { + $sql2 = new db; + } + if (!is_object($sql3)) + { + $sql3 = new db; + } + if (!$mode) + { + $text = "
    "; + } else { + $text = "
    "; + } + $text .= " + + + + + "; + + if (!$parent_amount = $sql->db_Select("forum", "*", "forum_parent='0' ORDER BY forum_order ASC")) + { + $text .= ""; + } + else + { + $sql2 = new db; + $sql3 = new db; + while ($row = $sql->db_Fetch()) + { + extract($row); + $parent_id = $forum_id; + $text .= " + + "; + + $text .= ""; + + $forums = $sql2->db_Select("forum", "*", "forum_parent='".$forum_id."' AND forum_sub = 0 ORDER BY forum_order ASC"); + if (!$forums) + { + $text .= ""; + } + else + { + while ($row = $sql2->db_Fetch()) + { + extract($row); + + $text .= " + + \n + + \n"; + } + } + } + } + + if (!$mode) + { + $text .= "
    ".FORLAN_28."".FORLAN_80."
    ".FORLAN_29."
    ".$forum_name." +
    ".FORLAN_140.": ".r_userclass_name($forum_class)."  ".FORLAN_141.": ".r_userclass_name($forum_postclass)." +
    "; + + if ($mode) + { + $text .= ""; + } + else + { + $forum_heading = str_replace("'", "\'", $forum_name); + $text .= " + + "; + } + $text .= "
    ".FORLAN_29."
    ".IMAGE_new."".$forum_name."" ; + + $text .= " +
    ".$forum_description."  +
    ".FORLAN_140.": ".r_userclass_name($forum_class)."  ".FORLAN_141.": ".r_userclass_name($forum_postclass)." + +
    "; + + if ($mode) + { + $text .= ""; + } + else + { + $forum_heading = str_replace("'", "\'", $forum_name); + $sub_img = count($subList[$parent_id][$forum_id]) ? IMAGE_sub : IMAGE_nosub; + $text .= " + + "; + } + $text .= "
    "; + $ns->tablerender(FORLAN_30, $text); + } + else + { + $text .= "\n\n\n\n\n\n"; + $ns->tablerender(FORLAN_37, $text); + } + + } + + function create_parents($sub_action, $id) + { + global $sql, $ns; + + if ($sub_action == "edit" && !$_POST['update_parent']) + { + if ($sql->db_Select("forum", "*", "forum_id=$id")) + { + $row = $sql->db_Fetch(); + extract($row); + } + } + $text = "
    +
    \n + + + + + + + + + + + + + + + + + + + + +
    ".FORLAN_31.": + +
    ".FORLAN_23.":
    (".FORLAN_24.")
    ".r_userclass("forum_class", $forum_class, 'off', 'nobody,public,member,admin,classes')."
    ".FORLAN_142.":
    (".FORLAN_143.")
    ".r_userclass("forum_postclass", $forum_postclass, 'off', 'nobody,public,member,admin,classes')."
    "; + + if ($sub_action == "edit") + { + $text .= ""; + } + else + { + $text .= ""; + } + + $text .= "
    +
    +
    "; + + $ns->tablerender(FORLAN_75, $text); + } + + function create_forums($sub_action, $id) + { + global $sql, $ns; + + if ($sub_action == "edit" && !$_POST['update_forum']) + { + if ($sql->db_Select("forum", "*", "forum_id=$id")) + { + $row = $sql->db_Fetch(); + extract($row); + } + } + + $text = "
    +
    \n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ".FORLAN_22.":"; + + $sql->db_Select("forum", "*", "forum_parent=0"); + $text .= " +
    ".FORLAN_31.": +
    ".FORLAN_179."
    +
    + +
    ".FORLAN_32.": + +
    ".FORLAN_33.":
    (".FORLAN_34.")
    "; + $text .= r_userclass("forum_moderators", $forum_moderators, 'off', 'admin,classes'); + + // $admin_no = $sql->db_Select("user", "*", "user_admin='1' AND user_perms REGEXP('A.') OR user_perms='0' "); + // while ($row = $sql->db_Fetch()) + // { + // extract($row); + // $text .= ""; + // } + + $text .= "
    ".FORLAN_23.":
    (".FORLAN_24.")
    ".r_userclass("forum_class", $forum_class, 'off', 'nobody,public,member,admin,classes')."
    ".FORLAN_142.":
    (".FORLAN_143.")
    ".r_userclass("forum_postclass", $forum_postclass, 'off', 'nobody,public,member,admin,classes')."
    "; + if ($sub_action == "edit") + { + $text .= ""; + } + else + { + $text .= ""; + } + $text .= "
    +
    +
    "; + $ns->tablerender(FORLAN_28, $text); + } + + function show_message($message) + { + global $ns; + $ns->tablerender("", "
    ".$message."
    "); + } + + function show_tools() + { + global $sql, $ns, $tp; + $txt = " +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ".FORLAN_156."
    + "; + if($sql->db_Select("forum", "*", "1 ORDER BY forum_order")) + { + $fList = $sql->db_getList(); + foreach($fList as $f) + { + $txt .= " ".$tp->toHTML($f['forum_name'])."
    "; + } + $txt .= " ".FORLAN_157.""; + } + $txt .= " +
    ".FORLAN_158."
    + ".FORLAN_159."
         + ".FORLAN_160." +
    ".FORLAN_161."
    + ".FORLAN_162."
    +      ".FORLAN_182."
    ".FORLAN_183."

    +
    ".FORLAN_163."
    + ".FORLAN_164."
    +
    + +
    +
    + "; + $ns->tablerender(FORLAN_166, $txt); + } + + function show_prefs() + { + global $pref, $ns; + $text = "
    +
    \n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ".FORLAN_44."
    ".FORLAN_45."
    ".($pref['forum_enclose'] ? "" : "")."
    ".FORLAN_65."
    ".FORLAN_46."
    ".FORLAN_47."
    ".FORLAN_48."
    ".($pref['email_notify'] ? "" : "")."
    ".FORLAN_177."
    ".FORLAN_178."
    ".($pref['email_notify_on'] ? "" : "")."
    ".FORLAN_49."
    ".FORLAN_50."
    ".($pref['forum_poll'] ? "" : "")."
    ".FORLAN_70."
    ".FORLAN_71." ".FORLAN_130." ". FORLAN_131.""; + + if(!$pref['image_post']) + { + $text .= "
    ".FORLAN_139.""; + } + + $text .= "
    ".($pref['forum_attach'] ? "" : "")."
    ".FORLAN_134."
    ".FORLAN_135."
    ".FORLAN_136."
    ".FORLAN_137."
    ".($pref['forum_linkimg'] ? "" : "")."
    ".FORLAN_51."
    ".FORLAN_52."
    ".($pref['forum_track'] ? "" : "")."
    ".FORLAN_112."
    ".FORLAN_113."
    ".($pref['forum_redirect'] ? "" : "")."
    ".FORLAN_114."
    ".FORLAN_115."
    ".($pref['forum_user_customtitle'] ? "" : "")."
    ".FORLAN_116."
    ".FORLAN_122."
    ".($pref['reported_post_email'] ? "" : "")."
    ".FORLAN_126."
    ".FORLAN_127."
    ".($pref['forum_tooltip'] ? "" : "")."
    ".FORLAN_128."
    ".FORLAN_129."
    ".FORLAN_53."
    ".FORLAN_54."
    ".FORLAN_55."
    ".FORLAN_56."
    ".FORLAN_57."
    ".FORLAN_58."
    ".FORLAN_132."
    ".FORLAN_133."
    ".($pref['forum_hilightsticky'] ? "" : "")."
    + +
    +
    +
    "; + $ns->tablerender(FORLAN_62, $text); + } + + function show_reported ($sub_action, $id) + { + global $sql, $rs, $ns, $tp; + if ($sub_action) { + $sql -> db_Select("generic", "*", "gen_id='".$sub_action."'"); + $row = $sql -> db_Fetch(); + $sql -> db_Select("user", "*", "user_id='". $row['gen_user_id']."'"); + $user = $sql -> db_Fetch(); + $con = new convert; + $text = "
    + + + + + + + + + + + + + + + + + + + + + + + \n"; + $text .= "
    + ".FORLAN_171.": + + #".$row['gen_intdata']." +
    + ".FORLAN_173.": + + ".$row['gen_ip']." +
    + ".FORLAN_174.": + + ".$user['user_name']." +
    + ".FORLAN_175.": + + ".$con -> convert_date($row['gen_datestamp'], "long")." +
    + ".FORLAN_176.": + + ".$row['gen_chardata']." +
    + ".$rs->form_open("post", e_SELF."?sr", "", "", "", " onsubmit=\"return confirm_('sr',".$row['gen_datestamp'].")\"")." + ".$rs->form_button("submit", "delete[reported_{$row['gen_id']}]", FORLAN_172)." + ".$rs->form_close()." +
    "; + $text .= "
    "; + $ns -> tablerender(FORLAN_116, $text); + } else { + $text = "
    "; + if ($reported_total = $sql->db_Select("generic", "*", "gen_type='reported_post' OR gen_type='Reported Forum Post'")) + { + $text .= " + + + + "; + while ($row = $sql->db_Fetch()) + { + $text .= " + + + \n"; + } + $text .= "
    ".FORLAN_170."".FORLAN_80."
    ".FORLAN_171." #".$row['gen_intdata']." + ".$rs->form_open("post", e_SELF."?sr", "", "", "", " onsubmit=\"return confirm_('sr',".$row['gen_datestamp'].")\"")." + ".$rs->form_button("submit", "delete[reported_{$row['gen_id']}]", FORLAN_172)." + ".$rs->form_close()." +
    "; + } + else + { + $text .= "
    ".FORLAN_121."
    "; + } + $text .= "
    "; + $ns->tablerender(FORLAN_116, $text); + } + } + + function show_prune() + { + global $ns, $sql; + + // $sql -> db_Select("forum", "forum_id, forum_name", "forum_parent!=0 ORDER BY forum_order ASC"); + $qry = " + SELECT f.forum_id, f.forum_name, sp.forum_name AS sub_parent, fp.forum_name AS forum_parent + FROM #forum AS f + LEFT JOIN #forum AS sp ON sp.forum_id = f.forum_sub + LEFT JOIN #forum AS fp ON fp.forum_id = f.forum_parent + WHERE f.forum_parent != 0 + ORDER BY f.forum_parent ASC, f.forum_sub, f.forum_order ASC + "; + $sql -> db_Select_gen($qry); + $forums = $sql -> db_getList(); + + $text = "
    +
    \n + + + + + + + + + + + + + + + + + +
    ".FORLAN_60."
    ".FORLAN_87." + +
    ".FORLAN_2."
    + ".FORLAN_89."     + ".FORLAN_90." +
    ".FORLAN_138.":
    "; + + foreach($forums as $forum) + { + $for_name = $forum['forum_parent']." -> "; + $for_name .= ($forum['sub_parent'] ? $forum['sub_parent']." -> " : ""); + $for_name .= $forum['forum_name']; + $text .= " ".$for_name."
    "; + } + + + $text .= "
    + +
    +
    +
    "; + $ns->tablerender(FORLAN_59, $text); + } + + function show_levels() + { + global $sql, $pref, $ns, $rs; + + $rank_names = explode(",", $pref['forum_levels']); + $rank_thresholds = ($pref['forum_thresholds'] ? explode(",", $pref['forum_thresholds']) : array(20, 100, 250, 410, 580, 760, 950, 1150, 1370, 1600)); + $rank_images = ($pref['forum_images'] ? explode(",", $pref['forum_images']) : array("lev1.png", "lev2.png", "lev3.png", "lev4.png", "lev5.png", "lev6.png", "lev7.png", "lev8.png", "lev9.png", "lev10.png")); + + $text = "
    +
    \n + + + + + + + + + + + + + "; + + $text .= " + + + + + + + + + + + + + + + + "; + + for($a = 0; $a <= 9; $a++) + { + $text .= " + + + + "; + } + + $text .= " + + +
    ".FORLAN_98."".FORLAN_102."
    ".FORLAN_104."
     ".FORLAN_99."".FORLAN_100."
     
     
     
    + +
    \n
    \n
    "; + $ns->tablerender("Ranks", $text); + } + + function show_mods() + { + global $sql, $ns, $for, $tp; + $forumList = $for->forum_getforums('all'); + $parentList = $for->forum_getparents('list'); + $subList = $for->forum_getsubs('bysub'); + + $txt = "
    "; + + foreach($parentList as $p) + { + $txt .= " + + + + "; + + foreach($forumList[$p['forum_id']] as $f) + { + $txt .= " + + + + + "; + foreach($subList[$f['forum_id']] as $s) + { + $txt .= " + + + + + "; + } + } + } + $txt .= " + + + + +
     
    ".$tp->toHTML($p['forum_name'])."
    {$f['forum_name']}".r_userclass("mods[{$f['forum_id']}]", $f['forum_moderators'], 'off', 'admin,classes')."
        {$s['forum_name']}".r_userclass("mods[{$s['forum_id']}]", $s['forum_moderators'], 'off', 'admin,classes')."
    + +
    "; + $ns->tablerender(FORLAN_33, $txt); + } + + function show_rules() + { + global $sql, $pref, $ns, $tp; + + $sql->db_Select("wmessage"); + list($null) = $sql->db_Fetch(); + list($null) = $sql->db_Fetch(); + list($null) = $sql->db_Fetch(); + list($id, $guestrules, $wm_active4) = $sql->db_Fetch(); + list($id, $memberrules, $wm_active5) = $sql->db_Fetch(); + list($id, $adminrules, $wm_active6) = $sql->db_Fetch(); + + if($sql->db_Select('generic','*',"gen_type='forum_rules_guest'")) + { + $guest_rules = $sql->db_Fetch(); + } + if($sql->db_Select('generic','*',"gen_type='forum_rules_member'")) + { + $member_rules = $sql->db_Fetch(); + } + if($sql->db_Select('generic','*',"gen_type='forum_rules_admin'")) + { + $admin_rules = $sql->db_Fetch(); + } + + $guesttext = $tp->toFORM($guest_rules['gen_chardata']); + $membertext = $tp->toFORM($member_rules['gen_chardata']); + $admintext = $tp->toFORM($admin_rules['gen_chardata']); + + $text = " +
    +
    + + "; + + $text .= " + + + + + + + + + + + + + + + + + + + +
    ".WMGLAN_1.":
    + ".WMGLAN_6.":"; + if ($guest_rules['gen_intdata']) + { + $text .= ""; + } + else + { + $text .= ""; + } + $text .= "
    + +
    + +
    + ".display_help('helpb', 1, 'addtext1', 'help1')." +
    ".WMGLAN_2.":
    + ".WMGLAN_6.":"; + if ($member_rules['gen_intdata']) + { + $text .= ""; + } + else + { + $text .= ""; + } + $text .= "
    + +
    + +
    + ".display_help('helpb', 1, 'addtext2', 'help2')." +
    ".WMGLAN_3.":
    + ".WMGLAN_6.": "; + + if ($admin_rules['gen_intdata']) + { + $text .= ""; + } + else + { + $text .= ""; + } + + $text .= "
    + +
    + +
    + ".display_help('helpb', 1, 'addtext3', 'help3')." +
      + +
    +
    +
    "; + + $ns->tablerender(WMGLAN_5, $text); + + echo " + + "; + + } + } + + function forum_admin_adminmenu() + { + global $forum; + global $action; + $forum->show_options($action); + } + ?> diff --git a/e107_plugins/forum/forum_class.php b/e107_plugins/forum/forum_class.php new file mode 100644 index 000000000..7faa1c92d --- /dev/null +++ b/e107_plugins/forum/forum_class.php @@ -0,0 +1,1032 @@ +db_Select_gen($query)) + { + $row = $sql->db_Fetch(); + $ret['parent'] = $row['parent']; + } + return $ret; + } + + function update_lastpost($type, $id, $update_threads = FALSE) + { + global $sql, $tp; + $sql2 = new db; + if ($type == 'thread') + { + $id = intval($id); + $thread_info = $this->thread_get_lastpost($id); + list($uid, $uname) = explode(".", $thread_info['thread_user'], 2); + if ($thread_info) + { + if($thread_user['user_name'] != "") + { + $thread_lastuser = $uid.".".$thread_info['user_name']; + } + else + { + $tmp = explode(chr(1), $thread_info['thread_user']); + $thread_lastuser = $tmp[0]; + } + $sql->db_Update('forum_t', "thread_lastpost = ".intval($thread_info['thread_datestamp']).", thread_lastuser = '".$tp -> toDB($thread_lastuser, true)."' WHERE thread_id = ".intval($id)); + } + return $thread_info; + } + if ($type == 'forum') { + if ($id == 'all') + { + if ($sql->db_Select('forum', 'forum_id', 'forum_parent != 0')) + { + while ($row = $sql->db_Fetch()) + { + $parentList[] = $row['forum_id']; + } + foreach($parentList as $id) + { + // echo "Updating forum #{$id}
    "; + $this->update_lastpost('forum', $id, $update_threads); + } + } + } + else + { + $id = intval($id); + $forum_lp_user = ''; + $forum_lp_info = ''; + if($update_threads == TRUE) + { + if ($sql2->db_Select('forum_t', 'thread_id', "thread_forum_id = $id AND thread_parent = 0")) + { + while ($row = $sql2->db_Fetch()) + { + $this->update_lastpost('thread', $row['thread_id']); + } + } + } + if ($sql->db_Select("forum_t", "*", "thread_forum_id='$id' ORDER BY thread_datestamp DESC LIMIT 0,1")) + { + $row = $sql->db_Fetch(); + $tmp = explode(chr(1), $row['thread_user']); + $forum_lp_user = $tmp[0]; + $last_id = $row['thread_parent'] ? $row['thread_parent'] : $row['thread_id']; + $forum_lp_info = $row['thread_datestamp'].".".$last_id; + } + $sql->db_Update('forum', "forum_lastpost_user = '{$forum_lp_user}', forum_lastpost_info = '{$forum_lp_info}' WHERE forum_id={$id}"); + } + } + } + + function forum_markasread($forum_id) { + global $sql; + if ($forum_id != 'all') { + $forum_id = intval($forum_id); + $extra = " AND thread_forum_id='$forum_id' "; + } + $qry = "thread_lastpost > ".USERLV." AND thread_parent = 0 {$extra} "; + if ($sql->db_Select('forum_t', 'thread_id', $qry)) { + while ($row = $sql->db_Fetch()) { + $u_new .= ".".$row['thread_id']."."; + } + $u_new .= USERVIEWED; + $sql->db_Update("user", "user_viewed='$u_new' WHERE user_id='".USERID."' "); + header("location:".e_SELF); + exit; + } + } + + function thread_markasread($thread_id) + { + global $sql; + $thread_id = intval($thread_id); + $u_new = USERVIEWED.".$thread_id"; + return $sql->db_Update("user", "user_viewed='$u_new' WHERE user_id='".USERID."' "); + } + + function forum_getparents() + { + global $sql; + if ($sql->db_Select('forum', '*', "forum_parent='0' ORDER BY forum_order ASC")) + { + while ($row = $sql->db_Fetch()) { + $ret[] = $row; + } + return $ret; + } + return FALSE; + } + + function forum_getmods($uclass = e_UC_ADMIN) + { + global $sql; + if($uclass == e_UC_ADMIN || trim($uclass) == '') + { + $sql->db_Select('user', 'user_id, user_name',"user_admin = 1"); + } + else + { + $regex = "(^|,)(".str_replace(",", "|", $uclass).")(,|$)"; + $sql->db_Select("user", "user_id, user_name", "user_class REGEXP '{$regex}'"); + } + while($row = $sql->db_Fetch()) + { + $ret[$row['user_id']] = $row['user_name']; + } + return $ret; + } + + function forum_getforums($type = 'all') + { + global $sql; + $qry = " + SELECT f.*, u.user_name FROM #forum AS f + LEFT JOIN #user AS u ON SUBSTRING_INDEX(f.forum_lastpost_user,'.',1) = u.user_id + WHERE forum_parent != 0 AND forum_sub = 0 + ORDER BY f.forum_order ASC + "; + if ($sql->db_Select_gen($qry)) + { + while ($row = $sql->db_Fetch()) + { + if($type == 'all') + { + $ret[$row['forum_parent']][] = $row; + } + else + { + $ret[] = $row; + } + } + return $ret; + } + return FALSE; + } + + function forum_getsubs($forum_id = "") + { + global $sql; + $where = ($forum_id != "" && $forum_id != 'bysub' ? "AND forum_sub = ".intval($forum_id) : ""); + $qry = " + SELECT f.*, u.user_name FROM #forum AS f + LEFT JOIN #user AS u ON SUBSTRING_INDEX(f.forum_lastpost_user,'.',1) = u.user_id + WHERE forum_sub != 0 {$where} + ORDER BY f.forum_order ASC + "; + if ($sql->db_Select_gen($qry)) + { + while ($row = $sql->db_Fetch()) + { + if($forum_id == "") + { + $ret[$row['forum_parent']][$row['forum_sub']][] = $row; + } + elseif($forum_id == 'bysub') + { + $ret[$row['forum_sub']][] = $row; + } + else + { + $ret[] = $row; + } + } + return $ret; + } + return FALSE; + } + + + function forum_newflag_list() + { + global $sql; + $viewed = ""; + if(USERVIEWED) + { + $viewed = preg_replace("#\.+#", ".", USERVIEWED); + $viewed = preg_replace("#^\.#", "", $viewed); + $viewed = preg_replace("#\.$#", "", $viewed); + $viewed = str_replace(".", ",", $viewed); + } + if($viewed != "") + { + $viewed = " AND thread_id NOT IN (".$viewed.")"; + } + + $_newqry = " + SELECT DISTINCT ff.forum_sub, ft.thread_forum_id FROM #forum_t AS ft + LEFT JOIN #forum AS ff ON ft.thread_forum_id = ff.forum_id + WHERE thread_parent = 0 AND thread_lastpost > '".USERLV."' {$viewed} + "; + if($sql->db_Select_gen($_newqry)) + { + while($row = $sql->db_Fetch()) + { + $ret[] = $row['thread_forum_id']; + if($row['forum_sub']) + { + $ret[] = $row['forum_sub']; + } + } + return $ret; + } + else + { + return FALSE; + } + } + + function thread_user($post_info) + { + if($post_info['user_name']) + { + return $post_info['user_name']; + } + else + { + $tmp = explode(".", $post_info['thread_user'], 2); + return $tmp[1]; + } + } + + function untrack($thread_id, $from) + { + $thread_id = intval($thread_id); + global $sql; + $tmp = str_replace("-".$thread_id."-", "", USERREALM); + return $sql->db_Update("user", "user_realm='$tmp' WHERE user_id='".USERID."' "); + } + + function track($thread_id, $from) + { + $thread_id = intval($thread_id); + global $sql; + return $sql->db_Update("user", "user_realm='".USERREALM."-".$thread_id."-' WHERE user_id='".USERID."' "); + } + + function forum_get($forum_id) + { + $forum_id = intval($forum_id); + $qry = " + SELECT f.*, fp.forum_class as parent_class, fp.forum_name as parent_name, fp.forum_id as parent_id, fp.forum_postclass as parent_postclass, sp.forum_name AS sub_parent FROM #forum AS f + LEFT JOIN #forum AS fp ON fp.forum_id = f.forum_parent + LEFT JOIN #forum AS sp ON f.forum_sub = sp.forum_id AND f.forum_sub > 0 + WHERE f.forum_id = {$forum_id} + "; + global $sql; + if ($sql->db_Select_gen($qry)) + { + return $sql->db_Fetch(); + } + return FALSE; + } + + function forum_get_allowed() + { + global $sql; + $qry = " + SELECT f.forum_id, f.forum_name FROM #forum AS f + LEFT JOIN #forum AS fp ON fp.forum_id = f.forum_parent + WHERE f.forum_parent != 0 + AND fp.forum_class IN (".USERCLASS_LIST.") + AND f.forum_class IN (".USERCLASS_LIST.") + "; + if ($sql->db_Select_gen($qry)) + { + while($row = $sql->db_Fetch()) + { + $ret[$row['forum_id']] = $row['forum_name']; + } + + } + return $ret; + } + + function thread_update($thread_id, $newvals) + { + global $sql, $tp; + foreach($newvals as $var => $val) + { + $var = $tp -> toDB($var); + $val = $tp -> toDB($val); + $newvalArray[] = "{$var} = '{$val}'"; + } + $newString = implode(', ', $newvalArray)." WHERE thread_id=".intval($thread_id); + return $sql->db_Update('forum_t', $newString); + } + + function forum_get_topics($forum_id, $from, $view) + { + $forum_id = intval($forum_id); + global $sql; + $qry = " + SELECT t.*, u.user_name, lpu.user_name AS lastpost_username from #forum_t as t + LEFT JOIN #user AS u ON SUBSTRING_INDEX(t.thread_user,'.',1) = u.user_id + LEFT JOIN #user AS lpu ON SUBSTRING_INDEX(t.thread_lastuser,'.',1) = lpu.user_id + WHERE t.thread_forum_id = $forum_id AND t.thread_parent = 0 + ORDER BY + t.thread_s DESC, + t.thread_lastpost DESC, + t.thread_datestamp DESC + LIMIT ".intval($from).",".intval($view)." + "; + $ret = array(); + if ($sql->db_Select_gen($qry)) + { + while ($row = $sql->db_Fetch()) + { + $ret[] = $row; + } + } + return $ret; + } + + function thread_get_lastpost($forum_id) + { + $forum_id = intval($forum_id); + global $sql; + if ($sql->db_Count('forum_t', '(*)', "WHERE thread_parent = {$forum_id} ")) + { + $where = "WHERE t.thread_parent = $forum_id "; + } + else + { + $where = "WHERE t.thread_id = $forum_id "; + } + $qry = " + SELECT t.thread_user, t.thread_datestamp, u.user_name FROM #forum_t AS t + LEFT JOIN #user AS u ON SUBSTRING_INDEX(t.thread_user,'.',1) = u.user_id + {$where} + ORDER BY t.thread_datestamp DESC LIMIT 0,1 + "; + if ($sql->db_Select_gen($qry)) + { + return $sql->db_Fetch(); + } + return FALSE; + } + + function forum_get_topic_count($forum_id) + { + global $sql; + return $sql->db_Count("forum_t", "(*)", " WHERE thread_forum_id='".intval($forum_id)."' AND thread_parent='0' "); + } + + function thread_getnext($thread_id, $forum_id, $from = 0, $limit = 100) + { + global $sql; + $forum_id = intval($forum_id); + global $sql; + $ftab = MPREFIX.'forum_t'; + while (!$found) + { + $qry = " + SELECT t.thread_id from #forum_t AS t + WHERE t.thread_forum_id = $forum_id + AND t.thread_parent = 0 + ORDER BY + t.thread_s DESC, + t.thread_lastpost DESC, + t.thread_datestamp DESC + LIMIT ".intval($from).",".intval($limit); + if ($sql->db_Select_gen($qry)) + { + $i = 0; + while ($row = $sql->db_Fetch()) + { + $threadList[$i++] = $row['thread_id']; + } + + if (($id = array_search($thread_id, $threadList)) !== FALSE) + { + if ($id != 99) + { + return $threadList[$id+1]; + } + else + { + return $this->thread_getnext($thread_id, $forum_id, $from+99, 2); + } + } + } + else + { + return FALSE; + } + $from += 100; + } + } + + function thread_getprev($thread_id, $forum_id, $from = 0, $limit = 100) + { + global $sql; + $forum_id = intval($forum_id); + global $sql; + $ftab = MPREFIX.'forum_t'; + while (!$found) + { + $qry = " + SELECT t.thread_id from #forum_t AS t + WHERE t.thread_forum_id = $forum_id + AND t.thread_parent = 0 + ORDER BY + t.thread_s DESC, + t.thread_lastpost DESC, + t.thread_datestamp DESC + LIMIT ".intval($from).",".intval($limit); + if ($sql->db_Select_gen($qry)) + { + $i = 0; + while ($row = $sql->db_Fetch()) + { + $threadList[$i++] = $row['thread_id']; + } + + if (($id = array_search($thread_id, $threadList)) !== FALSE) + { + if ($id != 0) + { + return $threadList[$id-1]; + } + else + { + if ($from == 0) + { + return FALSE; + } + return $this->thread_getprev($thread_id, $forum_id, $from-1, 2); + } + } + } + else + { + return FALSE; + } + $from += 100; + } + } + + function thread_get($thread_id, $start = 0, $limit = 10) + { + $thread_id = intval($thread_id); + global $sql; + $ftab = MPREFIX.'forum_t'; + $utab = MPREFIX.'user'; + + if ($start === "last") + { + $tcount = $this->thread_count($thread_id); + $start = max(0, $tcount-$limit); + } + $start = max(0, $start); + if ($start != 0) + { + $array_start = 0; + } + else + { + $limit--; + $array_start = 1; + } + $sortdir = "ASC"; + + $qry = " + SELECT t.*, u.*, ue.* FROM #forum_t as t + LEFT JOIN #user AS u + ON SUBSTRING_INDEX(t.thread_user,'.',1) = u.user_id + LEFT JOIN #user_extended AS ue + ON SUBSTRING_INDEX(t.thread_user,'.',1) = ue.user_extended_id + WHERE t.thread_parent = $thread_id + ORDER by t.thread_datestamp {$sortdir} + LIMIT ".intval($start).",".intval($limit); + $ret = array(); + if ($sql->db_Select_gen($qry)) + { + $i = $array_start; + while ($row = $sql->db_Fetch()) + { + $ret[$i] = $row; + $i++; + } + } + $qry = " + SELECT t.*,u.*,ue.* from #forum_t AS t + LEFT JOIN #user AS u + ON SUBSTRING_INDEX(t.thread_user,'.',1) = u.user_id + LEFT JOIN #user_extended AS ue + ON SUBSTRING_INDEX(t.thread_user,'.',1) = ue.user_extended_id + WHERE t.thread_id = $thread_id + LIMIT 0,1 + "; + if ($sql->db_Select_gen($qry)) + { + $row = $sql->db_Fetch(); + $ret['head'] = $row; + if (!array_key_exists(0, $ret)) + { + $ret[0] = $row; + } + } + return $ret; + } + + function thread_count($thread_id) + { + $thread_id = intval($thread_id); + global $sql; + return $sql->db_Count('forum_t', '(*)', "WHERE thread_parent = $thread_id")+1; + } + + function thread_count_list($thread_list) + { + global $sql, $tp; + $qry = " + SELECT t.thread_parent, t.COUNT(*) as thread_replies + FROM #forum_t AS t + WHERE t.thread_parent + IN ".$tp -> toDB($thread_list, true)." + GROUP BY t.thread_parent + "; + if ($sql->db_Select_gen($qry)) + { + while ($row = $sql->db_Fetch()) + { + $ret[$row['thread_parent']] = $row['thread_replies']; + } + } + return $ret; + } + + function thread_incview($thread_id) + { + $thread_id = intval($thread_id); + global $sql; + return $sql->db_Update("forum_t", "thread_views=thread_views+1 WHERE thread_id='$thread_id' "); + } + + + function thread_get_postinfo($thread_id, $head = FALSE) + { + $thread_id = intval($thread_id); + global $sql; + $ret = array(); + $qry = " + SELECT t.*, u.user_name, u.user_id, u.user_email from #forum_t AS t + LEFT JOIN #user AS u + ON SUBSTRING_INDEX(t.thread_user,'.',1) = u.user_id + WHERE t.thread_id = $thread_id + LIMIT 0,1 + "; + if ($sql->db_Select_gen($qry)) + { + $ret[0] = $sql->db_Fetch(); + } + else + { + return FALSE; + } + if ($head == FALSE) + { + return $ret; + } + $parent_id = $ret[0]['thread_parent']; + if ($parent_id == 0) + { + $ret['head'] = $ret[0]; + } + else + { + $qry = " + SELECT t.*, u.user_name, u.user_id from #forum_t AS t + LEFT JOIN #user AS u + ON SUBSTRING_INDEX(t.thread_user,'.',1) = u.user_id + WHERE t.thread_id = ".intval($parent_id)." + LIMIT 0,1 + "; + if ($sql->db_Select_gen($qry)) + { + $row = $sql->db_Fetch(); + $ret['head'] = $row; + } + } + return $ret; + } + + + function _forum_lp_update($lp_type, $lp_user, $lp_info, $lp_forum_id, $lp_forum_sub) + { + global $sql; + $sql->db_Update('forum', "{$lp_type}={$lp_type}+1, forum_lastpost_user='{$lp_user}', forum_lastpost_info = '{$lp_info}' WHERE forum_id='".intval($lp_forum_id)."' "); + if($lp_forum_sub) + { + $sql->db_Update('forum', "forum_lastpost_user = '{$lp_user}', forum_lastpost_info = '{$lp_info}' WHERE forum_id='".intval($lp_forum_sub)."' "); + } + } + + function thread_insert($thread_name, $thread_thread, $thread_forum_id, $thread_parent, $thread_poster, $thread_active, $thread_s, $forum_sub) + { + $post_time = time(); + global $sql, $tp, $pref, $e107; + $forum_sub = intval($forum_sub); + $ip = $e107->getip(); + //Check for duplicate post + if ($sql->db_Count('forum_t', '(*)', "WHERE thread_thread='$thread_thread' and thread_datestamp > ".($post_time - 180))) + { + return -1; + } + + $post_user = $thread_poster['post_userid'].".".$thread_poster['post_user_name']; + $thread_post_user = $post_user; + if($thread_poster['post_userid'] == 0) + { + $thread_post_user = $post_user.chr(1).$ip; + } + + $post_last_user = ($thread_parent ? "" : $post_user); + $vals = "'0', '{$thread_name}', '{$thread_thread}', '".intval($thread_forum_id)."', '".intval($post_time)."', '".intval($thread_parent)."', '{$thread_post_user}', '0', '".intval($thread_active)."', '$post_time', '$thread_s', '0', '{$post_last_user}', '0'"; + $newthread_id = $sql->db_Insert('forum_t', $vals); + if(!$newthread_id) + { + echo "thread creation failed!
    + Values sent were: ".htmlentities($vals)."

    Please save these values for dev team for troubleshooting."; + exit; + } + + // Increment user thread count and set user as viewed this thread + if (USER) + { + $new_userviewed = USERVIEWED.".".($thread_parent ? intval($thread_parent) : $newthread_id); + $sql->db_Update('user', "user_forums=user_forums+1, user_viewed='{$new_userviewed}' WHERE user_id='".USERID."' "); + } + + //If post is a reply + if ($thread_parent) + { + $forum_lp_info = $post_time.".".intval($thread_parent); + $gen = new convert; + // Update main forum with last post info and increment reply count + $this->_forum_lp_update("forum_replies", $post_user, $forum_lp_info, $thread_forum_id, $forum_sub); + + // Update head post with last post info and increment reply count + $sql->db_Update('forum_t', "thread_lastpost={$post_time}, thread_lastuser='{$post_user}', thread_total_replies=thread_total_replies+1 WHERE thread_id = ".intval($thread_parent)); + + $parent_thread = $this->thread_get_postinfo($thread_parent); + global $PLUGINS_DIRECTORY; + $thread_name = $tp->toText($parent_thread[0]['thread_name']); + $datestamp = $gen->convert_date($post_time, "long"); + $email_post = $tp->toHTML($thread_thread, TRUE); + $mail_link = "".SITEURL.$PLUGINS_DIRECTORY."forum/forum_viewtopic.php?".$thread_parent.".last"; + if(!isset($pref['forum_eprefix'])) + { + $pref['forum_eprefix'] = "[forum]"; + } + // Send email to orinator of flagged + if ($parent_thread[0]['thread_active'] == 99 && $parent_thread[0]['user_id'] != USERID) + { + $gen = new convert; + $email_name = $parent_thread[0]['user_name']; + $message = LAN_384.SITENAME.".

    ". LAN_382.$datestamp."
    ". LAN_94.": ".$thread_poster['post_user_name']."

    ". LAN_385.$email_post."

    ". LAN_383."

    ".$mail_link; + include_once(e_HANDLER."mail.php"); + sendemail($parent_thread[0]['user_email'], $pref['forum_eprefix']." '".$thread_name."', ".LAN_381.SITENAME, $message); + } + + // Send email to all users tracking thread + if ($sql->db_Select("user", "*", "user_realm REGEXP('-".intval($thread_parent)."-') ")) + { + include_once(e_HANDLER.'mail.php'); + $message = LAN_385.SITENAME.".

    ". LAN_382.$datestamp."
    ". LAN_94.": ".$thread_poster['post_user_name']."

    ". LAN_385.$email_post."

    ". LAN_383."

    ".$mail_link; + while ($row = $sql->db_Fetch()) + { + if ($row['user_email']) + { + sendemail($row['user_email'], $pref['forum_eprefix']." '".$thread_name."', ".LAN_381.SITENAME, $message); + } + } + } + } + else + { + //post is a new thread + $forum_lp_info = $post_time.".".$newthread_id; + $this->_forum_lp_update("forum_threads", $post_user, $forum_lp_info, $thread_forum_id, $forum_sub); + } + return $newthread_id; + } + + function post_getnew($count = 50, $userviewed = USERVIEWED) + { + global $sql; + $viewed = ""; + if($userviewed) + { + $viewed = preg_replace("#\.+#", ".", $userviewed); + $viewed = preg_replace("#^\.#", "", $viewed); + $viewed = preg_replace("#\.$#", "", $viewed); + $viewed = str_replace(".", ",", $viewed); + } + if($viewed != "") + { + $viewed = " AND ft.thread_id NOT IN (".$viewed.")"; + } + + $qry = " + SELECT ft.*, fp.thread_name as post_subject, fp.thread_total_replies as replies, u.user_id, u.user_name, f.forum_class + FROM #forum_t AS ft + LEFT JOIN #forum_t as fp ON fp.thread_id = ft.thread_parent + LEFT JOIN #user as u ON u.user_id = SUBSTRING_INDEX(ft.thread_user,'.',1) + LEFT JOIN #forum as f ON f.forum_id = ft.thread_forum_id + WHERE ft.thread_datestamp > ".USERLV. " + AND f.forum_class IN (".USERCLASS_LIST.") + {$viewed} + ORDER BY ft.thread_datestamp DESC LIMIT 0, ".intval($count); + if($sql->db_Select_gen($qry)) + { + $ret = $sql->db_getList(); + } + return $ret; + } + + function forum_prune($type, $days, $forumArray) + { + global $sql; + $prunedate = time() - (intval($days) * 86400); + $forumList = implode(",", $forumArray); + + if($type == 'delete') + { + //Get list of threads to prune + if ($sql->db_Select("forum_t", "thread_id", "thread_lastpost < $prunedate AND thread_parent=0 AND thread_s != 1 AND thread_forum_id IN ({$forumList})")) + { + $threadList = $sql->db_getList(); + foreach($threadList as $thread) + { + //Delete all replies + $reply_count += $sql->db_Delete("forum_t", "thread_parent='".intval($thread['thread_id'])."'"); + //Delete thread + $thread_count += $sql->db_Delete("forum_t", "thread_id = '".intval($thread['thread_id'])."'"); + //Delete poll if there is one + $sql->db_Delete("poll", "poll_datestamp='".intval($thread['thread_id']).""); + } + foreach($forumArray as $fid) + { + $this->update_lastpost('forum', $fid); + $this->forum_update_counts($fid); + } + return FORLAN_8." ( ".$thread_count." ".FORLAN_92.", ".$reply_count." ".FORLAN_93." )"; + } + else + { + return FORLAN_9; + } + } + else + { + $pruned = $sql->db_Update("forum_t", "thread_active=0 WHERE thread_lastpost < $prunedate AND thread_parent=0 AND thread_forum_id IN ({$forumList})"); + return FORLAN_8." ".$pruned." ".FORLAN_91; + } + } + + function forum_update_counts($forumID, $recalc_threads = false) + { + global $sql; + if($forumID == 'all') + { + $sql->db_Select('forum', 'forum_id', 'forum_parent != 0'); + $flist = $sql->db_getList(); + foreach($flist as $f) + { + $this->forum_update_counts($f['forum_id']); + } + return; + } + $forumID = intval($forumID); + $threads = $sql->db_Count("forum_t", "(*)", "WHERE thread_forum_id=$forumID AND thread_parent = 0"); + $replies = $sql->db_Count("forum_t", "(*)", "WHERE thread_forum_id=$forumID AND thread_parent != 0"); + $sql->db_Update("forum", "forum_threads='$threads', forum_replies='$replies' WHERE forum_id='$forumID'"); + if($recalc_threads == true) + { + $sql->db_Select("forum_t", "thread_parent, count(*) as replies", "thread_forum_id = $forumID GROUP BY thread_parent"); + $tlist = $sql->db_getList(); + foreach($tlist as $t) + { + $tid = $t['thread_parent']; + $replies = intval($t['replies']); + $sql->db_Update("forum_t", "thread_total_replies='$replies' WHERE thread_id='$tid'"); + } + } + } + + function get_user_counts() + { + global $sql; + $qry = " + SELECT u.user_id AS uid, count(t.thread_user) AS cnt FROM #forum_t AS t + LEFT JOIN #user AS u on SUBSTRING_INDEX(t.thread_user,'.',1) = u.user_id + WHERE u.user_id > 0 + GROUP BY uid + "; + + if($sql->db_Select_gen($qry)) + { + $ret = array(); + while($row = $sql->db_Fetch()) + { + $ret[$row['uid']] = $row['cnt']; + } + return $ret; + } + return FALSE; + } + + /* + * set bread crumb + * $forum_href override ONLY applies when template is missing FORUM_CRUMB + * $thread_title is needed for post-related breadcrumbs + */ + function set_crumb($forum_href=FALSE,$thread_title="") + { + global $FORUM_CRUMB,$forum_info,$thread_info,$tp; + global $BREADCRUMB,$BACKLINK; // Eventually we should deprecate BACKLINK + + if(is_array($FORUM_CRUMB)) + { + $search = array("{SITENAME}", "{SITENAME_HREF}"); + $replace = array(SITENAME, "href='".e_BASE."index.php'"); + $FORUM_CRUMB['sitename']['value'] = str_replace($search, $replace, $FORUM_CRUMB['sitename']['value']); + + $search = array("{FORUMS_TITLE}", "{FORUMS_HREF}"); + $replace = array(LAN_01, "href='".e_PLUGIN."forum/forum.php'"); + $FORUM_CRUMB['forums']['value'] = str_replace($search, $replace, $FORUM_CRUMB['forums']['value']); + + $search = "{PARENT_TITLE}"; + $replace = $tp->toHTML($forum_info['parent_name']); + $FORUM_CRUMB['parent']['value'] = str_replace($search, $replace, $FORUM_CRUMB['parent']['value']); + + if($forum_info['sub_parent']) + { + $search = array("{SUBPARENT_TITLE}", "{SUBPARENT_HREF}"); + $forum_sub_parent = (substr($forum_info['sub_parent'], 0, 1) == "*" ? substr($forum_info['sub_parent'], 1) : $forum_info['sub_parent']); + $replace = array($forum_sub_parent, "href='".e_PLUGIN."forum/forum_viewforum.php?{$forum_info['forum_sub']}'"); + $FORUM_CRUMB['subparent']['value'] = str_replace($search, $replace, $FORUM_CRUMB['subparent']['value']); + } + else + { + $FORUM_CRUMB['subparent']['value'] = ""; + } + + $search = array("{FORUM_TITLE}", "{FORUM_HREF}"); + $tmpFname = $forum_info['forum_name']; + if(substr($tmpFname, 0, 1) == "*") { $tmpFname = substr($tmpFname, 1); } + $replace = array($tmpFname,"href='".e_PLUGIN."forum/forum_viewforum.php?{$forum_info['forum_id']}'"); + $FORUM_CRUMB['forum']['value'] = str_replace($search, $replace, $FORUM_CRUMB['forum']['value']); + + if(strlen($thread_title)) + { + $search = array("{THREAD_TITLE}"); + $replace = array($thread_title); + $FORUM_CRUMB['thread']['value'] = str_replace($search, $replace, $FORUM_CRUMB['thread']['value']); + } + else + { + $FORUM_CRUMB['thread']['value'] = ""; + } + + $FORUM_CRUMB['fieldlist'] = "sitename,forums,parent,subparent,forum,thread"; + $BREADCRUMB = $tp->parseTemplate("{BREADCRUMB=FORUM_CRUMB}", true); + + } + else + { + $dfltsep = " :: "; + $BREADCRUMB = "".SITENAME."".$dfltsep."".LAN_01."".$dfltsep; + if($forum_info['sub_parent']) + { + $forum_sub_parent = (substr($forum_info['sub_parent'], 0, 1) == "*" ? substr($forum_info['sub_parent'], 1) : $forum_info['sub_parent']); + $BREADCRUMB .= "{$forum_sub_parent}".$dfltsep; + } + + $tmpFname = $forum_info['forum_name']; + if(substr($tmpFname, 0, 1) == "*") { $tmpFname = substr($tmpFname, 1); } + if ($forum_href) + { + $BREADCRUMB .= "".$tp->toHTML($tmpFname, TRUE, 'no_hook,emotes_off').""; + } else + { + $BREADCRUMB .= $tmpFname; + } + + if(strlen($thread_title)) + { + $BREADCRUMB .= $dfltsep.$thread_title; + } + } + $BACKLINK = $BREADCRUMB; + } +} + + +/** +* @return string path to and filename of forum icon image +* +* @param string $filename filename of forum image +* @param string $eMLANG_folder if specified, indicates its a multilanguage image being processed and +* gives the subfolder of the image path to the eMLANG_path() function, +* default = FALSE +* @param string $eMLANG_pref if specified, indicates that $filename may be overridden by the +* $pref with $eMLANG_pref as its key if that pref is TRUE, default = FALSE +* +* @desc checks for the existence of a forum icon image in the themes forum folder and if it is found +* returns the path and filename of that file, otherwise it returns the path and filename of the +* default forum icon image in e_IMAGES. The additional $eMLANG args if specfied switch the process +* to the sister multi-language function eMLANG_path(). +* +* @access public +*/ +function img_path($filename) +{ + global $pref; + + $multilang = array("reply.png","newthread.png","moderator.png","main_admin.png","admin.png"); + $ML = (in_array($filename,$multilang)) ? TRUE : FALSE; + + if(file_exists(THEME.'forum/'.$filename) || is_readable(THEME.'forum/'.e_LANGUAGE."_".$filename)) + { + $image = ($ML && is_readable(THEME.'forum/'.e_LANGUAGE."_".$filename)) ? THEME.'forum/'.e_LANGUAGE."_".$filename : THEME.'forum/'.$filename; + } + else + { + if(defined("IMODE")) + { + if($ML) + { + $image = (is_readable(e_PLUGIN."forum/images/".IMODE."/".e_LANGUAGE."_".$filename)) ? e_PLUGIN."forum/images/".IMODE."/".e_LANGUAGE."_".$filename : e_PLUGIN."forum/images/".IMODE."/English_".$filename; + } + else + { + $image = e_PLUGIN."forum/images/".IMODE."/".$filename; + } + } + else + { + if($ML) + { + $image = (is_readable(e_PLUGIN."forum/images/lite/".e_LANGUAGE."_".$filename)) ? e_PLUGIN."forum/images/lite/".e_LANGUAGE."_".$filename : e_PLUGIN."forum/images/lite/English_".$filename; + } + else + { + $image = e_PLUGIN."forum/images/lite/".$filename; + } + + } + } + + return $image; +} + + + + +if (file_exists(THEME.'forum/forum_icons_template.php')) +{ + require_once(THEME.'forum/forum_icons_template.php'); +} +else if (file_exists(THEME.'forum_icons_template.php')) +{ + require_once(THEME.'forum_icons_template.php'); +} +else +{ + require_once(e_PLUGIN.'forum/templates/forum_icons_template.php'); +} +?> diff --git a/e107_plugins/forum/forum_conf.php b/e107_plugins/forum/forum_conf.php new file mode 100644 index 000000000..519b13a58 --- /dev/null +++ b/e107_plugins/forum/forum_conf.php @@ -0,0 +1,191 @@ +db_Select_gen($qry)) +{ + $info=$sql->db_Fetch(); + if(!check_class($info['forum_moderators'])) + { + header("location:".e_BASE."index.php"); + exit; + } +} +else +{ + header("location:".e_BASE."index.php"); + exit; +} + +require_once(HEADERF); + +if (isset($_POST['deletepollconfirm'])) { + $sql->db_Delete("poll", "poll_id='".intval($thread_parent)."' "); + $sql->db_Select("forum_t", "*", "thread_id='".$thread_id."' "); + $row = $sql->db_Fetch(); + extract($row); + $thread_name = str_replace("[poll] ", "", $thread_name); + $sql->db_Update("forum_t", "thread_name='$thread_name' WHERE thread_id='$thread_id' "); + $message = FORLAN_5; + $url = e_PLUGIN."forum/forum_viewtopic.php?".$forum_id.".".$thread_id; +} + +if (isset($_POST['move'])) +{ + require_once(e_PLUGIN."forum/forum_class.php"); + $forum = new e107forum; + $new_forum = intval($_POST['forum_move']); + $replies = $sql->db_Select("forum_t", "*", "thread_parent='$thread_id' "); + $sql->db_Select("forum_t", "thread_name, thread_forum_id", "thread_id ='".$thread_id."' "); + $row = $sql->db_Fetch(); + $old_forum = $row['thread_forum_id']; + $new_thread_name = $row['thread_name']; + + if($_POST['rename_thread'] == 'add') + { + $new_thread_name = "[".FORLAN_27."] ".$new_thread_name; + } + elseif($_POST['rename_thread'] == 'rename' && trim($_POST['newtitle']) != "") + { + $new_thread_name = $tp->toDB($_POST['newtitle']); + } + + $sql->db_Update("forum_t", "thread_forum_id='$new_forum', thread_name='{$new_thread_name}' WHERE thread_id='$thread_id' "); + $sql->db_Update("forum_t", "thread_forum_id='$new_forum' WHERE thread_parent='$thread_id' "); + $sql->db_Update("forum", "forum_threads=forum_threads-1, forum_replies=forum_replies-$replies WHERE forum_id='$old_forum' "); + $sql->db_Update("forum", "forum_threads=forum_threads+1, forum_replies=forum_replies+$replies WHERE forum_id='$new_forum' "); + + // update lastposts + + $forum->update_lastpost('forum', $old_forum, FALSE); + $forum->update_lastpost('forum', $new_forum, FALSE); + + $message = FORLAN_9; + $url = e_PLUGIN."forum/forum_viewforum.php?".$new_forum; +} + +if (isset($_POST['movecancel'])) +{ + $message = FORLAN_10; + $url = e_PLUGIN."forum/forum_viewforum.php?".$info['forum_id']; +} + +if ($message) +{ + $text = "
    ".$message." +
    + ".FORLAN_11." +
    "; + $ns->tablerender(FORLAN_12, $text); + require_once(FOOTERF); + exit; +} + +if ($action == "delete_poll") +{ + $text = "
    + ".FORLAN_13." +

    +
    + + +
    +
    "; + $ns->tablerender(FORLAN_16, $text); + require_once("footer.php"); + exit; +} + +if ($action == "move") +{ + $text = " +
    +
    + + + + + + + + + + + +
    ".FORLAN_24.": + +

    + ".FORLAN_32."
    + ".FORLAN_28."
    + ".FORLAN_29." [".FORLAN_27."] ".FORLAN_30."
    + ".FORLAN_31." +

    + + +
    +
    +

    "; + $text = $ns->tablerender($tp->toHTML($info['thread_name']), $tp->toHTML($info['thread_thread']), '', TRUE).$ns->tablerender("", $text, '', true); + $ns->tablerender(FORLAN_25, $text); + +} +require_once(FOOTERF); +?> \ No newline at end of file diff --git a/e107_plugins/forum/forum_mod.php b/e107_plugins/forum/forum_mod.php new file mode 100644 index 000000000..f19f997b4 --- /dev/null +++ b/e107_plugins/forum/forum_mod.php @@ -0,0 +1,142 @@ + $val) { + if (preg_match("#(.*?)_(\d+)_x#", $key, $matches)) + { + $act = $matches[1]; + $id = intval($matches[2]); + + switch($act) + { + case 'lock' : + $sql->db_Update("forum_t", "thread_active='0' WHERE thread_id='$id' "); + return FORLAN_CLOSE; + break; + + case 'unlock' : + $sql->db_Update("forum_t", "thread_active='1' WHERE thread_id='$id' "); + return FORLAN_OPEN; + break; + + case 'stick' : + $sql->db_Update("forum_t", "thread_s='1' WHERE thread_id='$id' "); + return FORLAN_STICK; + break; + + case 'unstick' : + $sql->db_Update("forum_t", "thread_s='0' WHERE thread_id='$id' "); + return FORLAN_UNSTICK; + break; + + case 'delete' : + return forum_delete_thread($id); + break; + + } + } + } +} + +function forum_delete_thread($thread_id) +{ + global $sql; + @require_once(e_PLUGIN.'forum/forum_class.php'); + $f =& new e107forum; + $sql->db_Select("forum_t", "*", "thread_id='".intval($thread_id)."' "); + $row = $sql->db_Fetch(); + + if ($row['thread_parent']) + { + // post is a reply? + $sql->db_Delete("forum_t", "thread_id='".intval($thread_id)."' "); + // dec forum reply count by 1 + $sql->db_Update("forum", "forum_replies=forum_replies-1 WHERE forum_id='".$row['thread_forum_id']."'"); + // dec thread reply count by 1 + $sql->db_Update("forum_t", "thread_total_replies=thread_total_replies-1 WHERE thread_id='".$row['thread_parent']."'"); + // dec user forum post count by 1 + $tmp = explode(".", $row['thread_user']); + $uid = intval($tmp[0]); + if($uid > 0) + { + $sql->db_Update("user", "user_forums=user_forums-1 WHERE user_id='".$uid."'"); + } + // update lastpost info + $f->update_lastpost('thread', $row['thread_parent']); + $f->update_lastpost('forum', $row['thread_forum_id']); + return FORLAN_154; + } + else + { + // post is thread + // delete poll if there is one + $sql->db_Delete("poll", "poll_datestamp='".intval($thread_id)."'"); + //decrement user post counts + forum_userpost_count("WHERE thread_id = '".intval($thread_id)."' OR thread_parent = '".intval($thread_id)."'", "dec"); + // delete replies and grab how many there were + $count = $sql->db_Delete("forum_t", "thread_parent='".intval($thread_id)."'"); + // delete the post itself + $sql->db_Delete("forum_t", "thread_id='".intval($thread_id)."'"); + // update thread/reply counts + $sql->db_Update("forum", "forum_threads=forum_threads-1, forum_replies=forum_replies-$count WHERE forum_id='".$row['thread_forum_id']."'"); + // update lastpost info + $f->update_lastpost('forum', $row['thread_forum_id']); + return FORLAN_6.($count ? ", ".$count." ".FORLAN_7."." : "."); + } +} + +function forum_userpost_count($where = "", $type = "dec") +{ + global $sql; + + $qry = " + SELECT thread_user, count(thread_user) AS cnt FROM #forum_t + {$where} + GROUP BY thread_user + "; + + if($sql->db_Select_gen($qry)) + { + $uList = $sql->db_getList(); + foreach($uList as $u) + { + $tmp = explode(".", $u['thread_user']); + $uid = intval($tmp[0]); + if($uid > 0) + { + if("set" == $type) + { + $sql->db_Update("user", "user_forums={$u['cnt']} WHERE user_id='".$uid."'"); + } + else + { + $sql->db_Update("user", "user_forums=user_forums-{$u['cnt']} WHERE user_id='".$uid."'"); + } + } + } + } +} +?> \ No newline at end of file diff --git a/e107_plugins/forum/forum_post.php b/e107_plugins/forum/forum_post.php new file mode 100644 index 000000000..6d8d84213 --- /dev/null +++ b/e107_plugins/forum/forum_post.php @@ -0,0 +1,653 @@ +thread_get($id, 'last', 11); + $forum_info = $forum->forum_get($thread_info['head']['thread_forum_id']); +} +elseif ($action == 'nt') +{ + // New post + $forum_info = $forum->forum_get($id); +} +elseif ($action == 'quote' || $action == 'edit') +{ + $thread_info = $forum->thread_get_postinfo($id, TRUE); + $forum_info = $forum->forum_get($thread_info['head']['thread_forum_id']); + if($action == 'quote') + { + $id = $thread_info['head']['thread_id']; + } +} + +if (!check_class($forum_info['forum_postclass']) || !check_class($forum_info['parent_postclass'])) { + require_once(HEADERF); + $ns->tablerender(LAN_20, "
    ".LAN_399."
    "); + require_once(FOOTERF); + exit; +} +define("MODERATOR", check_class($forum_info['forum_moderators'])); +//require_once(e_HANDLER.'forum_include.php'); +require_once(e_PLUGIN."forum/forum_post_shortcodes.php"); +require_once(e_PLUGIN."forum/forum_shortcodes.php"); +require_once(e_HANDLER."ren_help.php"); +$gen = new convert; +$fp = new floodprotect; +global $tp; + +if ($sql->db_Select("tmp", "*", "tmp_ip='$ip' ")) { + $row = $sql->db_Fetch(); + $tmp = explode("^", $row['tmp_info']); + $action = $tmp[0]; + $anonname = $tmp[1]; + $subject = $tmp[2]; + $post = $tmp[3]; + $sql->db_Delete("tmp", "tmp_ip='$ip' "); +} + +//Check to see if user had post rights +if (!check_class($forum_info['forum_postclass'])) +{ + require_once(HEADERF); + $text .= "
    ".LAN_399."
    "; + $ns->tablerender(LAN_20, $text); + require_once(FOOTERF); + exit; +} + +//if thread is not active and not new thread, show warning +if ($action != "nt" && !$thread_info['head']['thread_active'] && !MODERATOR) +{ + require_once(HEADERF); + $ns->tablerender(LAN_20, "
    ".LAN_397."
    "); + require_once(FOOTERF); + exit; +} + +$forum_info['forum_name'] = $tp -> toHTML($forum_info['forum_name'], TRUE); + +define("e_PAGETITLE", LAN_01." / ".$forum_info['forum_name']." / ".($action == "rp" ? LAN_02.$forum_info['thread_name'] : LAN_03)); + +// ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + +if (is_readable(e_ADMIN.'filetypes.php')) { + $a_filetypes = trim(file_get_contents(e_ADMIN.'filetypes.php')); + $a_filetypes = explode(',', $a_filetypes); + foreach ($a_filetypes as $ftype) { + $sa_filetypes[] = '.'.trim(str_replace('.', '', $ftype)); + } + $allowed_filetypes = implode(' | ', $sa_filetypes); +} + +if (isset($_POST['submitpoll'])) +{ + require_once(e_PLUGIN."poll/poll_class.php"); + $poll = new poll; + + require_once(HEADERF); + if (!$FORUMPOST) + { + if (file_exists(THEME."forum_posted_template.php")) + { + require_once(THEME."forum_posted_template.php"); + } + else + { + require_once(e_PLUGIN."forum/templates/forum_posted_template.php"); + } + } + echo $FORUMPOLLPOSTED; + require_once(FOOTERF); + exit; +} + +if (isset($_POST['fpreview'])) +{ + process_upload(); + require_once(HEADERF); + if (USER) + { + $poster = USERNAME; + } + else + { + $poster = ($_POST['anonname']) ? $_POST['anonname'] : LAN_311; + } + $postdate = $gen->convert_date(time(), "forum"); + $tsubject = $tp->post_toHTML($_POST['subject'], true); + $tpost = $tp->post_toHTML($_POST['post'], true); + + if ($_POST['poll_title'] != "" && $pref['forum_poll']) + { + require_once(e_PLUGIN."poll/poll_class.php"); + $poll = new poll; + $poll->render_poll($_POST, "forum", "notvoted"); + } + + if (!$FORUM_PREVIEW) + { + if (file_exists(THEME."forum_preview_template.php")) + { + require_once(THEME."forum_preview_template.php"); + } + else + { + require_once(e_PLUGIN."forum/templates/forum_preview_template.php"); + } + } + + $text = $FORUM_PREVIEW; + + if ($poll_text) + { + $ns->tablerender($_POST['poll_title'], $poll_text); + } + $ns->tablerender(LAN_323, $text); + $anonname = $tp->post_toHTML($_POST['anonname'], FALSE); + + $post = $tp->post_toForm($_POST['post']); + $subject = $tp->post_toHTML($_POST['subject'], false); + + if ($action == "edit") + { + if ($_POST['subject']) + { + $action = "edit"; + } + else + { + $action = "reply"; + } + $eaction = TRUE; + } + else if($action == "quote") + { + $action = "reply"; + $eaction = FALSE; + } +} + +if (isset($_POST['newthread']) || isset($_POST['reply'])) +{ + $poster = array(); + if ((isset($_POST['newthread']) && trim($_POST['subject']) == "") || trim($_POST['post']) == "") + { + message_handler("ALERT", 5); + } + else + { + if ($fp->flood("forum_t", "thread_datestamp") == FALSE && !ADMIN) + { + echo "\n"; + } + if (USER) + { + $poster['post_userid'] = USERID; + $poster['post_user_name'] = USERNAME; + } + else + { + $poster = getuser($_POST['anonname']); + if ($poster == -1) + { + require_once(HEADERF); + $ns->tablerender(LAN_20, LAN_310); + if (isset($_POST['reply'])) + { + $tmpdata = "reply.".$tp -> toDB($_POST['anonname']).".".$tp -> toDB($_POST['subject']).".".$tp -> toDB($_POST['post']); + } + else + { + $tmpdata = "newthread^".$tp -> toDB($_POST['anonname'])."^".$tp -> toDB($_POST['subject'])."^".$tp -> toDB($_POST['post']); + } + $sql->db_Insert("tmp", "'$ip', '".time()."', '$tmpdata' "); + loginf(); + require_once(FOOTERF); + exit; + } + } + process_upload(); + + $post = $tp->toDB($_POST['post']); + $subject = $tp->toDB($_POST['subject']); + $email_notify = ($_POST['email_notify'] ? 99 : 1); + if ($_POST['poll_title'] != "" && $_POST['poll_option'][0] != "" && $_POST['poll_option'][1] != "") + { + $subject = "[".LAN_402."] ".$subject; + } + + $threadtype = (MODERATOR ? intval($_POST['threadtype']) : 0); + if (isset($_POST['reply'])) + { + $parent = $id; + $forum_id = $thread_info['head']['thread_forum_id']; + } + else + { + $parent = 0; + $forum_id = $id; + } + + $iid = $forum->thread_insert($subject, $post, $forum_id, $parent, $poster, $email_notify, $threadtype, $forum_info['forum_sub']); + if($iid === -1) + { + require_once(HEADERF); + $ns->tablerender("", LAN_FORUM_2); + require_once(FOOTERF); + exit; + } + if (isset($_POST['reply'])) { + $iid = $parent; + } + + if ($_POST['poll_title'] != "" && $_POST['poll_option'][0] != "" && $_POST['poll_option'][1] != "" && isset($_POST['newthread'])) { + require_once(e_PLUGIN."poll/poll_class.php"); + $_POST['iid'] = $iid; + $poll = new poll; + $poll -> submit_poll(2); + } + + if ($pref['forum_redirect']) + { + redirect(e_PLUGIN."forum/forum_viewtopic.php?{$iid}.last"); + } + else + { + require_once(HEADERF); + if (!$FORUMPOST) + { + if (file_exists(THEME."forum_posted_template.php")) + { + require_once(THEME."forum_posted_template.php"); + } + else + { + require_once(e_PLUGIN."forum/templates/forum_posted_template.php"); + } + } + + echo (isset($_POST['newthread']) ? $FORUMTHREADPOSTED : $FORUMREPLYPOSTED); + $e107cache->clear("newforumposts"); + require_once(FOOTERF); + exit; + } + } +} +require_once(HEADERF); + +if (isset($_POST['update_thread'])) +{ + if (!$_POST['subject'] || !$_POST['post']) + { + $error = "
    ".LAN_27."
    "; + } + else + { + if (!isAuthor()) + { + $ns->tablerender(LAN_95, "
    ".LAN_96."
    "); + require_once(FOOTERF); + exit; + } + + $newvals['thread_edit_datestamp'] = time(); + $newvals['thread_thread'] = $_POST['post']; + $newvals['thread_name'] = $_POST['subject']; + if(isset($_POST['email_notify'])) + { + $newvals['thread_active'] = '99'; + } + if (isset($_POST['threadtype']) && MODERATOR) + { + $newvals['thread_s'] = $_POST['threadtype']; + } + $forum->thread_update($id, $newvals); + $e107cache->clear("newforumposts"); + $url = e_PLUGIN."forum/forum_viewtopic.php?{$thread_info['head']['thread_id']}.0"; + echo "\n"; + } +} + +if (isset($_POST['update_reply'])) +{ + if (!$_POST['post']) + { + $error = "
    ".LAN_27."
    "; + } + else + { + if (!isAuthor()) + { + $ns->tablerender(LAN_95, "
    ".LAN_96."
    "); + require_once(FOOTERF); + exit; + } + $url = e_PLUGIN."forum/forum_viewtopic.php?{$id}.post"; + echo "\n"; + $newvals['thread_edit_datestamp'] = time(); + $newvals['thread_thread'] = $_POST['post']; + $forum->thread_update($id, $newvals); + $e107cache->clear("newforumposts"); + $url = e_PLUGIN."forum/forum_viewtopic.php?{$id}.post"; + echo "\n"; + } +} + +if ($error) +{ + $ns->tablerender(LAN_20, $error); +} + + +if ($action == 'edit' || $action == 'quote') +{ + if ($action == "edit") + { + if (!isAuthor()) + { + $ns->tablerender(LAN_95, "
    ".LAN_96."
    "); + require_once(FOOTERF); + exit; + } + } + + if(!is_array($thread_info[0])) + { + $ns -> tablerender(LAN_20, "
    ".LAN_96."
    "); + require_once(FOOTERF); + exit; + } + + $thread_info[0]['user_name'] = $forum->thread_user($thread_info[0]); + if (!isset($_POST['fpreview'])) + { + $subject = $thread_info['0']['thread_name']; + $post = $tp->toForm($thread_info[0]['thread_thread']); + } + $post = preg_replace("/<span class='smallblacktext'.*\span\>/", "", $post); + + if ($action == 'quote') { + $post = preg_replace("#\[hide].*?\[/hide]#s", "", $post); + $tmp = explode(chr(1), $thread_info[0]['user_name']); + $timeStamp = time(); + $post = "[quote{$timeStamp}={$tmp[0]}]\n".$post."\n[/quote{$timeStamp}]\n"; + $eaction = FALSE; + $action = 'reply'; + } else { + $eaction = TRUE; + if ($thread_info['0']['thread_parent']) { + $action = "reply"; + } else { + $action = "nt"; + $sact = "canc"; // added to override the bugtracker query below + } + } +} + +// ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +//Load forumpost template + +if (!$FORUMPOST) { + if (is_readable(THEME."forum_post_template.php")) { + include_once(THEME."forum_post_template.php"); + } +} +include_once(e_PLUGIN."forum/templates/forum_post_template.php"); + +/* check post access (bugtracker #1424) */ + +if($action == "rp" && !$sql -> db_Select("forum_t", "*", "thread_id='$id'")) +{ + $ns -> tablerender(LAN_20, "
    ".LAN_399."
    "); + require_once(FOOTERF); + exit; +} +else if($action == "nt" && !$sact && !$sql -> db_Select("forum", "*", "forum_id='$id'")) +{ + $ns -> tablerender(LAN_20, "
    ".LAN_399."
    "); + require_once(FOOTERF); + exit; +} +else +{ + $fpr = $sql -> db_Fetch(); + if(!check_class($fpr['forum_postclass'])) + { + $ns -> tablerender(LAN_20, "
    ".LAN_399."
    "); + require_once(FOOTERF); + exit; + } +} + +if($action == 'rp') +{ + $FORUMPOST = $FORUMPOST_REPLY; +} +$text = $tp->parseTemplate($FORUMPOST, FALSE, $forum_post_shortcodes); + +// ------------------------------------------------------------------------------------------------------------------------------------------------------------- + +if ($pref['forum_enclose']) +{ + $ns->tablerender($pref['forum_title'], $text); +} +else +{ + echo $text; +} + +function isAuthor() +{ + global $thread_info; + $tmp = explode(".", $thread_info[0]['thread_user'], 2); + return ($tmp[0] == USERID || MODERATOR); +} + +function getuser($name) +{ + global $tp, $sql, $e107; + $ret = array(); + $ip = $e107->getip(); + $name = str_replace("'", "", $name); + if (!$name) + { + // anonymous guest +// $name = "0.".LAN_311.chr(1).$ip; + $ret['post_userid'] = "0"; + $ret['post_user_name'] = LAN_311; + return $ret; + } + else + { + if ($sql->db_Select("user", "user_id, user_ip", "user_name='".$tp -> toDB($name)."'")) + { + $row = $sql->db_Fetch(); + if ($row['user_ip'] == $ip) + { + $ret['post_userid'] = $row['user_id']; + $ret['post_user_name'] = $name; + } + else + { + return -1; + } + } + else + { +// $name = "0.".substr($tp->toDB($name), 0, 20).chr(1).$ip; + $ret['post_userid'] = "0"; + $ret['post_user_name'] = $tp->toDB($name); + } + } + return $ret; +} + +function loginf() { + $text .= "
    +

    + ".LAN_16."
    + \n +
    + ".LAN_17." +
    + \n +
    + \n +
    + ".LAN_11." +

    + [ ".LAN_174." ]
    [ ".LAN_212." ] +

    +
    +
    "; + $ns = new e107table; + $ns->tablerender(LAN_175, $text); +} + +function forumjump() +{ + global $forum; + $jumpList = $forum->forum_get_allowed(); + $text = "

    ".LAN_401.":

    "; + return $text; +} + +function redirect($url) +{ + echo "\n"; +} + +function process_upload() +{ + global $pref, $forum_info, $thread_info; + + if(isset($thread_info['head']['thread_id'])) + { + $tid = $thread_info['head']['thread_id']; + } + else + { + $tid = 0; + } + + if (isset($_FILES['file_userfile']['error']) && $_FILES['file_userfile']['error'] != 4) + { + require_once(e_HANDLER."upload_handler.php"); + if ($uploaded = file_upload('/'.e_FILE."public/", "attachment", "FT{$tid}_")) + { + foreach($uploaded as $upload) + { + if(strstr($upload['type'], "image")) + { + if(isset($pref['forum_maxwidth']) && $pref['forum_maxwidth'] > 0) + { + require_once(e_HANDLER."resize_handler.php"); + $orig_file = $upload['name']; + $p = strrpos($orig_file,'.'); + $new_file = substr($orig_file, 0 , $p)."_".substr($orig_file, $p); + $fpath = e_FILE."public/"; + if(resize_image($fpath.$orig_file, $fpath.$new_file, $pref['forum_maxwidth'])) + { + if($pref['forum_linkimg']) + { + $parms = image_getsize($fpath.$new_file); + $_POST['post'] .= "[br][link=".$fpath.$orig_file."][img{$parms}]".$fpath.$new_file."[/img][/link][br]"; + //show resized, link to fullsize + } + else + { + @unlink($fpath.$orig_file); + //show resized + $parms = image_getsize($fpath.$new_file); + $_POST['post'] .= "[br][img{$parms}]".$fpath.$new_file."[/img][br]"; + } + } + else + { + //resize failed, show original + $parms = image_getsize(e_FILE."public/".$upload['name']); + $_POST['post'] .= "[br][img{$parms}]".e_FILE."public/".$upload['name']."[/img]"; + } + } + else + { + $parms = image_getsize(e_FILE."public/".$upload['name']); + //resizing disabled, show original + $_POST['post'] .= "[br]
    [img{$parms}]".e_FILE."public/".$upload['name']."[/img]
    \n"; + } + } + else + { + //upload was not an image, link to file + //echo "
    "; print_r($upload); echo "
    "; + $_POST['post'] .= "[br][file=".e_FILE."public/".$upload['name']."]".$upload['name']."[/file]"; + } + + } + } + } +} + +function image_getsize($fname) +{ + if($imginfo = getimagesize($fname)) + { + return ":width={$imginfo[0]}&height={$imginfo[1]}"; + } + else + { + return ""; + } +} + + +require_once(FOOTERF); + +?> \ No newline at end of file diff --git a/e107_plugins/forum/forum_post_shortcodes.php b/e107_plugins/forum/forum_post_shortcodes.php new file mode 100644 index 000000000..43fb00e90 --- /dev/null +++ b/e107_plugins/forum/forum_post_shortcodes.php @@ -0,0 +1,152 @@ + e_sc -> parse_scbatch(__FILE__); + +/* +SC_BEGIN LATESTPOSTS +global $thread_info, $action, $gen, $tp, $forum_shortcodes, $post_info; +global $LATESTPOSTS_START, $LATESTPOSTS_END, $LATESTPOSTS_POST; +$txt = $tp->parseTemplate($LATESTPOSTS_START, TRUE, $forum_shortcodes); +for($i = count($thread_info)-2; $i>0; $i--) +{ + $post_info = $thread_info[$i]; + $txt .= $tp->parseTemplate($LATESTPOSTS_POST, TRUE, $forum_shortcodes); +} +$txt .= $tp->parseTemplate($LATESTPOSTS_END, TRUE, $forum_shortcodes); +return $txt; +SC_END + +SC_BEGIN THREADTOPIC +global $thread_info, $action, $gen, $tp, $post_info, $forum_shortcodes, $THREADTOPIC_REPLY; +$post_info = $thread_info['head']; +return $tp->parseTemplate($THREADTOPIC_REPLY, TRUE, $forum_shortcodes); +SC_END + +SC_BEGIN FORMSTART +return "
    "; +SC_END + +SC_BEGIN FORMEND +return "
    "; +SC_END + +SC_BEGIN FORUMJUMP +return forumjump(); +SC_END + +SC_BEGIN USERBOX +global $userbox; +return (USER == FALSE ? $userbox : ""); +SC_END + +SC_BEGIN SUBJECTBOX +global $subjectbox, $action; +return ($action == "nt" ? $subjectbox : ""); +SC_END + +SC_BEGIN POSTTYPE +global $action; +return ($action == "nt" ? LAN_63 : LAN_73); +SC_END + +SC_BEGIN POSTBOX +global $post, $pref; +$rows = (e_WYSIWYG) ? 15 : 10; +$ret = "\n
    \n"; +if(!e_WYSIWYG) +{ + $ret .= display_help('helpb', 'forum'); +} +return $ret; +SC_END + +SC_BEGIN BUTTONS +global $action, $eaction; +$ret = " "; +if ($action != "nt") +{ + $ret .= ($eaction ? "" : ""); +} +else +{ + $ret .= ($eaction ? "" : ""); +} +return $ret; +SC_END + +SC_BEGIN FILEATTACH +global $pref, $fileattach, $fileattach_alert; + +if ($pref['forum_attach'] && strpos(e_QUERY, "edit") === FALSE && (check_class($pref['upload_class']) || getperms('0'))) +{ + if (is_writable(e_FILE."public")) + { + return $fileattach; + } + else + { + $FILEATTACH = ""; + if(ADMIN) + { + if(!$fileattach_alert) + { + $fileattach_alert = "".($pref['image_post'] ? LAN_390 : LAN_416)."".LAN_FORUM_1."\n"; + } + return $fileattach_alert; + } + } +} +SC_END + +SC_BEGIN POSTTHREADAS +global $action, $thread_info; +if (MODERATOR && $action == "nt") +{ + $thread_s = (isset($_POST['threadtype']) ? $_POST['threadtype'] : $thread_info['head']['thread_s']); + return "
    ".LAN_400."".LAN_1." ".LAN_2." ".LAN_3.""; +} +return ""; +SC_END + +SC_BEGIN BACKLINK +global $forum, $thread_info,$eaction, $action,$BREADCRUMB; +$forum->set_crumb(TRUE,($action == "nt" ? ($eaction ? LAN_77 : LAN_60) : ($eaction ? LAN_78 : LAN_406." ".$thread_info['head']['thread_name']))); +return $BREADCRUMB; +SC_END + +SC_BEGIN EMAILNOTIFY +global $pref, $thread_info, $action; +if ($pref['email_notify'] && $action == "nt") +{ + if(isset($_POST['fpreview'])) + { + $chk = ($_POST['email_notify'] ? "checked = 'checked'" : ""); + } + else + { + if(isset($thread_info)) + { + $chk = ($thread_info['head']['thread_active'] == 99 ? "checked='checked'" : ""); + } + else + { + $chk = ($pref['email_notify_on'] ? "checked='checked'" : ""); + } + } + return "".LAN_380.""; +} +return ""; +SC_END + +SC_BEGIN POLL +global $poll_form, $action, $pref; +if ($action == "nt" && $pref['forum_poll'] && strpos(e_QUERY, "edit") === FALSE) +{ + return $poll_form; +} +return ""; +SC_END + +*/ +?> \ No newline at end of file diff --git a/e107_plugins/forum/forum_shortcodes.php b/e107_plugins/forum/forum_shortcodes.php new file mode 100644 index 000000000..463ad1829 --- /dev/null +++ b/e107_plugins/forum/forum_shortcodes.php @@ -0,0 +1,255 @@ + e_sc -> parse_scbatch(__FILE__); +/* +SC_BEGIN TOP +return "".LAN_10.""; +SC_END + +SC_BEGIN JOINED +global $post_info, $gen; +if ($post_info['user_id']) { +return LAN_06.': '.$gen->convert_date($post_info['user_join'], 'forum').'
    '; +} +SC_END + +SC_BEGIN THREADDATESTAMP +global $post_info, $gen, $thread_id; +return "".IMAGE_post." ".$gen->convert_date($post_info['thread_datestamp'], "forum"); +SC_END + +SC_BEGIN POST +global $post_info, $tp, $iphost; +$ret = ""; +$ret = $tp->toHTML($post_info["thread_thread"], TRUE, "", 'class:'.$post_info["user_class"]); +if (ADMIN && $iphost) { +$ret .= "
    ".$iphost; +} +return $ret; +SC_END + +SC_BEGIN PRIVMESSAGE +global $post_info, $tp; +if($post_info['user_id'] > 0){ + return $tp->parseTemplate("{SENDPM={$post_info['user_id']}}"); +} +SC_END + +SC_BEGIN AVATAR +global $post_info; +if ($post_info['user_id']) { +if ($post_info["user_image"]) { +require_once(e_HANDLER."avatar_handler.php"); +return "

    "; +} else { +return ""; +} +} else { +return "".LAN_194.""; +} +SC_END + +SC_BEGIN ANON_IP +global $post_info; +//die($post_info['thread_user']); +$x = explode(chr(1), $post_info['thread_user']); +if($x[1] && ADMIN) +{ + return $x[1]; +} +SC_END + +SC_BEGIN POSTER +global $post_info, $tp; +if($post_info['user_name']) +{ + return "".$post_info['user_name'].""; +} +else +{ + $x = explode(chr(1), $post_info['thread_user']); + $tmp = explode(".", $x[0], 2); + if(!$tmp[1]) + { + return FORLAN_103; + } + else + { + return "".$tp->toHTML($tmp[1]).""; + } +} +SC_END + +SC_BEGIN EMAILIMG +global $post_info, $tp; +if($post_info['user_id']) +{ + return (!$post_info['user_hideemail'] ? $tp->parseTemplate("{EMAILTO={$post_info['user_email']}}") : ""); +} +return ""; +SC_END + +SC_BEGIN EMAILITEM +global $post_info, $tp; +if($post_info['thread_parent'] == 0) +{ + return $tp->parseTemplate("{EMAIL_ITEM=".FORLAN_101."^plugin:forum.{$post_info['thread_id']}}"); +} +SC_END + +SC_BEGIN PRINTITEM +global $post_info, $tp; +if($post_info['thread_parent'] == 0) +{ + return $tp->parseTemplate("{PRINT_ITEM=".FORLAN_102."^plugin:forum.{$post_info['thread_id']}}"); +} +SC_END + +SC_BEGIN SIGNATURE +global $post_info, $tp; +return ($post_info['user_signature'] ? "

    ".$tp->toHTML($post_info['user_signature'],TRUE)."" : ""); +SC_END + +SC_BEGIN PROFILEIMG +global $post_info, $tp; +if (USER && $post_info['user_id']) { +return $tp->parseTemplate("{PROFILE={$post_info['user_id']}}"); +} else { +return ""; +} +SC_END + +SC_BEGIN POSTS +global $post_info; +if ($post_info['user_id']) { +return LAN_67.": ".$post_info['user_forums']."
    "; +} +SC_END + +SC_BEGIN VISITS +global $post_info; +if ($post_info['user_id']) { +return LAN_09.": ".$post_info['user_visits']."
    "; +} +SC_END + +SC_BEGIN EDITIMG +global $post_info, $thread_info, $thread_id; +if ($post_info['user_id'] != '0' && $post_info['user_name'] === USERNAME && $thread_info['head']['thread_active']) { +return "".IMAGE_edit." "; +} else { +return ""; +} +SC_END + +SC_BEGIN CUSTOMTITLE +global $post_info, $tp; +if ($post_info['user_customtitle']) { +return $tp->toHTML($post_info['user_customtitle'])."
    "; +} +SC_END + +SC_BEGIN WEBSITE +global $post_info, $tp; +if ($post_info['user_homepage']) { +return LAN_08.": ".$post_info['user_homepage']."
    "; +} +SC_END + +SC_BEGIN WEBSITEIMG +global $post_info; +if ($post_info['user_homepage'] && $post_info['user_homepage'] != "http://") { +return "".IMAGE_website.""; +} +SC_END + +SC_BEGIN QUOTEIMG +global $thread_info, $post_info, $forum_info; +if (check_class($forum_info['forum_postclass']) && check_class($forum_info['parent_postclass']) && $thread_info["head"]["thread_active"]) { +return "".IMAGE_quote.""; +} +SC_END + +SC_BEGIN REPORTIMG +global $post_info, $from; +if (USER) { +return "".IMAGE_report." "; +} +SC_END + +SC_BEGIN RPG +global $post_info; +return rpg($post_info['user_join'],$post_info['user_forums']); +SC_END + +SC_BEGIN MEMBERID +global $post_info, $ldata, $pref, $forum_info; +if ($post_info['anon']) { +return ""; +} + +$fmod = ($post_info['user_class'] != "" && check_class($forum_info['forum_moderators'], $post_info['user_class'], TRUE)); +if(!$fmod && $forum_info['forum_moderators'] == e_UC_ADMIN) +{ + $fmod = $post_info['user_admin']; +} +if (!array_key_exists($post_info['user_id'],$ldata)) { + $ldata[$post_info['user_id']] = get_level($post_info['user_id'], $post_info['user_forums'], $post_info['user_comments'], $post_info['user_chats'], $post_info['user_visits'], $post_info['user_join'], $post_info['user_admin'], $post_info['user_perms'], $pref, $fmod); +} +return $ldata[$post_info['user_id']][0]; +SC_END + +SC_BEGIN LEVEL +global $post_info, $ldata, $pref, $forum_info; +if ($post_info['anon']) { +return ""; +} +$fmod = ($post_info['user_class'] != "" && check_class($forum_info['forum_moderators'], $post_info['user_class'], TRUE)); +if(!$fmod && $forum_info['forum_moderators'] == e_UC_ADMIN) +{ + $fmod = $post_info['user_admin']; +} +if (!array_key_exists($post_info['user_id'],$ldata)) { +$ldata[$post_info['user_id']] = get_level($post_info['user_id'], $post_info['user_forums'], $post_info['user_comments'], $post_info['user_chats'], $post_info['user_visits'], $post_info['user_join'], $post_info['user_admin'], $post_info['user_perms'], $pref, $fmod); +} +if($parm == 'pic') +{ +return $ldata[$post_info['user_id']]['pic']; +} +if($parm == 'name') +{ +return $ldata[$post_info['user_id']]['name']; +} +if($parm == 'special') +{ +return $ldata[$post_info['user_id']]['special']; +} +if($parm == 'userid') +{ +return $ldata[$post_info['user_id']]['userid']; +} +return $ldata[$post_info['user_id']][1]; +SC_END + +SC_BEGIN MODOPTIONS +if (MODERATOR) { +return showmodoptions(); +} +SC_END + +SC_BEGIN LASTEDIT +global $post_info, $gen; +if ($post_info['thread_edit_datestamp']) { +return $gen->convert_date($post_info['thread_edit_datestamp'],'forum'); +} +return ""; +SC_END + +SC_BEGIN POLL +global $pollstr; +return $pollstr; +SC_END + +*/ +?> \ No newline at end of file diff --git a/e107_plugins/forum/forum_sql.php b/e107_plugins/forum/forum_sql.php new file mode 100644 index 000000000..702477c5d --- /dev/null +++ b/e107_plugins/forum/forum_sql.php @@ -0,0 +1,39 @@ +CREATE TABLE forum ( + forum_id int(10) unsigned NOT NULL auto_increment, + forum_name varchar(250) NOT NULL default '', + forum_description text NOT NULL, + forum_parent int(10) unsigned NOT NULL default '0', + forum_sub int(10) unsigned NOT NULL default '0', + forum_datestamp int(10) unsigned NOT NULL default '0', + forum_moderators text NOT NULL, + forum_threads int(10) unsigned NOT NULL default '0', + forum_replies int(10) unsigned NOT NULL default '0', + forum_lastpost_user varchar(200) NOT NULL default '', + forum_lastpost_info varchar(40) NOT NULL default '', + forum_class varchar(100) NOT NULL default '', + forum_order int(10) unsigned NOT NULL default '0', + forum_postclass tinyint(3) unsigned NOT NULL default '0', + PRIMARY KEY (forum_id) + ) TYPE=MyISAM AUTO_INCREMENT=1 + +CREATE TABLE forum_t ( + thread_id int(10) unsigned NOT NULL auto_increment, + thread_name varchar(250) NOT NULL default '', + thread_thread text NOT NULL, + thread_forum_id int(10) unsigned NOT NULL default '0', + thread_datestamp int(10) unsigned NOT NULL default '0', + thread_parent int(10) unsigned NOT NULL default '0', + thread_user varchar(250) NOT NULL default '', + thread_views int(10) unsigned NOT NULL default '0', + thread_active tinyint(3) unsigned NOT NULL default '0', + thread_lastpost int(10) unsigned NOT NULL default '0', + thread_s tinyint(1) unsigned NOT NULL default '0', + thread_edit_datestamp int(10) unsigned NOT NULL default '0', + thread_lastuser varchar(30) NOT NULL default '', + thread_total_replies int(10) unsigned NOT NULL default '0', + PRIMARY KEY (thread_id), + KEY thread_parent (thread_parent), + KEY thread_datestamp (thread_datestamp), + KEY thread_forum_id (thread_forum_id) + ) TYPE=MyISAM AUTO_INCREMENT=1; + diff --git a/e107_plugins/forum/forum_stats.php b/e107_plugins/forum/forum_stats.php new file mode 100644 index 000000000..e459aaf4a --- /dev/null +++ b/e107_plugins/forum/forum_stats.php @@ -0,0 +1,371 @@ + db_Count("forum_t"); +$total_topics = $sql -> db_Count("forum_t", "(*)", "WHERE thread_parent=0"); +$total_replies = $sql -> db_Count("forum_t", "(*)", "WHERE thread_parent!=0"); +$total_views = $sql->db_Count("SELECT sum(thread_views) FROM ".MPREFIX."forum_t", "generic"); + +$firstpost = $sql -> db_Select("forum_t", "thread_datestamp", "thread_datestamp > 0 ORDER BY thread_datestamp ASC LIMIT 0,1"); +$fp = $sql -> db_Fetch(); + +$open_ds = $fp['thread_datestamp']; +$open_date = $gen->convert_date($open_ds, "long"); +$open_since = $gen -> computeLapse($open_ds); +$open_days = floor((time()-$open_ds) / 86400); +$postsperday = ($open_days < 1 ? $total_posts : round($total_posts / $open_days)); + +$query = "SHOW TABLE STATUS FROM $mySQLdefaultdb"; +$sql -> db_Select_gen($query); +$array = $sql -> db_getList(); +foreach($array as $table) +{ + if($table['Name'] == MPREFIX."forum_t") + { + $db_size = parsesize($table['Data_length']); + $avg_row_len = parsesize($table['Avg_row_length']); + break; + } +} + + +$query = " +SELECT ft.thread_id, ft.thread_user, ft.thread_name, ft.thread_total_replies, ft.thread_datestamp, f.forum_class, u.user_name FROM #forum_t as ft +LEFT JOIN #user AS u ON ft.thread_user = u.user_id +LEFT JOIN #forum AS f ON f.forum_id = ft.thread_forum_id +WHERE ft.thread_parent = 0 +AND ft.thread_active != 0 +AND f.forum_class IN (".USERCLASS_LIST.") +ORDER BY thread_total_replies DESC LIMIT 0,10"; +$sql -> db_Select_gen($query); +$most_activeArray = $sql -> db_getList(); + +$query = " +SELECT ft.*, f.forum_class, user_name FROM #forum_t as ft +LEFT JOIN #user AS u ON ft.thread_user = u.user_id +LEFT JOIN #forum AS f ON f.forum_id = ft.thread_forum_id +WHERE ft.thread_parent=0 +AND f.forum_class IN (".USERCLASS_LIST.") +ORDER BY thread_views DESC LIMIT 0,10"; + +$sql -> db_Select_gen($query); +$most_viewedArray = $sql -> db_getList(); + +$sql->db_Select("user", "user_id, user_name, user_forums", "ORDER BY user_forums DESC LIMIT 0, 10", "no_where"); +$posters = $sql -> db_getList(); +$top_posters = array(); +foreach($posters as $poster) +{ + $percen = round(($poster['user_forums'] / $total_posts) * 100, 2); + $top_posters[] = array("user_id" => $poster['user_id'], "user_name" => $poster['user_name'], "user_forums" => $poster['user_forums'], "percentage" => $percen); +} + +$query = " +SELECT SUBSTRING_INDEX(thread_user,'.',1) AS t_user, COUNT(SUBSTRING_INDEX(ft.thread_user,'.',1)) AS ucount, u.user_name, u.user_id FROM #forum_t as ft +LEFT JOIN #user AS u ON SUBSTRING_INDEX(ft.thread_user,'.',1) = u.user_id +WHERE ft.thread_parent=0 +GROUP BY t_user +ORDER BY ucount DESC +LIMIT 0,10"; +$sql -> db_Select_gen($query); +$posters = $sql -> db_getList(); +$top_topic_starters = array(); +foreach($posters as $poster) +{ + $percen = round(($poster['ucount'] / $total_topics) * 100, 2); + $top_topic_starters[] = array("user_id" => $poster['user_id'], "user_name" => $poster['user_name'], "user_forums" => $poster['ucount'], "percentage" => $percen); +} + +$query = " +SELECT SUBSTRING_INDEX(thread_user,'.',1) AS t_user, COUNT(SUBSTRING_INDEX(ft.thread_user,'.',1)) AS ucount, u.user_name, u.user_id FROM #forum_t as ft +LEFT JOIN #user AS u ON SUBSTRING_INDEX(ft.thread_user,'.',1) = u.user_id +WHERE ft.thread_parent!=0 +GROUP BY t_user +ORDER BY ucount DESC +LIMIT 0,10"; +$sql -> db_Select_gen($query); +$posters = $sql -> db_getList(); + +$top_repliers = array(); +foreach($posters as $poster) +{ + $percen = round(($poster['ucount'] / $total_replies) * 100, 2); + $top_repliers[] = array("user_id" => $poster['user_id'], "user_name" => $poster['user_name'], "user_forums" => $poster['ucount'], "percentage" => $percen); +} + + + +$text = " +
    + + + + + + + + +
    ".FSLAN_1."
    + + + + + + + + + + + + +
    ".FSLAN_2.":  $open_date
    ".FSLAN_3.":  $open_since
    ".FSLAN_4.":  $total_posts
    ".FSLAN_5.":  $total_topics
    ".FSLAN_6.":  $total_replies
    ".FSLAN_7.":  $total_views
    ".FSLAN_24.":  $postsperday
    ".FSLAN_8.":  $db_size
    ".FSLAN_9.":  $avg_row_len
    +
    +
    + +
    + + + + + + + + + + + +"; + +$count=1; +foreach($most_activeArray as $ma) +{ + if($ma['user_name']) + { + $uinfo = "{$ma['user_name']}"; + } + else + { + $tmp = explode(chr(1), $ma['thread_anon']); + $uinfo = $tp->toHTML($tmp[0]); + } + + $text .= " + + + + + + + "; + $count++; +} +$text .= "
    ".FSLAN_10."
    ".FSLAN_11."".FSLAN_12."".FSLAN_13."".FSLAN_14."".FSLAN_15."
    $count{$ma['thread_name']}{$ma['thread_total_replies']}{$uinfo}".$gen->convert_date($ma['thread_datestamp'], "forum")."
    +
    + +
    + + + + + + + + + + + +"; + +$count=1; +foreach($most_viewedArray as $ma) +{ + extract($ma); + $text .= " + + + + + + + "; + $count++; +} +$text .= "
    ".FSLAN_16."
    ".FSLAN_11."".FSLAN_12."".FSLAN_17."".FSLAN_14."".FSLAN_15."
    $count$thread_name$thread_views$user_name".$gen->convert_date($thread_datestamp, "forum")."
    +
    + +
    + + + + + + + + + + + +"; + +$count=1; +foreach($top_posters as $ma) +{ + extract($ma); + $text .= " + + + + + + + "; + $count++; +} +$text .= " +
    ".FSLAN_18."
    ".FSLAN_11."".FSLAN_19."".FSLAN_20."% 
    $count$user_name$user_forums$percentage% + +
    +
    +
    + +
    +
    + +
    + + + + + + + + + + + +"; + +$count=1; +foreach($top_topic_starters as $ma) +{ + extract($ma); + $text .= " + + + + + + + "; + $count++; +} +$text .= "
    ".FSLAN_21."
    ".FSLAN_11."".FSLAN_19."".FSLAN_20."% 
    $count$user_name$user_forums$percentage% + +
    +
    +
    + +
    +
    + + +
    + + + + + + + + + + + +"; + +$count=1; +foreach($top_repliers as $ma) +{ + extract($ma); + $text .= " + + + + + + + "; + $count++; +} +$text .= "
    ".FSLAN_22."
    ".FSLAN_11."".FSLAN_19."".FSLAN_20."% 
    $count$user_name$user_forums$percentage% + +
    +
    +
    + +
    +
    +"; + + +$ns -> tablerender(FSLAN_23, $text); + + +require_once(FOOTERF); + +function parsesize($size) { + $kb = 1024; + $mb = 1024 * $kb; + $gb = 1024 * $mb; + $tb = 1024 * $gb; + if(!$size) + { + return '0'; + } + if ($size < $kb) { + return $size." b"; + } + else if($size < $mb) { + return round($size/$kb, 2)." kb"; + } + else if($size < $gb) { + return round($size/$mb, 2)." mb"; + } + else if($size < $tb) { + return round($size/$gb, 2)." gb"; + } else { + return round($size/$tb, 2)." tb"; + } +} + + +?> \ No newline at end of file diff --git a/e107_plugins/forum/forum_test.php b/e107_plugins/forum/forum_test.php new file mode 100644 index 000000000..5db440de2 --- /dev/null +++ b/e107_plugins/forum/forum_test.php @@ -0,0 +1,21 @@ +update_lastpost('thread',$i); +//} + +set_time_limit(240); +$forum->update_lastpost('forum', 'all'); +//$x = $forum->update_lastpost('forum',16); + + +$timeend = microtime(); +$diff = number_format(((substr($timeend, 0, 9)) + (substr($timeend, -10)) - (substr($timestart, 0, 9)) - (substr($timestart, -10))), 4); +echo "
    script generation took $diff s"; + +?> \ No newline at end of file diff --git a/e107_plugins/forum/forum_update.php b/e107_plugins/forum/forum_update.php new file mode 100644 index 000000000..bfea2f6e4 --- /dev/null +++ b/e107_plugins/forum/forum_update.php @@ -0,0 +1,173 @@ +db_Select("plugin", "plugin_version", "plugin_name = 'Forum'")) +{ + $row = $sql->db_Fetch(); + $forum_version = $row['plugin_version']; +} + + +$forum_subs = FALSE; +$fields = mysql_list_fields($mySQLdefaultdb, MPREFIX."forum"); +$columns = mysql_num_fields($fields); +for ($i = 0; $i < $columns; $i++) +{ + if("forum_sub" == mysql_field_name($fields, $i)) + { + $forum_subs = TRUE; + } +} + +$text = ""; +if(!$forum_subs) +{ + $text .= forum_stage1(); + $text .= forum_stage2(); + $text .= forum_stage3(); + $text .= forum_stage4(); + $text .= forum_stage5(); + $text .= forum_stage6(); +} + +if($forum_version < 1.2) +{ + $text .= mods_to_userclass(); +} +$text .= set_forum_version(); + +$timeend = microtime(); +$diff = number_format(((substr($timeend, 0, 9)) + (substr($timeend, -10)) - (substr($timestart, 0, 9)) - (substr($timestart, -10))), 4); +$text .= "
    script generation took $diff s"; + +if ($pref['developer']) { + $ns->tablerender('forum upgrade',$text); +} + +function forum_stage1() +{ + global $sql; + $ttab = MPREFIX.'forum_t'; + $sql->db_Select_gen("ALTER TABLE #forum_t ADD thread_edit_datestamp int(10) unsigned NOT NULL default '0'"); + $sql->db_Select_gen("ALTER TABLE #forum_t ADD thread_lastuser varchar(30) NOT NULL default ''"); + $sql->db_Select_gen("ALTER TABLE #forum_t ADD thread_total_replies int(10) unsigned NOT NULL default '0'"); + $sql->db_Select_gen("ALTER TABLE #forum ADD forum_postclass TINYINT( 3 ) UNSIGNED DEFAULT '0' NOT NULL ;"); + $sql->db_Select_gen("ALTER TABLE #forum ADD `forum_sub` INT( 10 ) UNSIGNED DEFAULT '0' NOT NULL AFTER `forum_parent` ;"); + return "Updated table structure
    "; +} + +function forum_stage2() +{ + global $sql; + $ttab = MPREFIX.'forum_t'; +// $numrows = $sql->db_Update('forum_t', "thread_anon = SUBSTRING(thread_user,3) WHERE thread_user LIKE '0.%'"); + $numrows = $sql->db_Update('forum_t', "thread_user = CAT('0.', thread_anon) WHERE thread_user = '0'"); + return $ret."Updated anonymous post info ... $numrows rows updated
    "; +} + +function forum_stage3() +{ + global $sql; + $sql->db_Select_gen("ALTER TABLE #forum_t CHANGE thread_user thread_user varchar(250) NOT NULL default ''"); + $sql->db_Select_gen("ALTER TABLE #forum_t DROP thread_anon"); + return "Updated thread_user & forum_anon field
    "; +} + +function forum_stage4() +{ + global $sql, $forum; + $sql->db_Select_gen("SELECT thread_parent AS id, COUNT(*) AS amount FROM #forum_t WHERE thread_parent !=0 GROUP BY thread_parent"); + $threadArray = $sql->db_getList('ALL', FALSE, 0); + foreach($threadArray as $threads) + { + extract($threads); + $sql->db_Update("forum_t", "thread_total_replies=$amount WHERE thread_id=$id"); + } + + $ret = "Updated thread reply info...".count($threadArray). " threads updated.
    "; + $forum = new e107forum; + $forum->forum_update_counts('all'); + return $ret."Updated forum thread count info.
    "; +} + +function forum_stage5() +{ + global $sql, $forum; + $sql->db_Select_gen("ALTER TABLE #forum CHANGE forum_lastpost forum_lastpost_user varchar(200) NOT NULL default ''"); + $sql->db_Select_gen("ALTER TABLE #forum ADD forum_lastpost_info varchar(40) NOT NULL default '' AFTER forum_lastpost_user"); + set_time_limit(180); + $forum->update_lastpost('forum', 'all', TRUE); + return "Updated lastpost info
    "; +} + +function forum_stage6() +{ + global $sql; + global $PLUGINS_DIRECTORY; + if(!$sql->db_Count('plugin','(*)',"WHERE plugin_name = 'Forum'")) + { + $sql->db_Insert('plugin',"0,'Forum','1.1','forum',1"); + return "Forum entry added to plugin table, set as installed.
    "; + } + else + { + $sql->db_Update('plugin',"plugin_installflag = 1 WHERE plugin_name='Forum'"); + } + $sql->db_Update('links',"link_url='{$PLUGINS_DIRECTORY}forum/forum.php' WHERE link_name='Forum'"); + +} + +function mods_to_userclass() +{ + global $sql; + require_once(e_HANDLER."userclass_class.php"); + $_uc = new e_userclass; + if($sql->db_Select("forum", "forum_id, forum_moderators","forum_parent != 0")) + { + $fList = $sql->db_getList(); + foreach($fList as $row) + { + if(!is_numeric($row['forum_moderators'])) + { + $newclass = $_uc->class_create($row['forum_moderators'], "FORUM_MODS_"); + $sql->db_Update("forum", "forum_moderators = '{$newclass}' WHERE forum_id = '{$row['forum_id']}'"); + } + } + } + return "Forum moderators converted to userclasses
    "; +} + +function set_forum_version() +{ + global $sql; + $new_version = "1.2"; + $sql->db_Update('plugin',"plugin_version = '{$new_version}' WHERE plugin_name='Forum'"); + return "Forum Version updated to version: $new_version
    "; +} + +?> \ No newline at end of file diff --git a/e107_plugins/forum/forum_update_check.php b/e107_plugins/forum/forum_update_check.php new file mode 100644 index 000000000..490a05ce0 --- /dev/null +++ b/e107_plugins/forum/forum_update_check.php @@ -0,0 +1,73 @@ +db_Select("plugin", "plugin_version", "plugin_name = 'Forum'")) + { + $row = $sql->db_Fetch(); + if($row['plugin_version'] < 1.2) + { + return FALSE; + } + } + $fields = mysql_list_fields($mySQLdefaultdb, MPREFIX."forum"); + if(!$fields) + { + return TRUE; + } + $columns = mysql_num_fields($fields); + for ($i = 0; $i < $columns; $i++) + { + if ("forum_lastpost_info" == mysql_field_name($fields, $i)) + { + $flist = mysql_list_fields($mySQLdefaultdb, MPREFIX."forum_t"); + $cols = mysql_num_fields($flist); + for ($x = 0; $x < $cols; $x++) + { + if("thread_anon" == mysql_field_name($flist, $x)) + { + return FALSE; //needed + } + } + } + if("forum_sub" == mysql_field_name($fields, $i)) + { + return TRUE; //not needed + } + } + return FALSE; //needed + } +} + +?> + \ No newline at end of file diff --git a/e107_plugins/forum/forum_uploads.php b/e107_plugins/forum/forum_uploads.php new file mode 100644 index 000000000..05f43f353 --- /dev/null +++ b/e107_plugins/forum/forum_uploads.php @@ -0,0 +1,121 @@ +tablerender(FRMUP_4, $msg); +} + +$fi = new e_file; +$mask = ".*_".USERID."_FT.*"; +$fileList = $fi->get_files(e_FILE."public", $mask); +if($sql->db_Select('forum_t','thread_id, thread_thread, thread_parent', "thread_thread REGEXP '.*_".USERID."_FT.*'")) +{ + $threadList = $sql->db_getList(); +} + +$filecount = 0; +if(is_array($fileList)) +{ + $txt = " +
    + + + + + "; + foreach($fileList as $finfo) + { + if($finfo['fname']) + { + $filecount++; + $txt .= ""; + $found = FALSE; + if(is_array($threadList)) + { + foreach($threadList as $tinfo) + { + if(strpos($tinfo['thread_thread'], $finfo['fname']) != FALSE) + { + $found = $tinfo; + break; + } + } + } + if($found != FALSE) + { + if($tinfo['thread_parent']) + { + $txt .= ""; + } + else + { + $txt .= ""; + } + + } + else + { + $txt .= ""; + } + $txt .= ""; + } + } + $txt .= "
    ".FRMUP_5."".FRMUP_6."
    {$finfo['fname']}".FRMUP_7.": {$tinfo['thread_parent']}".FRMUP_7.": {$tinfo['thread_id']}".FRMUP_8."
    "; +} +if(!$filecount) { + $ns->tablerender(FRMUP_1,FRMUP_9); + include_once(FOOTERF); + exit; +} + +$ns->tablerender(FRMUP_1, $txt); +include_once(FOOTERF); + diff --git a/e107_plugins/forum/forum_viewforum.php b/e107_plugins/forum/forum_viewforum.php new file mode 100644 index 000000000..a3096287f --- /dev/null +++ b/e107_plugins/forum/forum_viewforum.php @@ -0,0 +1,521 @@ +forum_get($forum_id); + +if (!check_class($forum_info['forum_class']) || !check_class($forum_info['parent_class']) || !$forum_info['forum_parent']) +{ + header("Location:".e_PLUGIN."forum/forum.php"); + exit; +} + +if (!$FORUM_VIEW_START) { + if (file_exists(THEME."forum_viewforum_template.php")) + { + require_once(THEME."forum_viewforum_template.php"); + } + else if (file_exists(THEME."forum_template.php")) + { + require_once(THEME."forum_template.php"); + } + else + { + require_once(e_PLUGIN."forum/templates/forum_viewforum_template.php"); + } +} + + +$forum_info['forum_name'] = $tp->toHTML($forum_info['forum_name'], TRUE, 'no_hook, emotes_off'); +$forum_info['forum_description'] = $tp->toHTML($forum_info['forum_description'], TRUE, 'no_hook'); + +$_forum_name = (substr($forum_info['forum_name'], 0, 1) == "*" ? substr($forum_info['forum_name'], 1) : $forum_info['forum_name']); +define("e_PAGETITLE", LAN_01." / ".$_forum_name); +define("MODERATOR", $forum_info['forum_moderators'] != "" && check_class($forum_info['forum_moderators'])); +$modArray = $forum->forum_getmods($forum_info['forum_moderators']); +$message = ""; +if (MODERATOR) +{ + if ($_POST) + { + require_once(e_PLUGIN."forum/forum_mod.php"); + $message = forum_thread_moderate($_POST); + } +} + +$member_users = $sql->db_Select("online", "*", "online_location REGEXP('forum_viewforum.php.$forum_id') AND online_user_id!='0' "); +$guest_users = $sql->db_Select("online", "*", "online_location REGEXP('forum_viewforum.php.$forum_id') AND online_user_id='0' "); +$users = $member_users+$guest_users; + +require_once(HEADERF); +$text=''; +if ($message) +{ + $ns->tablerender("", $message, array('forum_viewforum', 'msg')); +} + +$topics = $forum->forum_get_topic_count($forum_id); + +if ($topics > $view) +{ + $pages = ceil($topics/$view); +} +else +{ + $pages = FALSE; +} + +if ($pages) +{ + if(strpos($FORUM_VIEW_START, 'THREADPAGES') !== FALSE || strpos($FORUM_VIEW_END, 'THREADPAGES') !== FALSE) + { + $parms = "{$topics},{$view},{$thread_from},".e_SELF.'?'.$forum_id.'.[FROM],off'; + $THREADPAGES = LAN_316." ".$tp->parseTemplate("{NEXTPREV={$parms}}"); + } +} + +if (check_class($forum_info['forum_postclass']) && check_class($forum_info['parent_postclass'])) +{ + $NEWTHREADBUTTON = "".IMAGE_newthread.""; +} + +if(substr($forum_info['forum_name'], 0, 1) == "*") +{ + $forum_info['forum_name'] = substr($forum_info['forum_name'], 1); + $container_only = true; +} +else +{ + $container_only = false; +} + +if(substr($forum_info['sub_parent'], 0, 1) == "*") +{ + $forum_info['sub_parent'] = substr($forum_info['sub_parent'], 1); +} + +$forum->set_crumb(); // set $BREADCRUMB (and $BACKLINK) + +$FORUMTITLE = $forum_info['forum_name']; +//$MODERATORS = LAN_404.": ".$forum_info['forum_moderators']; +$MODERATORS = LAN_404.": ".implode(", ", $modArray); +$BROWSERS = $users." ".($users == 1 ? LAN_405 : LAN_406)." (".$member_users." ".($member_users == 1 ? LAN_407 : LAN_409).", ".$guest_users." ".($guest_users == 1 ? LAN_408 : LAN_410).")"; + +$ICONKEY = " + + + + + + + + + + + + + + + + + + + + + +
    ".IMAGE_new_small."".LAN_79."".IMAGE_nonew_small."".LAN_80."".IMAGE_sticky_small."".LAN_202."".IMAGE_announce_small."".LAN_396."
    ".IMAGE_new_popular_small."".LAN_79." ".LAN_395."".IMAGE_nonew_popular_small."".LAN_80." ".LAN_395."".IMAGE_stickyclosed_small."".LAN_203."".IMAGE_closed_small."".LAN_81."
    "; + +$SEARCH = " + +

    + + + + +

    +
    "; + +if(check_class($forum_info['forum_postclass'])) +{ + $PERMS = LAN_204." - ".LAN_206." - ".LAN_208; +} +else +{ + $PERMS = LAN_205." - ".LAN_207." - ".LAN_209; +} + +$sticky_threads = 0; +$stuck = FALSE; +$reg_threads = 0; +$unstuck = FALSE; + +$thread_list = $forum->forum_get_topics($forum_id, $thread_from, $view); +$sub_list = $forum->forum_getsubs($forum_id); +//print_a($sub_list); +$gen = new convert; + +$SUBFORUMS = ""; +if(is_array($sub_list)) +{ + $newflag_list = $forum->forum_newflag_list(); + $sub_info = ""; + foreach($sub_list as $sub) + { + $sub_info .= parse_sub($sub); + } + $SUBFORUMS = $FORUM_VIEW_SUB_START.$sub_info.$FORUM_VIEW_SUB_END; +} + + +if (count($thread_list) ) +{ + foreach($thread_list as $thread_info) { + $idArray[] = $thread_info['thread_id']; + } + $inList = '('.implode(',', $idArray).')'; + foreach($thread_list as $thread_info) { + if ($thread_info['thread_s']) { + $sticky_threads ++; + } + if ($sticky_threads > 0 && !$stuck && $pref['forum_hilightsticky']) + { + if($FORUM_IMPORTANT_ROW) + { + $forum_view_forum .= $FORUM_IMPORTANT_ROW; + } + else + { + $forum_view_forum .= " ".LAN_411.""; + } + $stuck = TRUE; + } + if (!$thread_info['thread_s']) + { + $reg_threads ++; + } + if ($reg_threads == "1" && !$unstuck && $stuck) + { + if($FORUM_NORMAL_ROW) + { + $forum_view_forum .= $FORUM_NORMAL_ROW; + } + else + { + $forum_view_forum .= " ".LAN_412.""; + } + $unstuck = TRUE; + } + $forum_view_forum .= parse_thread($thread_info); + } +} +else +{ + $forum_view_forum .= "".LAN_58.""; +} + +$sql->db_Select("forum", "*", "forum_parent !=0 AND forum_class!='255' "); +$FORUMJUMP = forumjump(); +$TOPLINK = "".LAN_02.""; + +if($container_only) +{ + $FORUM_VIEW_START = ($FORUM_VIEW_START_CONTAINER ? $FORUM_VIEW_START_CONTAINER : $FORUM_VIEW_START); + $FORUM_VIEW_END = ($FORUM_VIEW_END_CONTAINER ? $FORUM_VIEW_END_CONTAINER : $FORUM_VIEW_END); + $forum_view_forum = ""; +} + +$forum_view_start = preg_replace("/\{(.*?)\}/e", '$\1', $FORUM_VIEW_START); +$forum_view_end = preg_replace("/\{(.*?)\}/e", '$\1', $FORUM_VIEW_END); + + +if ($pref['forum_enclose']) +{ + $ns->tablerender($pref['forum_title'], $forum_view_start.$forum_view_subs.$forum_view_forum.$forum_view_end, array('forum_viewforum', 'main1')); +} +else +{ + echo $forum_view_start.$forum_view_forum.$forum_view_end; +} + +echo ""; + +require_once(FOOTERF); + + +function parse_thread($thread_info) +{ + global $forum, $tp, $FORUM_VIEW_FORUM, $gen, $pref, $forum_id, $menu_pref; + $text = ""; + $VIEWS = $thread_info['thread_views']; + $REPLIES = $thread_info['thread_total_replies']; + + + if ($REPLIES) + { + $lastpost_datestamp = $gen->convert_date($thread_info['thread_lastpost'], 'forum'); + $tmp = explode(".", $thread_info['thread_lastuser'], 2); + if($thread_info['lastpost_username']) + { + $LASTPOST = "".$thread_info['lastpost_username'].""; + } + else + { + if($tmp[1]) + { + $LASTPOST = $tp->toHTML($tmp[1]); + } + else + { + $LASTPOST = FORLAN_19; + } + } + $LASTPOST .= "
    ".$lastpost_datestamp; + } + else + { + $REPLIES = LAN_317; + $LASTPOST = " - "; + } + + $newflag = FALSE; + if (USER) + { + if ($thread_info['thread_lastpost'] > USERLV && !preg_match("#\b".$thread_info['thread_id']."\b#", USERVIEWED)) + { + $newflag = TRUE; + } + } + + $THREADDATE = $gen->convert_date($thread_info['thread_datestamp'], 'forum'); + $ICON = ($newflag ? IMAGE_new : IMAGE_nonew); + if ($REPLIES >= $pref['forum_popular'] && $REPLIES != "None") { + $ICON = ($newflag ? IMAGE_new_popular : IMAGE_nonew_popular); + } + + $THREADTYPE = ''; + if ($thread_info['thread_s'] == 1) + { + $ICON = ($thread_info['thread_active'] ? IMAGE_sticky : IMAGE_stickyclosed); + $THREADTYPE = '['.LAN_202.']
    '; + } + elseif($thread_info['thread_s'] == 2) + { + $ICON = IMAGE_announce; + $THREADTYPE = '['.LAN_396.']
    '; + } + elseif(!$thread_info['thread_active']) + { + $ICON = IMAGE_closed; + } + + $thread_name = strip_tags($tp->toHTML($thread_info['thread_name'], false, 'no_hook, emotes_off')); + if (strtoupper($THREADTYPE) == strtoupper(substr($thread_name, 0, strlen($THREADTYPE)))) { + $thread_name = substr($thread_name, strlen($THREADTYPE)); + } + if ($pref['forum_tooltip']) { + $thread_thread = strip_tags($tp->toHTML($thread_info['thread_thread'], true, 'no_hook')); + $tip_length = ($pref['forum_tiplength'] ? $pref['forum_tiplength'] : 400); + if (strlen($thread_thread) > $tip_length) { + $thread_thread = substr($thread_thread, 0, $tip_length)." ".$menu_pref['newforumposts_postfix']; + } + $thread_thread = str_replace("'", "'", $thread_thread); + $title = "title='".$thread_thread."'"; + } else { + $title = ""; + } + $THREADNAME = "{$thread_name}"; + + $pages = ceil(($REPLIES+1)/$pref['forum_postspage']); + if ($pages > 1) + { + if($pages > 6) + { + for($a = 0; $a <= 2; $a++) + { + $PAGES .= $PAGES ? " " : ""; + $PAGES .= "".($a+1).""; + } + $PAGES .= " ... "; + for($a = $pages-3; $a <= $pages-1; $a++) + { + $PAGES .= $PAGES ? " " : ""; + $PAGES .= "".($a+1).""; + } + } + else + { + for($a = 0; $a <= ($pages-1); $a++) + { + $PAGES .= $PAGES ? " " : ""; + $PAGES .= "".($a+1).""; + } + } + $PAGES = LAN_316." [ ".$PAGES." ]"; + } + else + { + $PAGES = ""; + } + + if (MODERATOR) + { + $thread_id = $thread_info['thread_id']; + $ADMIN_ICONS = " +
    + "; + + $ADMIN_ICONS .= " \n"; + + $ADMIN_ICONS .= ($thread_info['thread_s'] == 1) ? " " : + " "; + $ADMIN_ICONS .= ($thread_info['thread_active']) ? " " : + " "; + $ADMIN_ICONS .= "".IMAGE_admin_move.""; + $ADMIN_ICONS .= " +
    + "; + } + + $text .= " + ".$THREADDATE."
    + "; + $tmp = explode(".", $thread_info['thread_user'], 2); + if($thread_info['user_name']) + { + $POSTER = "".$thread_info['user_name'].""; + } + else + { + if($tmp[1]) + { + $x = explode(chr(1), $tmp[1]); + $POSTER = $tp->toHTML($x[0]); + } + else + { + $POSTER = FORLAN_19; + } + } + + if ($thread_info['thread_s'] == 1 && $FORUM_VIEW_FORUM_STICKY) + { + return(preg_replace("/\{(.*?)\}/e", '$\1', $FORUM_VIEW_FORUM_STICKY)); + } + + if ($thread_info['thread_s'] == 2 && $FORUM_VIEW_FORUM_ANNOUNCE) + { + return(preg_replace("/\{(.*?)\}/e", '$\1', $FORUM_VIEW_FORUM_ANNOUNCE)); + } + + return(preg_replace("/\{(.*?)\}/e", '$\1', $FORUM_VIEW_FORUM)); +} + +function parse_sub($subInfo) +{ + global $FORUM_VIEW_SUB, $gen, $tp, $newflag_list; + $SUB_FORUMTITLE = "{$subInfo['forum_name']}"; + $SUB_DESCRIPTION = $tp->toHTML($subInfo['forum_description'], false, 'no_hook'); + $SUB_THREADS = $subInfo['forum_threads']; + $SUB_REPLIES = $subInfo['forum_replies']; + if(USER && is_array($newflag_list) && in_array($subInfo['forum_id'], $newflag_list)) + { + $NEWFLAG = "".IMAGE_new.""; + } + else + { + $NEWFLAG = IMAGE_nonew; + } + + if($subInfo['forum_lastpost_info']) + { + $tmp = explode(".", $subInfo['forum_lastpost_info']); + $lp_thread = "".IMAGE_post2.""; + $lp_date = $gen->convert_date($tmp[0], 'forum'); + $tmp = explode(".", $subInfo['forum_lastpost_user']); + if($subInfo['user_name']) + { + $lp_name = "{$subInfo['user_name']}"; + } + else + { + $lp_name = $tmp[1]; + } + $SUB_LASTPOST = $lp_date."
    ".$lp_name." ".$lp_thread; + } + else + { + $SUB_LASTPOST = "-"; + } + return (preg_replace("/\{(.*?)\}/e", '$\1', $FORUM_VIEW_SUB)); +} + +function forumjump() +{ + global $forum; + $jumpList = $forum->forum_get_allowed(); + $text = "

    ".LAN_403.":     ".LAN_02."

    "; + return $text; +} + +?> \ No newline at end of file diff --git a/e107_plugins/forum/forum_viewtopic.php b/e107_plugins/forum/forum_viewtopic.php new file mode 100644 index 000000000..25f399164 --- /dev/null +++ b/e107_plugins/forum/forum_viewtopic.php @@ -0,0 +1,512 @@ +thread_postnum($thread_id); + $pages = ceil(($post_num['post_num']+1)/$pref['forum_postspage']); + $topic_from = ($pages-1) * $pref['forum_postspage']; + if($post_num['parent'] != $thread_id) + { + header("location: ".e_SELF."?{$post_num['parent']}.{$topic_from}#post_{$thread_id}"); + exit; + } + } + else + { + header("Location:".e_PLUGIN."forum/forum.php"); + exit; + } +} + +require_once(e_PLUGIN.'forum/forum_shortcodes.php'); + +if ($action == "track" && USER) +{ + $forum->track($thread_id); + header("location:".e_SELF."?{$thread_id}.{$topic_from}"); + exit; +} + +if ($action == "untrack" && USER) +{ + $forum->untrack($thread_id); + header("location:".e_SELF."?{$thread_id}.{$topic_from}"); + exit; +} + +if ($action == "next") +{ + $next = $forum->thread_getnext($thread_id, $topic_from); + if ($next) + { + header("location:".e_SELF."?{$next}"); + exit; + } + else + { + require_once(HEADERF); + $ns->tablerender('', LAN_405, array('forum_viewtopic', '405')); + require_once(FOOTERF); + exit; + } +} + +if ($action == "prev") { + $prev = $forum->thread_getprev($thread_id, $topic_from); + if ($prev) { + header("location:".e_SELF."?{$prev}"); + exit; + } else { + require_once(HEADERF); + $ns->tablerender('', LAN_404, array('forum_viewtopic', '404')); + require_once(FOOTERF); + exit; + } + +} + +if ($action == "report") { + $thread_info = $forum->thread_get_postinfo($thread_id, TRUE); + + if (isset($_POST['report_thread'])) { + $report_add = $tp -> toDB($_POST['report_add']); + if ($pref['reported_post_email']) { + require_once(e_HANDLER."mail.php"); + $report = LAN_422.SITENAME." : ".(substr(SITEURL, -1) == "/" ? SITEURL : SITEURL."/").$PLUGINS_DIRECTORY."forum/forum_viewtopic.php?".$thread_id.".post\n".LAN_425.USERNAME."\n".$report_add; + $subject = LAN_421." ".SITENAME; + sendemail(SITEADMINEMAIL, $subject, $report); + } + $sql->db_Insert('generic', "0, 'reported_post', ".time().", '".USERID."', '{$thread_info['head']['thread_name']}', ".intval($thread_id).", '{$report_add}'"); + define("e_PAGETITLE", LAN_01." / ".LAN_428); + require_once(HEADERF); + $text = LAN_424."

    ".LAN_429."tablerender(LAN_414, $text, array('forum_viewtopic', 'report')); + } else { + $thread_name = $tp -> toHTML($thread_info['head']['thread_name'], TRUE, 'no_hook, emotes_off'); + define("e_PAGETITLE", LAN_01." / ".LAN_426." ".$thread_name); + require_once(HEADERF); + $text = "
    + + + + + + + + + + + +
    + ".LAN_415.": ".$thread_name." ".LAN_420." + + +
    ".LAN_417."
    ".LAN_418." +
    + +

    + +
    "; + $ns->tablerender(LAN_414, $text, array('forum_viewtopic', 'report2')); + } + require_once(FOOTERF); + exit; +} +$pm_installed = ($pref['pm_title'] ? TRUE : FALSE); + +$replies = $forum->thread_count($thread_id)-1; +if ($topic_from === 'last') { + $pref['forum_postspage'] = ($pref['forum_postspage'] ? $pref['forum_postspage'] : 10); + $pages = ceil(($replies+1)/$pref['forum_postspage']); + $topic_from = ($pages-1) * $pref['forum_postspage']; +} +$gen = new convert; +$thread_info = $forum->thread_get($thread_id, $topic_from-1, $pref['forum_postspage']); + +if(intval($thread_info['head']['thread_forum_id']) == 0) +{ + require_once(HEADERF); + $ns->tablerender(LAN_01, FORLAN_104, array('forum_viewtopic', '104')); + require_once(FOOTERF); + exit; +} +$forum_info = $forum->forum_get($thread_info['head']['thread_forum_id']); + + +if (!check_class($forum_info['forum_class']) || !check_class($forum_info['parent_class'])) { + header("Location:".e_PLUGIN."forum/forum.php"); + exit; +} + +$forum->thread_incview($thread_id); + +define("e_PAGETITLE", LAN_01." / ".$tp->toHTML($forum_info['forum_name'], TRUE, 'no_hook, emotes_off')." / ".$tp->toHTML($thread_info['head']['thread_name'], TRUE, 'no_hook, emotes_off')); +//define("MODERATOR", (preg_match("/".preg_quote(ADMINNAME)."/", $forum_info['forum_moderators']) && getperms('A') ? TRUE : FALSE)); +define("MODERATOR", $forum_info['forum_moderators'] != "" && check_class($forum_info['forum_moderators'])); +$modArray = $forum->forum_getmods($forum_info['forum_moderators']); + +$message = ''; +if (MODERATOR) +{ + if ($_POST) + { + require_once(e_PLUGIN.'forum/forum_mod.php'); + $message = forum_thread_moderate($_POST); + $thread_info = $forum->thread_get($thread_id, $topic_from-1, $pref['forum_postspage']); + } +} + +require_once(HEADERF); +require_once(e_HANDLER."level_handler.php"); +if ($message) +{ + $ns->tablerender("", $message, array('forum_viewtopic', 'msg')); +} + +if (stristr($thread_info['head']['thread_name'], "[".LAN_430."]")) +{ + if(!defined("POLLCLASS")) + { + require(e_PLUGIN."poll/poll_class.php"); + } + $_qry = "SELECT * FROM #polls WHERE `poll_datestamp` = '{$thread_info['head']['thread_id']}'"; + $poll = new poll; + $pollstr = "
    ".$poll->render_poll($_qry, "forum", "query", TRUE)."
    "; +} +//Load forum templates + +if (!$FORUMSTART) { + if (file_exists(THEME."forum_viewtopic_template.php")) + { + require_once(THEME."forum_viewtopic_template.php"); + } + else if (file_exists(THEME."forum_template.php")) + { + require_once(THEME."forum_template.php"); + } + else + { + require_once(e_PLUGIN."forum/templates/forum_viewtopic_template.php"); + } +} + +$forum_info['forum_name'] = $tp -> toHTML($forum_info['forum_name'], TRUE,'no_hook,emotes_off'); + +// get info for main thread ------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +$forum->set_crumb(TRUE); // Set $BREADCRUMB (and BACKLINK) +$THREADNAME = $tp->toHTML($thread_info['head']['thread_name'], TRUE, 'no_hook, emotes_off'); +$NEXTPREV = "<<
    ".LAN_389.""; +$NEXTPREV .= " | "; +$NEXTPREV .= "".LAN_390." >>"; + +if ($pref['forum_track'] && USER) +{ + $TRACK = (strpos(USERREALM, "-".$thread_id."-") !== FALSE ? "".LAN_392."" : "".LAN_391.""); +} + +$MODERATORS = LAN_321.implode(", ", $modArray); + +$THREADSTATUS = (!$thread_info['head']['thread_active'] ? LAN_66 : ""); + +$pref['forum_postspage'] = ($pref['forum_postspage'] ? $pref['forum_postspage'] : 10); +$pages = ceil(($replies+1)/$pref['forum_postspage']); +if ($pages > 1) +{ + $parms = ($replies+1).",{$pref['forum_postspage']},{$topic_from},".e_SELF.'?'.$thread_id.'.[FROM],off'; + $GOTOPAGES = $tp->parseTemplate("{NEXTPREV={$parms}}"); +} + +if ((check_class($forum_info['forum_postclass']) && check_class($forum_info['parent_postclass'])) || MODERATOR) +{ + if ($thread_info['head']['thread_active']) + { + $BUTTONS = "".IMAGE_reply.""; + } + $BUTTONS .= "".IMAGE_newthread.""; +} + +$POLL = $pollstr; + +$FORUMJUMP = forumjump(); + +$forstr = preg_replace("/\{(.*?)\}/e", '$\1', $FORUMSTART); + +unset($forrep); +if (!$FORUMREPLYSTYLE) $FORUMREPLYSTYLE = $FORUMTHREADSTYLE; +$alt = FALSE; +for($i = 0; $i < count($thread_info)-1; $i++) +{ + unset($post_info); + $post_info = $thread_info[$i]; + $loop_uid = intval($post_info['user_id']); + if (!$post_info['thread_user']) + { + // guest + $tmp = explode(chr(1), $post_info['thread_anon']); + $ip = $tmp[1]; + $host = $e107->get_host_name($ip); + $post_info['iphost'] = ""; + $post_info['anon'] = TRUE; + } + else + { + $post_info['anon'] = FALSE; + } + $e_hide_query = "SELECT thread_id FROM #forum_t WHERE (`thread_parent` = {$thread_id} OR `thread_id` = {$thread_id}) AND SUBSTRING_INDEX(thread_user,'.',1) = ".USERID; + $e_hide_hidden = FORLAN_HIDDEN; + $e_hide_allowed = USER; + + if($post_info['thread_parent']) + { + $alt = !$alt; + if(isset($FORUMREPLYSTYLE_ALT) && $alt) + { + $forrep .= $tp->parseTemplate($FORUMREPLYSTYLE_ALT, TRUE, $forum_shortcodes)."\n"; + } + else + { + $forrep .= $tp->parseTemplate($FORUMREPLYSTYLE, TRUE, $forum_shortcodes)."\n"; + } + } + else + { + $forthr = $tp->parseTemplate($FORUMTHREADSTYLE, TRUE, $forum_shortcodes)."\n"; + } +} +unset($loop_uid); + +if (((check_class($forum_info['forum_postclass']) && check_class($forum_info['parent_postclass'])) || MODERATOR) && $thread_info['head']['thread_active'] ) +{ + if (!$forum_quickreply) + { + $QUICKREPLY = "\n

    \n".LAN_393.":

     \n\n\n

    \n
    "; + } + else + { + $QUICKREPLY = $forum_quickreply; + } +} + +$forend = preg_replace("/\{(.*?)\}/e", '$\1', $FORUMEND); +$forumstring = $forstr.$forthr.$forrep.$forend; + + +if ($thread_info['head']['thread_lastpost'] > USERLV && (strpos(USERVIEWED, ".{$thread_info['head']['thread_id']}.") === FALSE)) { + $tst = $forum->thread_markasread($thread_info['head']['thread_id']); +} + +if ($pref['forum_enclose']) { + $ns->tablerender(LAN_01, $forumstring, array('forum_viewtopic', 'main')); +} else { + echo $forumstring; +} + + +// end ------------------------------------------------------------------------------------------------------------------------------------------------------------------- + +echo ""; +require_once(FOOTERF); + +function showmodoptions() +{ + global $thread_id; + global $thread_info; + global $forum_info; + global $post_info; + $forum_id = $forum_info['forum_id']; + if ($post_info['thread_parent'] == FALSE) + { + $type = 'thread'; + $ret = "
    "; + } + else + { + $type = 'reply'; + $ret = ""; + } + + $ret .= " +
    + ".IMAGE_admin_edit." + + "; + if ($type == 'thread') + { + $ret .= "".IMAGE_admin_move2.""; + } + $ret .= " +
    +
    "; + return $ret; +} + +function forumjump() +{ + + global $forum; + $jumpList = $forum->forum_get_allowed(); + $text = "

    ".LAN_65.":     ".LAN_10."

    "; + return $text; +} + +function rpg($user_join, $user_forums) +{ + global $FORUMTHREADSTYLE; + if (strpos($FORUMTHREADSTYLE, '{RPG}') == FALSE) + { + return ''; + } + // rpg mod by Ikari ( kilokan1@yahoo.it | http://artemanga.altervista.org ) + + $lvl_post_mp_cost = 2.5; + $lvl_mp_regen_per_day = 4; + $lvl_avg_ppd = 5; + $lvl_bonus_redux = 5; + $lvl_user_days = max(1, round((time() - $user_join ) / 86400 )); + $lvl_ppd = $user_forums / $lvl_user_days; + if ($user_forums < 1) { + $lvl_level = 0; + } else { + $lvl_level = floor(pow(log10($user_forums ), 3 ) ) + 1; + } + if ($lvl_level < 1) { + $lvl_hp = "0 / 0"; + $lvl_hp_percent = 0; + } else { + $lvl_max_hp = floor((pow($lvl_level, (1/4) ) ) * (pow(10, pow($lvl_level+2, (1/3) ) ) ) / (1.5) ); + + if ($lvl_ppd >= $lvl_avg_ppd) { + $lvl_hp_percent = floor((.5 + (($lvl_ppd - $lvl_avg_ppd) / ($lvl_bonus_redux * 2)) ) * 100); + } else { + $lvl_hp_percent = floor($lvl_ppd / ($lvl_avg_ppd / 50) ); + } + if ($lvl_hp_percent > 100) { + $lvl_max_hp += floor(($lvl_hp_percent - 100) * pi() ); + $lvl_hp_percent = 100; + } else { + $lvl_hp_percent = max(0, $lvl_hp_percent); + } + $lvl_cur_hp = floor($lvl_max_hp * ($lvl_hp_percent / 100) ); + $lvl_cur_hp = max(0, $lvl_cur_hp); + $lvl_cur_hp = min($lvl_max_hp, $lvl_cur_hp); + $lvl_hp = $lvl_cur_hp . '/' . $lvl_max_hp; + } + if ($lvl_level < 1) { + $lvl_mp = '0 / 0'; + $lvl_mp_percent = 0; + } else { + $lvl_max_mp = floor((pow($lvl_level, (1/4) ) ) * (pow(10, pow($lvl_level+2, (1/3) ) ) ) / (pi()) ); + $lvl_mp_cost = $user_forums * $lvl_post_mp_cost; + $lvl_mp_regen = max(1, $lvl_user_days * $lvl_mp_regen_per_day); + $lvl_cur_mp = floor($lvl_max_mp - $lvl_mp_cost + $lvl_mp_regen); + $lvl_cur_mp = max(0, $lvl_cur_mp); + $lvl_cur_mp = min($lvl_max_mp, $lvl_cur_mp); + $lvl_mp = $lvl_cur_mp . '/' . $lvl_max_mp; + $lvl_mp_percent = floor($lvl_cur_mp / $lvl_max_mp * 100 ); + } + if ($lvl_level < 1) { + $lvl_exp = "0 / 0"; + $lvl_exp_percent = 100; + } else { + $lvl_posts_for_next = floor(pow(10, pow($lvl_level, (1/3) ) ) ); + if ($lvl_level == 1) { + $lvl_posts_for_this = max(1, floor(pow (10, (($lvl_level - 1) ) ) ) ); + } else { + $lvl_posts_for_this = max(1, floor(pow (10, pow(($lvl_level - 1), (1/3) ) ) ) ); + } + $lvl_exp = ($user_forums - $lvl_posts_for_this) . "/" . ($lvl_posts_for_next - $lvl_posts_for_this); + $lvl_exp_percent = floor((($user_forums - $lvl_posts_for_this) / max(1, ($lvl_posts_for_next - $lvl_posts_for_this ) ) ) * 100); + } + + $bar_image = THEME."images/bar.jpg"; + if(!is_readable($bar_image)) + { + $bar_image = e_PLUGIN."forum/images/".IMODE."/bar.jpg"; + } + + $rpg_info .= "
    "; + $rpg_info .= "Level = ".$lvl_level."
    "; + $rpg_info .= "HP = ".$lvl_hp."

    "; + $rpg_info .= "EXP = ".$lvl_exp."

    "; + $rpg_info .= "MP = ".$lvl_mp."

    "; + $rpg_info .= "
    "; + return $rpg_info; +} + +?> \ No newline at end of file diff --git a/e107_plugins/forum/images/dark/English_admin.png b/e107_plugins/forum/images/dark/English_admin.png new file mode 100644 index 0000000000000000000000000000000000000000..747b9d038b7ebfabf21295a19c6e07a9d6f81b5e GIT binary patch literal 977 zcmV;?11|iDP)exe3NN{nsbYza*Cm6eUg)>x`mvvdz7m& zJ47inJs~SK9Vanug`F)oL3WO$Yk-uMs=bJxwSJecG(Jc!I70vb{~RSSEH*%Dftq=d zsBMFonXSN!qPT*avVfVeHb6-yF*_|dL2ZSceU+~o$(60bji$XiL{2t9N+>ctFF8XvLQEzwIv*)BF*`*eD>f=LKQlf@hM%^FpSF6C zq@=man6JfzB@)wG(Si=L`@(nG%`I#ilVrElBTD;&z!T!l&!=)M^QLKOpd0! zfR?JNzR{ny%a^dnm9E7;NK%BIw2!F3k*U9fnXIkC)S|l2o3zWBvdKV7RFka3m94{u zoUpIN*QLDDp100HOI4h;%$TsoiJ!B%%iXib+OEUbtijZ!z0;Jd!N%6)#?|D*)Z@L+ z;Htsb4(Ux;00001bW%=J06^y0W&i*H32;bRa{vGf5dZ)S5dnW>Uy%R+04sDwSad^j zWnpw_Z*Cw|X>DZyRCQ$_G9W}{V<0jxFf$-AH99aiIx;gLEif=JFiTh`-T(jrS4l)c zR5;76RJ%^YKoFd`LLkaCbchyE5a}ss_&HvmkS-N9ks=`lN`%Bi)Id)h$M^8v1Gf{hQp1L4m4Sw87JfOX*1&5hGaab={b6xPm9r|oT?Eg7qpRO0z2wRMmR@Z72YQPL zl7UhKf;QSKuz5TPb?B+!aj~R@|yV)K_@$?p*4v-|kVF#mb*Y|*f?V^qy z-vi4jIOYVTlgy{95?0pt>5;NX7=Hn~%fp#14mn3(H5=cp>^Ilo&lrg6% z4OJX~cjB9@BV!HmnZtz0u}-E9MJl{jk&Rh#`$7o6EM%!FlPm>imR0e?iBiv1COlPD ze8<8X|H-JiTEmlZhWN9lL4T<{|Nd$evswNF6Z@gFK;Ca900000NkvXXu0mjf`Ix)g literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/dark/English_main_admin.png b/e107_plugins/forum/images/dark/English_main_admin.png new file mode 100644 index 0000000000000000000000000000000000000000..181454ed2b43d726384ac2af3ad85c173984fd7a GIT binary patch literal 1142 zcmV-+1d02JP)XlMkER_bF*7|zdz7n zK}&<2w1u9wm8-z7zt3!dlYf`39w;*@Gd(gqMmR%FG(SijCNYPgxQU{=nXbdK!qRVp zm4lkFcaEkXDKjQ8Iygd1FF8XxL{5R3u_!V<8znD`q`Qr#y@Q*xGd@S0vc|N<)N+NF zhMlr`k*PaIPdP+QiK4lVr@oM>z@N0pw#U|Wh?WdKxlWgs#jL}g%T$(00G8H zL_t(IjkT0NXcR#dhre%kPfkMo6R?p4LLg0Yc0wdw3OS1uk~Z3ig^gII)i$NrSXo&| z5jzDz!JHrjFXTW)gBnEUeg=8w!xys{-v0% zZLpX(=wf+?4D{K%!b9YeE~zUluy<1Xjm`%Gc-8kb7p8T>%;k-jvpI;%4{Nduf*oI z8_bYvZo5(V*(C9np7+t&7E@V^>D6HXYOZGh)2qWwC9kN(LMXFjGG8;5wMZsgg|Eet zcXdwPVl>M&_W7iK$Qbv1!6uZCf6A<%CXBqVr}f)mj(qLt3qwaYk8{i)1shR(U1t3> zV(b&0RK-*x+X6|N$6ZfFai`2o?Wu~fFZG0-cd7;wZCBa>s=w7dR)x^T$mpr6`c{Wj z4XSMug3>mDkb6RY^}AT;tm&3Se%C_-|E0Fofj8ape|*w^0l5_EBQ!+0MF0Q*07*qo IM6N<$g31O7^#A|> literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/dark/English_moderator.png b/e107_plugins/forum/images/dark/English_moderator.png new file mode 100644 index 0000000000000000000000000000000000000000..4895bb43913a8d7a7af95f312f5c145315de0620 GIT binary patch literal 1147 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 Qod5s;07*qoM6N<$f*b)Al>h($ literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/dark/English_reply.png b/e107_plugins/forum/images/dark/English_reply.png new file mode 100644 index 0000000000000000000000000000000000000000..58f2f534d8355a00b43f134e37e4ba46a92da782 GIT binary patch literal 1832 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 literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/dark/admin_block.png b/e107_plugins/forum/images/dark/admin_block.png new file mode 100644 index 0000000000000000000000000000000000000000..8b35d98094fb822bf3354a1fe1568afb7069418e GIT binary patch literal 897 zcmV-{1AhF8P)6GyKtNZz^`|OqRy>ZTJPmmoaLk0&A2L}!( zFjAUOxAb26|9b!aoB#j4|Np=L|DONmPESrH2?2T z|GQYmfkAJ1LR)n{R&6(4nM$MHOzrnI|DZs?9x6ry0|plwCT>!m;}-hpAOEE;s**86 z*kEAmZEfglYr#@dW*sVbB!Jl>?&uc$Wj&G(6CyxKWU4{X#`C@9q_ zDbyz?=QTCFH#cMiU)ccp#T(>8JaB4Um%$g^%K+)15<=D@BIBs2@XpTf$;t1}&)05l z&>9+Q3Q)`d>%$P>Q96BMSCP3F)WQJYp$#9G#%K88B z|Ns8~|NsC0_5btE_?CILCM#101`RnqU3hV&v8c=5-Rbb~_3`oc-{0!2ro~-Wh!`9` z1qKZR0|XToBq}RUKR;|tOnOdEdpbL49Uemq3>yIf10~X6A^-pY0d!JMQvg8b*k%9# z010qNS#tmY9>D+r9>D>_X;f1H002=*L_t(2k%f$_5r8lN#ge-!z$4LkHfEA;fnWj@ zAkYYYt>7B<67d8kA36|X^9Fk)UK3Oug1ae|qd8$MhV35whVn--NSo;_)QK+$e15J4NOTC$az;9D5b?b@M;9F~9<)<9DwUf?#;*bbOKenpI4?N?zCbh( z1*`{LfPA0>cngdHLjVgj16jaozy$mPW&kVj1$Ym<0{Vakzys)Zb0dj_#A2IJI4=;) z0pEeoz$DNQRQvgnrzg3%a57oe*p_`4y5v`N=0dDq}S8#-JHR|y1Lp#qEEnUAj!jn3JWPcoy*K*ot^&x)4&9< z2k-`FYij8DaVjVnxqqM0>zQ45ses00O&EOjJbx000641Pl)zA}2{iKyX=2f?7?2 zMnP~SC`=6zAp!yg1qKWoB|v0Njka&f>6GyKtNZz^`|OqRy>ZTJPmmoaLk0&A2L}!k zHYaI6ed${6|9b!aoB#j4|Np=L|DONJXlNxP9ark zS#wi*ymG|(tN;3}|Misr?{oj}Qvdfg|DZs?9x6ry0|plwCT>!m#~<5KcTNBH;J4bQ zG?6HIS$_14|MGnQ?PUMwNB`&~|L7L{Wj&G(6CyxKWU4{Xfi|K8JaB4Um%$g^%K+)q0`yilYXFM_5vKrR#V^hEoOHfJ zS088C0{YYe^~?b4!w}$6I(=eSk+~Pt!T{gK0OrpF?^!-?3XTOWwE%U`EYSCyc)>|a zAY8)$;==&oyAak-IeSo0eyJwMw*b*^`3agR0J*<2?-BDMr@>t z#`DVg|M36+{{R2~|B#`iLzNYC*Z^|WD>A__0Zk@3JzaQlrLm~X-rec&@b&TW_TS&? ztfs{{MrJ^Y95KKT0B#)s5fcLg1Qiw}Dl1PvKWt1)dQMJzIy-0`9zzQZ8vzy=21+OZ z78n0#9O3`~00DGTPE!Ct=GbNc000SaNLh0L03N{r03N{s!)a7g0000(Nkl+}Z literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/dark/admin_lock.png b/e107_plugins/forum/images/dark/admin_lock.png new file mode 100644 index 0000000000000000000000000000000000000000..6b44ed40bbad2eb421b1d3479095ed3e8542c6a9 GIT binary patch literal 758 zcmV&JE_Mr{ukPPRM4fLQ7|H>8r%@+U5 z6aUp1)1Nubl{^36Q2*CM|I{=8+a}_D3wj9vbq4_3Yy3;-Sq z0KJ0=|HLEzx+VX&A^*WA)SN!jpick!r2p=h|LB4L>3RR=W9Pd#<+v^X+&ur!M*qk{ z|H(oB*G}1|N}Fjd-?LuWu431)W7(=x+pJXGv{&A>Q`@Ud*`!I@ty$WtRNbphrg1P4 z2?G}o2Ubf_e|wHREFcvO1R4wj77Yb8C?KDku6AsA9~BJ}3Ij<^UWtsRAto~&A}y<~ z#A|MXJ3B|4ny)}XPd`CWzP-&*P+t)d6pf9Yl9Ht+Cou&D2LuELAtEfIp|Y*5yc!xH zDJd_cq_d@^w{LHLZ*PCFu)w>!$Tl`W8X6yKYj&!twXd(bczA;&BP!ifFLeL_00DGT zPE!Ct=GbNc000SaNLh0L03N{r03N{s!)a7g00014Nkln+a literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/dark/admin_move.png b/e107_plugins/forum/images/dark/admin_move.png new file mode 100644 index 0000000000000000000000000000000000000000..c1b760d79e5dfd0bbadc432fe161bd73cec29e36 GIT binary patch literal 885 zcmV-*1B(2KP)6GyKtNZz^`|OqRy>ZTJPmmoaLk0&A2L}!( zFjAUOxAb26<89+=L~3+bbnCF||DONmPESrH2>mC z@n}PBc6N4JKwR{w`Sq0l?{oj}Qvdfg|DZs?9x6ry0|plwCT>!m;}-hpAODOqnYXvM zacyy=U90qr|MGnQ?PUMwNB`&~|L7L{Wj&G(6CyxKWU4{Xwkfq{Wc8B@zY z-_bhgQy^O~88fE@!Px-$#T(>8JaB4Um%$g^%K+)q0`!=Cocj9u(b3UfSYJj8Pf8w9 zrKP1&K2)0lv&;bN!w}$6I(=eSk+~Pt!T{gK0OpW8o$2Z6^78W2)6+S=Mq zJy4ARq{9Ht#`DVg|M36+{{R2=|MSlHmU*@&D^msr z4LLnscyXn%sLS5n>G1IN@$vTG-|DQU#a&j27#uzY1`PuP1Qiw}Dl1PvKWt1)dQMJz zIy-0`9zzQZ8vy|WtEnmA00001bW%=J06^y0W&i*H32;bRa{vGy!2kdr!2!c*R8s%| z09r{zK~yNuz0WNYK>+{&;r(V_LRSf7-ECdtox+Uh1d?IMlAm`0+jiTkj^1objq^{i zOCvbf2KIv+Sn`0G130a#1q^qvs(Qe1HRV4+%ZZ-V&znoCuRrSr*yj`WfFUxk00000 LNkvXXu0mjf9gdt@ literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/dark/admin_stick.png b/e107_plugins/forum/images/dark/admin_stick.png new file mode 100644 index 0000000000000000000000000000000000000000..360292d253429e80e75f82379945e98e7753dc33 GIT binary patch literal 1063 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+3?vf;>QaFeOS+@4BLl<6e(pbstUx|{iKnkC z`(;*MZV5TDtvACN7?>FXd_r6mgR%{itDUl2oQiwAihF{pr$n_(Np6{w+%qS;XHM~y zrPXuR_N?8ybnmgX$Ifj%c5d&vYv-=ryLRvSz30!LzkmP!`}gl096;jx_y7MH{*Qvu z5Exn^kgs;%446HnN`m}?ak`vAM2X=RP!(r^M`SSr12-_YaSJhCx?A@LDA?lZ;uxYa zG4(>CaFYTLTf!Ny#V#i*&i?%`f6J_V$GO^uk9Q1@9V+X(VB{h3)>3cf8MltF#&-=u zl)7$o2A{gC5N#Os)Zq0lsZ=YaqR?g4rDnDY`uk))#x6W3tl68c6}Qi8-JePBs_&Fk zUuJV&P&12}Z!2)}-{Q#^I3M^f&HrLAZN6U2zBEEs-{^vs8qhrqp00i_>zopr0RKN! AfdBvi literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/dark/admin_unlock.png b/e107_plugins/forum/images/dark/admin_unlock.png new file mode 100644 index 0000000000000000000000000000000000000000..9c07df1466b1e0a008d8f0525da158677d88776f GIT binary patch literal 767 zcmWksdq~r99Q(vMjAAFtDP?h(c>R zMa|eEi={naCF`YDIx$^s+9XR+>>*J`&;x_(Cw%U69CvX4T%}%@#^(lc2_bxKdP)w> zqFKyk(LX#=XrO71QJtkGCH6Mcm*8qqHttirX;xw;7C#i2j>L2neneq<8D>^^ZJJl+1dK1na4@_QybZyq z6q7QH$uKOzuoM$v?rTY}%t;tiVlW2oC2$4(YV!S9$(uay`?H=8=K}OCgwqe60C!VD ze+`|~V`v>bv3Mt+sNfx=NGY3)9AKiGizi$-D7@sm8{+$~Bw=(ryau>67>WPcCNA_N zoB3qQ#Ds%^I}EfEv{UZ7*#4Tem?*)B5yP7?mipkRP)0~FA-8t1@R*PL0^H%jG0$DU zdcd55sq+}Gz=s2vEEuQ@iw+_Y3rSa{FJ8#uSc>*V=u&u^ly91K_+!DhI!v9#=i~Ua z=iAHVubnILUImvHJsLPQ@aA}LWL(T!>bknI*Sx`LPIK0#^_bK98aMPcrgxjvo?C^l zty^79>rJ~O_!Ki(#P%0(!~!Z%$O#g0MBF)X;j)$+jw59!LjAcs4pX*R@%Wj$q_mvP z;mGAtS=o7Ut5g)_!(=kEvp2a0Ml&<@At9mF)y-Dx!(^3KB=Qpogz@ofo<8Zf+3aGm zI5INs`t^Hud-vtb7L&>H{JE#Sy(>C;xkM6bG?vuXS{oW#ii^vnQkmjR{!V%gjKeuP z15thS?xBUx!Sroqgh)GP!RRW=ot@S`ZHhWKeBkzl818Akh;8iTJjz#OWEWJ0Yl8$PLa>r30yNxLFr8WM6LnlL&bS=@Q>QY)Y1*iT4fg@C} literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/dark/admin_unstick.png b/e107_plugins/forum/images/dark/admin_unstick.png new file mode 100644 index 0000000000000000000000000000000000000000..a7d9a41df75b65ef9b193e5e3b282b105af42d4c GIT binary patch literal 903 zcmWlXe^3(y9L2x;J=n%J#*dCOl%Zox7vtAm<#mAvGE4?CPReSB7XgVKobD{pMl^l| zF}x%Z0}c?yOU&d_g2O|8CHP0IA9WK(>W*Oh9q-W%-v#I!`Bp3?%)VUD-+jHzkKya%iogz=hRXCwb4V%BHu z&r0@A92PTNCelaCOAlx)InkEGF{T62*>T~DKtDe|=MDANbNO-BmR-)_7d=*~XHx1K z*>b;qXY-LbT~wIVha={(4X;KFR%+I7NHI(pCrlBh2@`}7+US+st&PfkUFGk~Jyd<- z{>&8xdI(*#(JX4ojfx2Nd!NIdDGb4RCK?EBgv+#XjdAGY1#PS63N%vfF^2i?@Z{`zTU=9m(DpzPo59HBv+ow{!eS>} z<8aMlbpih^Va*QLBRrdcqw97};yz^nm&Ft_nMc`-dqrCJ;s~$;VC~txTa5-oe2CZ! z1CfE~@+%ROZIzBW>#B2M#ksI(o0{nPsv$oiWrvhaw1X&1!a4Dpyz=ecRqyOJY9rHB zvTag6o5^5JJ>MjfVa(L&DdF$gJa6$S*1mO|D0FyJjL{FWHt{Y>O-jsCTHnjf$>|&7 zv+P1)olux!JGIwQlu$mGqsXw8DYkt$+Q(ImlRmy$Dq3zAOt%aE3hOD;6vxDjg$u}C zSDxT$V5JU8=Y-)#wMw!Q{CIUwMsRIML7!lm9qf)s)9r)reCK`O99vtzCMT;P3jlJe zt3m?P*^JXU53}F)_VzQ$+!3e?0Q8@j`lo3kizmmb>%x;?X3xl-nN=|HY7sz2+1lF1 zunVphH)MnbMHOVlGUDQYN5y*FNSJ9|raGiio~g;E#b8^uZR4PgdD~7o3}T*(z{QZp zg%%cE4IIf!6@kiy1oISe4$iX@ajJ1t0iq*E*9Z=}Do{3pSP$n)K;$4nlB)ofIf8#pp^t42F|MJIl_#Z|0rh{n0PkJ4;I*yqi;byyMpX@xk)S zw$V^T8B)h){hZ(<;+tij=()McrEsP%Cy`V2diUtZJBK|FuQzSF-I=^_ZROqP_S<{o z#-+1xpZht|I^oH!g-IA%-)a;cX#e_pTUU4Qv?b=S zQ``15cXY?>``x?x&UoT|(T4Fr&!f=#jO3QVuH1+|f0~4Uyr# zLtW8GGG|TzAq^ZtCcU)exR%Q8R2D=@qtGrc4xV@Cs011p&*BC!`LwHr3QBtgV0S=BsT*FICx zI84klE43XVw-PUoJq9W<4`C22r79Mw4kND?Ew&v-$uLgNG$gPW7Oe~>o+=MIJr89V z8=o8tqy`$Q5iq+SHNGG@!6SfxfNgDUC9xO{rUn02&?u z1_A?07!h$1Qms*$*_yuPzR>N^+wt3}t*xM@rrh$}!so(XxLXu!8wD{m03!+rT@Yuu zV5{P+&g{3j21^Z03Ra& zE&u>h04Z%Qb)kK+$G6AU&dAozwa2`Co{KPAO8_V*02UVj2>}2h2LLP)1TZ8LI5QJE zGzBgx03RO!6&3&n1_ZEEhyVZp0d!JMQvg8b*k%9#010qNS#tmY9>D+r9>D>_X;f1H z009|EL_t(2&wY`514;*wa&fadQ0zfFuCCOh0Eiv2X#-C0lx2!l(nt zm~eOofXN9EImX%;-zx=?Y=yugX#nBY^qppyfNU*+`l5F_^)zXkWL`-1BK_sH z8LGN;`t1Yu^w{lr_^m-V{(^C?U4{-p%?*hwya?$6fcN%F)lp|t1fGPXZeG>5osmPmq5#C^+LGra;00000NkvXXu0mjfbH~n5 literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/dark/announce_small.png b/e107_plugins/forum/images/dark/announce_small.png new file mode 100644 index 0000000000000000000000000000000000000000..ee73a46f1eb9da0510e5b1d1c8b39ea8c6d82d17 GIT binary patch literal 902 zcmV;119|+3P)00NFsOjJbx000020sssS1|lUMML{!KP%~Rm zAV)(7Bqsn35C8=R0UIGXXHfA*#Q&$c`r^FKKptx&ec?}o>P~~}PmA(bpZajI{)=^Wbz@^=vj2>r`*V%+S%d0Kf8|ai zS3eO{9&ph~dE`Nb=Tx=%lF$FQ*8js$R8&DmM%Vwt&;Pi%`Id<2Sb5|>b=6B3L^%R6 z5=*8veC0y8_n6uL#ohnRh|3K|Nrjx;CG&V1Sci{1qT2L z002AyHh(dcx0cl6*z5D{?ep%}k z0v;Uz3k(1O0pU(r?f?J)0d!JMQvg8b*k%9#010qNS#tmY9>D+r9>D>_X;f1H003@D zL_t(26$Qbu4FLcE0KvaPfmTc)v4D zSiaL0s)CgZyvG7I&VYcEBLKhw0ALS*&k#ER-vQVH0IUIC6JP-VFarQ+3IHBz1b}BM c0H0s|0r~zBpqCCf^8f$<07*qoM6N<$f`CV%H2?qr literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/dark/bar.jpg b/e107_plugins/forum/images/dark/bar.jpg new file mode 100644 index 0000000000000000000000000000000000000000..09b4da58fbb5e2cab65081711c986454117f90b5 GIT binary patch literal 644 zcmex=ct*k%^fF=o}7CE^Yw^CPrpv zCKhH^peunYYk_hMEP|{;iiVDC!hwnGN`)dujT0AgC_8ODC>nI}gNkudQ4=SZn7D+b zl&YG#hNhN@shPQjrIoXbtDC!rr&n-DXjpheWK?oWYFc_mW>#@YX<2ziWmR)aYg>Cq zXV;|3Q>IRvK4a#rMT?g#UABD1%2k^-Z`rzS`;MKv4jn#n^w{weCr@3veC6u3>o;!R zdidz^lc&#~zj*oTWKS#c?s+z;ylzumXF{b zg8S$HEe0NDMqsjG7G$tz__F?o=U4upKkLu+!x%g4xBR~NZGP1+{gmBu;l}p=Zvp^E C=hDvr literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/dark/closed.png b/e107_plugins/forum/images/dark/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..b750d3d2641a83c56558e125ee08c4649b7a9986 GIT binary patch literal 1146 zcmW+!4KUOR6o0$xqg|_$BGrYtD|RTNYX_&;Fg~JuUR=#}om_3hfU^=7AJI{~H;&QeCBI;Cpy^tH(^ed=^{d`Me>ox2=vMV2gH zlwhh9(`A_5g7$JBWp2IjJ7Thfo5*Wxfd?P6XkeD zgfTUEz5&xDm?_1RH__bsCQzt!%haH}#b7>uQ;M}2c8^7tk43DytUVDzJbnX1O3?r6 zdob8zbGH9T0fq`tUTRMC=n~y@Le5ZBn)~yS<=jBso8Wjw<(7rM`54SYIiE#HObLnJ zNCvc=g5k?R)B$lH6oRc`#psrYZ0-x@p^9B;tNX5^XEw@tHiUGaG83EuH9J$#IfL|cBsv3$Hm3?MtOMW&1HlJHu8CthewKpUepq8}jNRZ}&y3ON z$CDww2}J_Y^L2kE>x3gHc)CR876s4hKqh_?rDm`N%A-i4R4YvPlCkql{CpQ@$9nw)~_ z{NkqSKK#8CA$$#vX$;&as1z$;+A}$Q;IZP8_CfR*?KAs&n!x zZr<*0eTsLLDD1(#Nvq(s%G~jQ%KAx%Gn*>b)b(RqzbZYWC^M_1uBrD|p18QUs&{x! zIf)77NMpaDY6Sq(itf@?@Ce&RQ1Ki`Ut`aoV}(Vxc!lL8 z^?RtbNeDoPZ9$Ibo{rDr3l*xCaCsF!tf6WVr{-~7g^z~N#T|5ZO5TNKq!1srRpX-5H=!8&_joMIYf znC;-3eqO}TPX#y%U@4z+;*-Bmi4Qy+1gBM-PXg2AY1Di2DdV8LIU%)OOw7Sn<&@0T!C7h~CWo4a3`yBGMOpF~P z3=1_WrXe3oC^jwyYm&?$v?eft8Zt4)6|TN+cRS-NZT{O6AaP*QsAXK|g5XGU?ij#A z5@ArY44>}r4w7iOj;Wq>KT452|1QcXb1M5z{kZP=^j^Q{#+jssE42MGWz^=qFD~?T zy`QT$rNE`G^hAs=b;6Oo(SptdExzhzJ?U$BTogwxXilx%1F4$)m5xB`c~5bgmN* z@zf)%?!$`%n16MC(b6LT1Q}Mc_sU$J35(lNaUWHW@q8~T%vjWpd2P6--o+s$z+bcJ zNofVu>EML_N`oa$7K4kLz>o06v_AnxtCS_Dh(36>Yb|sUGsn zJ>tCqzH|{(H(@skvKw)`7R41VZ%$(H-X2i}Cf8!R7Hx(#)RUNx*L`R|-l>7ofxUr~ zREwfY^p7YH%y}7j5@S_pGfAmunS<9tX+Nzhpqgo!KwN{Ovlv*0{FMzniG_I(xyNv& z5__)g8hapjbZvW~U*%|xa~RfIwQHlxkwpta&#g;|~t=6|&XAZX^Gta}?`G@6`47_!)aXhWkbAJ@A<5+jOtx<2Dn0DU0)2lZ=>>Ee3 z9g~#^(XW8;f@KxQTbzTFI68%6AAU48wOy!dxna0#pO_i_j4!6Juzn60X}}H+%joEO zJ^%AB&d#CJjcyOlI&o$mZ}90~VM)C{kJOR1E ze|cHL7Ncypc~jzbUO*8*jCi%Ni;f9Vnwc(x#IJ7;(8TwMG^Ye0tZxBC|G}(<)E!Mt z5oZbO^YRlJ8u>BC@(_iX)evtLhfC#xO1I8e`qWd9Pwh)#f76i1gRcsAmFfOhSeXaJ2RnCftN;K2 literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/dark/delete.png b/e107_plugins/forum/images/dark/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..b1cfb5adb313fd2f872d13873a7647d211a8eeb6 GIT binary patch literal 861 zcmWkr4{X$A6#tfO*>O6YGsF{>-6g|N7~7q2j+=_RayQp9j!T)sx*&rKxLFu;J#)m% z@FGQLtdPYHlyxClXh_%!fuv?k8!=!9gq6UgDA~#%VIPahz9r`Dg2MUn%lnhxdoRDd zy!TZ+_HMCzp&I~DOw~sioEKs*b>-vOIl8(Br-Bc|>%st>KKRUkTMIESN>b~hMdJmf zZr~mn>UkT0ykNYcF`5H8Nl`gLWcW10@eG$1WkuC=-7s`rS2ayhRYk$3n5G3Gv~An6 zEW1yKF9_j&pL*dvn|Im9m{ZZ1tkIo z-U=beF^-`lk%t@>NjRE<7>^!sA>3jDFhL_JorAVx8c1MKnsHPa@(ko?$P$)qtGbTT z2_%bJ$Oo~Uz&pBXF@&ZYx?xJPj1&<`0?Du>n{X6q@|$me#W&4MGO-PycIx*Xn9S>_ zZ{h)P&p!1$a%kmuxLA>lZc47{+`cv0w!7Wi*tTmssOxO=23C2)9i86S{r(l+fWIaf zstHzmm-{iw4@bVh!aJx)xN*sX!e4&oUikQx(YrU_+3#oY)s1n!mJt z=H$JHWmESnhr7GGhwI|?eUH8_@4vO7jlblW6O*Gb0EWAGReWiYa<>SyfVa3R^Xd<8 z6patoOiix^{$rDW4z#YQ$oc1b=N_l7X74@f`SDV+BXzx4jb49nad*L@uCq5nb2Iy? zYfZ<4FIVn8-rw{a*MFhmxxP~a%FfjAo$UD!rpNZQ>*M9Q3|*^kN@%`20WX!Oqfs@0VuEsU!K@ zwvDvbR)*qh>d(S+`>(v}I;1UL3MT$o(ovmyQOdrT4>CW^&-V6h{9ZWL05a*>%gd^( gmQkw!$V^N=ey8Bcz!o!R-o~E-R5TVjNw$3cKX5RawEzGB literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/dark/e.png b/e107_plugins/forum/images/dark/e.png new file mode 100644 index 0000000000000000000000000000000000000000..d8a246a676c86b689bda849b93b0c58a8e6d6f97 GIT binary patch literal 1577 zcmV+^2G;qBP)*NnM~0;U00R0@OjJbx000005&!@!002S&08jt`3ke8; zDlw}_Rlr+r&1HSnMNz#eET;kid;kDF6cm_KXUlq`?25wwjLH9ty#7pG#tsma000?B zSHpU&^?bSidA0w8y#9y4|97SEJxRO(0CWuwmSBO~b+i9!u>Wwb|B%Q3S8~({28{p! zGh&M4W2FCUs{UMh+XDoR1rCi^fZki3{$r~DPHfcx5pzCd$zG!WRGI%&b(%9nRa1GT zGC{on4Ko%%uuPKvXPVeKNLf=;Q)6ReH#j;mNM&iD=24daT9ESqB6~u5+enZ9L0^VJ zL`iCDYIJmTB`r8YX`VMv#{df?3{JE}jQ&r7$1gieTU%R8OG|@;gF8DrBsp1Ajo?av z>;NKEB5lq+iT^fOiZnJkHa0eki;FvIuo)tz05X6qcib$1|1^dFOioioL_{1M94aa+ zo12>*HCZl+|0X}a06CW{c;y{>|0#d}I)?uW3JNVRFdc#aDN)V@JD?Hp#F|LgMqqNuQDX>Q->^)F=l z1025q0ZRZdt2}b+@%I1p`u{6W*#H0Y$oT zp6=7?|4oD5$kz9}&iFk}zyK6305gseO1^E5-M`H8U~kF^5Sjo0V*nID02_S-CZsS( zxPpw;m7d*NWW)dfU4E6Fga7~l0d!JMQvg8b*k%9#010qNS#tmY9>D+r9>D>_X;f1H z00N~+L_t(I%Z1ZDY#Rj_#_{KWcJ6#1c1^IIMmS29R(vEvFfbHUAt6eYg(d7=5YUYQ z2{B}%L+QqVSlB^gVn8tPp=>P(!GJ<2C~XQ&MD3<^eCKoS{P8llR4D}Yot{_vjn9J~ za2&|n@!Zm`9^QP&zj+u)f!sspgpXY+kN*vB19^Xv^9HbR^FDC)Vu3x$odBuI+Umvu zumgV~0=bfMrKY2&zkF%q9=HnV&oT<+Dwm~-=j6a6cfra9t~9r+5%|KSzFE?-dj0A6 zF8Bd%G`xfexG;T=p(Pe&trPILg!C;y2aW(ApQ?UXdu?QUwbtIF@Z3O1%dZ1*1^E7_ zbBI4ad56q=;%@WINND9{7)}9vUOy=$b-tK;e&EtAhP)#50c1m6`}F+U3z)OM@Ux!0 z+Oik9qv@>ls-fjG471$p&R%j(UVip#>9oF@zul;3uBXzQV{{QRIwT8g$JQHaOIl=h zr|4SMb}ru(H#h^}3PovpPhp&`&Cx=~Lg;YxK940(rZ?gq7@g zHwrmFL~j9XrpZ)j$s+x_h}%xDd?z?=Mcx~sH-J`}l$y7c)N4S?oW`|%v5=M-6^Cu* zVxBYpf!fccAqeOxG?Nu!dvO1<3K1~*7!}#?{%3kq;{t%p0s4c(#;Xai!r*__ bedzrS7FH23pl4W=00000NkvXXu0mjfkwD%l literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/dark/edit.png b/e107_plugins/forum/images/dark/edit.png new file mode 100644 index 0000000000000000000000000000000000000000..d04b8765247bceef9188319b05fe9c413e93a4de GIT binary patch literal 621 zcmeAS@N?(olHy`uVBq!ia0vp^vOp}v!3-oPNUOd8QaUBB5hcz=sfi_-`FRQFH_d={a`n+_7^&aP9f?=lAa2 zyLRo`+O=!v%$d{D(z0~v(!G240_FaL0K=3iQ|>*#_y3$>b#?VIp!)ak|DQYe{{8#p zWJ5(o#kG6)K7amx>)vDMk{PZkDxPCtn8Uy@E8K?(=q$#PAirP+hi5m^fNTj*7srr_ zTfGoU;^C*y3w58`rmZMUep{aXtn%3LFAUSyOKo|_ z=i77q-kPniZkir@7}{So|Ef8k&pNB!MF#{wUbr%eapt|SpD+^$mKwc2Zr$^{G0%_jQW zmflD_l{<0y{Gd}R%l;WSNiLqP@vETo4xeSZNPnw+?nyPvv}`L&V1O}ry85}Sb4q9e E0C!;+H2?qr literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/dark/email.png b/e107_plugins/forum/images/dark/email.png new file mode 100644 index 0000000000000000000000000000000000000000..a889eadbb283a6908d7f9e75f7da1fd740bb0c9e GIT binary patch literal 524 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g&!3-qd<*(TYq*&4&eH|GXHuiJ>Nn{1`*-Jcq zUD>ZPO9=4sT(^AS2^8uI@Ck7R(m}=5LD|J#$;Cm**I`VM%yIEHA5vK~CE=j_P9cHwicXV!|{ z4jxD1-|YE+c*2=BJ(Uas1*ynA1_8P6VOhp_u!KTTa5 z%OJM=c9p=x6Lukd%=dR7aj7r#yn(F?EG{c^!{H&a{D!!6G* zUGzR|F+1e3)UER6CJ&rhGmh&pPGPl3-5JAVvHIuHi}wX*GT51W&aP%;Xx}_3zopr0Gy}XH)pDTsWZbI?F7Z5@O0DEg2$v=ZGLN@IJ%d*U047HoW7&uN&t}<6`Dfzfs-uqks=;%;l*%G`0hJYnN6X1egubG~nW&Ht$ zVeE(PoJ0<2V333Z+`til16~^My?m*AU|`DU`$4NEcM1|U71&NX0Y)GRr~?)N29$(i zCdPN9CSC`ofD9lj3+2@i3V}Vq-@rU@2TAKPM@WTG$TQ**B=C8$h>r!Ii@wWPT!h5} z@PRadLWU&c8cl~nA>&CS&I3KbdK78V-3^KYmIGe{R-~>cI3b>@5b@9jFVYlU7dm@7xjEd|(O&}j zXm4+4S@xFqR!T(*ZbP_H$Y0LKIN~&MS9`9`&CT`w(YN=Tz4Y*PSHCO0Je^y{b#^#| z!Qd5|RAeGDwT8rqvgwNT$n`&{BIXTq;dUz^c=DQ2d0pA3$#Shtxy_busjRTonD&cG zYicX8$xU}CY^f+qOtAU9ESB5_RSJ3O8ok>4b5V>Io2IN) z{%<{w>SncLXYaeoU#(4+zZq5ulUv7D8x~~t42McF^oz_cn(R9B>9v99hC1fO%qNSK zp|Zx**1vU_eOh1kOq*8L$f_Th-6_95il1q|U;5vp&jjHkWB<-_wuX(am+p=qqa@3M z`QL}@CkGC_b1)n|e$!(5vi_gi9r_F9^2kHCEcfl(#og%XHHV2{$k0g zvj^5}t9=ID<@uz$#-|^ib8hLh54U_CJyX3b`fkhg`;ZtKMQV>Jws5Ai^1>PEPx$Vm gmh7=?&j*3F2wr?qP?%|PM3dG~DT@`Zyq%8!0gP8yI{*Lx literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/dark/main_admin.png b/e107_plugins/forum/images/dark/main_admin.png new file mode 100644 index 0000000000000000000000000000000000000000..181454ed2b43d726384ac2af3ad85c173984fd7a GIT binary patch literal 1142 zcmV-+1d02JP)XlMkER_bF*7|zdz7n zK}&<2w1u9wm8-z7zt3!dlYf`39w;*@Gd(gqMmR%FG(SijCNYPgxQU{=nXbdK!qRVp zm4lkFcaEkXDKjQ8Iygd1FF8XxL{5R3u_!V<8znD`q`Qr#y@Q*xGd@S0vc|N<)N+NF zhMlr`k*PaIPdP+QiK4lVr@oM>z@N0pw#U|Wh?WdKxlWgs#jL}g%T$(00G8H zL_t(IjkT0NXcR#dhre%kPfkMo6R?p4LLg0Yc0wdw3OS1uk~Z3ig^gII)i$NrSXo&| z5jzDz!JHrjFXTW)gBnEUeg=8w!xys{-v0% zZLpX(=wf+?4D{K%!b9YeE~zUluy<1Xjm`%Gc-8kb7p8T>%;k-jvpI;%4{Nduf*oI z8_bYvZo5(V*(C9np7+t&7E@V^>D6HXYOZGh)2qWwC9kN(LMXFjGG8;5wMZsgg|Eet zcXdwPVl>M&_W7iK$Qbv1!6uZCf6A<%CXBqVr}f)mj(qLt3qwaYk8{i)1shR(U1t3> zV(b&0RK-*x+X6|N$6ZfFai`2o?Wu~fFZG0-cd7;wZCBa>s=w7dR)x^T$mpr6`c{Wj z4XSMug3>mDkb6RY^}AT;tm&3Se%C_-|E0Fofj8ape|*w^0l5_EBQ!+0MF0Q*07*qo IM6N<$g31O7^#A|> literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/dark/moderator.png b/e107_plugins/forum/images/dark/moderator.png new file mode 100644 index 0000000000000000000000000000000000000000..4895bb43913a8d7a7af95f312f5c145315de0620 GIT binary patch literal 1147 zcmV->1cdvEP)XkeJw_)nI*p>Xskz8wcZzk4 zqkfmKYJr*@B{2X0|135@E;vFUDl{-UL^M7~eU+_nh@g+9x~sd(W_pZykfnl~vTcQ& zEjU3oKuLg^uyTr_Cowx4BrlVwysf^?X?>4;lc|NCws41_9w#y{I71{ZI59d!b&REY zlByysHW?!=H$h94tH7_n&uoB`f0wO^qPiX^Gcr6z940X#Dm5i9IW#{=I73aDuEVmz z(r<&6gPO37roDWWt0piyI6_P>IYS#IFEc(zHb6=!GCev(PK%_woU+EW#nf_zmxi6P zkg33lqPaUpPdP+Qj;Fq#w8*x{)^&)QilMfYt;9V?Q6VcflB>cfGCZQV%(=YlldQu)N>rJ$$*8{4zRul!kfM{S zzn-_wK}%Jfwalx*)xXf+hMTUOw92Tz)TX`Cv&Y)R)8d$~#H+&Bw8`AN&fmt?V>I zRB3Hx0918lATl6CWn&;RFfcP9F*Q0cI65#gAT2O3Ffd*LaGC%B0n|xEK~y-)tx~~i z6hRQJ9dnQnF(4?&3VIPVdJHk-SNyV|#vHvUqBoO62udKwjR(D{c-hTNwrhHOx~EOX z>gwv*2`(FiecRPM@5Wr57<^gg2;qGoLS}S~+hT8VFBADMj2beg~ z(UG@5pOTYAvN)s-wLd-vgxk8B1+)J^n^sYWHXX;x9lZxgB3af;sEW7_u)Yohsy)O3 zB0NLtg(fYv+MBK2vLoMQ8`Wha9I_RNnd=)E9EL z-pHs}IMiCHcGC?Sc`StwJ3Nluzt+EZhk9c)Ck@Afjutq!$KS=E6lg^07n<1#PsahdNO0PD6Hy{&^dU<&%c*dC94HS9oDwNS^aS(4> z2=eJCoLuGOz-82WVn!qK@b{?Gwc%YDjTYzdrbbXzS_;uPS7|&8Ttpzx)`~4j2^k3- z$0hkoibaNLEa%2gWA%GWPd|g{`#t3zj_Yqr{Ihok>+NBGxz9c}dtP#CZtcN=6C7vT zxV5a>7vo|Y!jcL^SrH{!l$3z10EjT5P8IShEC9$UN<1&{yf-VWz%We9vIKw>NP;R< z6o3%HSVxFLNFc zf)KNz3WBH-iVYJPrWBNPCLghaK}jK$L?W^*Pfo@NrA%IfC>D!Jl4P2uOo+-{S{Bp| zplOjv1OP1%2q=`wlu8IG>}CK6Wk$@tq-!_Xb8TU-$g$exayxjw(B&%3cRNh7Q_q5-xZaW6l=Rlzfx(Mc z9=$8?NlUz4{xN@evatBUas9b_!J@45%W9pYcU>EEHXkL7N^>?IkE0% zzisg32|Bo@>*&4x^>qag_tgAteLFFH>dnEaU1wp=Etx5$E1So*U47Bex&6gZ{AgLb*;_mF$H)?^+3qMB ithqVWK7kt>esAhZ@J0=j@#6cAVemVhDP z5WoRPfH3d^cn*9I$Z0o#9hd;30EIpYNPq%h5*PsX0x5tO7^I&t%!pV##&HuIH_mY* z63Ooj;{%c?E+P2<5Bvu7CM1lj)nUCpvSo{)*H3D-{W4i6u$wZaMY44^ zXY=!CckYbt*fFfrg%~CTR0FC_o0LlBDIf?u*6Ctq^W6UZPc4?=++3cJ79cAlV`ECn zCE!6)Qq1A_$K{GwRXt2gy8>)87*djxn`y(lb}cqGzNoKXY-sqiyxdEOF*8#xm%9lG zJDo4R-j^QFd~NL+sZ^7i%CfAD5aIao*FN9t*4Bj!7aUTl5qMNtx!m6VHW*yy`KhL+ zOopKYtk>(`ghKyycV9M{vMCprYi)FNZES4h;>C29En?aJ#>RJous$=hK0O`2d9y$! zD`eTA!?83t_25nsH-^+ySPsCn z7(GfIY4yHCZXmtyvyy@DYzOG$SZQ&gEn6k-du(hb=>2Oo^Yp<>*S?CGSD4D)BcZe( z%Ul^*S)TPgtvtOi(fak(<{HC5&&a>6xZSnx4kdE+{$m}{IURSSeL4_$Rqf5|@*4;8 z96oPL+bx;tWLZoF+fOGP1U}`jJWOlRZ&a{8@!1LNf7o$1aLx#8Siwv+bx~TxKRSL-U$R+|`eBChS##!1XW&C!;5l8< zNHS+m03i$oIXe$!7#p7)4vZIk(p(pZB`T&R8;dG! z%TdPpfy(}RUBE;Yiy|7S5e=pW7n~dqK|Bs$9T=AyB%CW^&_qAFHAk{VBakviv^ul$ zZqWa7Q@cM7jTjH43j>`26O$YbP#hqRBO8?@2%88tu`*`EW`N9qi_eXY(2!NDU()|+ zNw_!#j0^ym02_)S0zDQScq0ad1_6lzKe0cN)RCdsp{v}hu-~wU$ct{&LcaWEMz=H` zaxD~NA_#Z|Ba+DF5OEB8xOLX>)c*ec-SgUn zuZ$K)IRGCcDQzxwp?$H(x5w7bwa2`Co{KPAO8_V*02LMhAqM~~5d<(K5;!vxIy40? zDF7cI00suH9G3_H0004WQchCghb4pDcmf6TO1tCFIL>&boBx zOwX9k06$;c=V>KKDs>o zS$KY?Ex^HO+2P?Dyq;(SfW1}V?O3e?91TYUzWth{x&{dNG%Z!jK<6XuPb*c8E_~Rn>pA|400OU2OjJbx000>)GcaRX7&Jo~L_Q~2MJHKB z97aC}B`N?85dZ=L0}Bi)UQb%YKRSI+U8-J;_F;|pVSwdeU$j>+XGsMfC;$cr00#vW zIY334N|NbVbka;Qc}sK6Ta*7^g7#B&@kwanM@X1V4K6bP2M7QJ0R$);C~!o2&s(eL ze52@Xbk0#Pd`NTCSbOVJYT!p%*f~>&Vyd*Xi}?^ZN7Z_UhU2+R5$6Y{F{0T00{yCMFUcy zOULZQ_y6_(|Nr^__08|eT##x5I3Nsu3J;wP00{s9Jpe6xDu}a-(cshS@$BpI?9}1c zkgc0CT}=QP8vq3c00RI3761S%3KT#sDosZ$Pe~R#H31zR01FHN0Rpy_<|6+<42%p6 z=NS<|4JdFJ%mONeifw_?Fh0vibb$|ys9=Bu7#YM-xOae_;6~!VVnFg05PV}`0046! V53}mQ6;A*F002ovPDHLkV1nTbRxkhn literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/dark/new_small.png b/e107_plugins/forum/images/dark/new_small.png new file mode 100644 index 0000000000000000000000000000000000000000..398910494c1a6f3df68edae42822d9addf931d47 GIT binary patch literal 867 zcmWksYfMvj6#uooy=`x~_qI&5z_^rFY(G$hWb)YLB^27GC5%=ZH6gleEW{DF43asw zSx^?{!iZ!eF`B6#{332f1tL=;FG+)j#Sfz61Db5|=yWV|qrA`loSa8a@=MO|ob&sp zrn*WLQUm~^*Hcl;s%bOy8kU_dImin4VOgLIxZY`8JFI2BuE`s4>mF+?#*D&~FKW60 zwZFz6a&JO`H-QSCKVq?bsVHA5%10JUl}@Js3BYcxw%uln78NaoLaPT4{v8ZHEG_M@ z+e>&}1Of&_Usl%2u3c1AM1DWj)lncoB_(Tld3Un1f<~hZu<<1v*Kf0tqR@^Vl%G!? z5AEGc;V}7pR9Hw32c@Omwb{yeo(HTzXHwF#$wZPw85xw5LvA-!R#I^><>r#zPA1cu zEO%_(nhw0H)s818lS)Mf16eGTnMv8%#Q5yoNhv8L2oIB!k4e((mM!bRI)fRFv~3%u zrxW92wNgUDhFZM=yi81Nl;t)_iizUCz!E^rd7gB-SAuX{mRlt0cTs!^`~@s(G;3^^ zV30x~DlcERS{FHP0hkel&qc9O5GGBg86YM}D-6@tM(57arAu`FJhiv4hQoiF%`br8 zM6tnWtWv9Q7z}^t^>KE(vuCNNhXw{{Xo!Y~>GtiV`uaY-zLMiofm6V&%SByXboDBY zj?&~LO;6LaXY}L=jg8T@Yt-HSDlhK@kOnX%u9Ojne!)y?#xx7)?#l_&8m; z(pONh8wdjfK3{xfgyL~xw!FL)joz%Stp%tAi+=d0NjJ!^fWep90FzW~fFQLYw03 z@K%(CoJrcD>kWGjgCATF%qO&GdRwfwBB=$D1KI9L zyVsDb9gV|}PtuMxPmEn$QRi^*%(o)nt5S7()XyJpKia#l96$MpXNLp4?&^x4_Z({d EACf;!qW}N^ literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/dark/newthread.png b/e107_plugins/forum/images/dark/newthread.png new file mode 100644 index 0000000000000000000000000000000000000000..e0fd470506ffa927daa427d963ed22dc7364676a GIT binary patch literal 1670 zcmV;126_33P)f|y@)he=OVV04IRev)H!gMO8&c8#J>U22(`nas@0Oj1{3 zc#Cv}mV=qDd6B7ikf%&cOy%b0Z-bR|ilB9goQ9mSLQq|@va(B4Tz8PDdWxEfpR_DC zKqxXiOki_meUvXcL_beoUw4gRd60dMor$2ff0(aRWpz$eSu#6A9w;&*EH*DUKRriK zhm4UtMou6qG(l2gBrZ5YOjd=8kR~xaTXKkqj+9wnW*a3iLQ7LPLQHUmn~kKofts<9 zm74$m|BaHE)796txxAsJsTw3MP+x9mZ+421mBz`;!NkUciH?1PiF=NqNLFO;@bQ+M zprxs;s;;u(;^bFeWjjk;$jZ&p)73ORMY_Jh8Y3=&lA@BRzK5W=P*z)#n4QGN$?);= zUS@5vwYik5!HJ@}TWowjNK#s2X?u{P6&W3cm8F!e#F(9;ouQ^xXnR#!V7R-#pQNZ_ zX>o>_r<}6KkEp(Xe}9#mpfx{9*4Wy;z{9SxwQhEOh?%K@m#b1(T|`e=owm(lbAnA; zWy;OajGe8axy_fb#~2(RnX$-UYIKjFuco}wcY1x3qq3^O)oFT)iI=3Y#@VR9)S$W0 zczS)q)Z@C%-mk^kXK;C~y2i4?(RhWD3=R(x5)!E@?_vM|00DGTPE!Ct=GbNc000Sa zNLh0L01FWS01FWTe`H^g0000ibVXQnLvm$dbZKvHAXI5>WdKukZXhu-AWvg-ATls8 zGaxcBIx{djFf$-6FfcGMj5TEz000BMNklwgnP6oxATmTYM04hfcoZFXrQ zT^hv%vbk)?#gfKNk5;59qOCz_z0gE9#A-kU2`$n>$}NVAC?ewZkMzvU##BXren|b` zo1C4@Iq%Ffm;I2guK!Z&*L3z@+dqGNw3hnm=U+Ic=h62M9&;`Kuw(gg$92D-gT8t2 z?L)4a?*^rrhaK07xsHLpx_@g0b>#LA3FY{DrPFE}Uoz00yR;X&H%K{>^DI`_w_{Na zaL~U?@HX2Q%Ua8mq!DrR0N(GQh2FoN}T&NQxY(B~J-T5aoKn{;uYhN>(8)tNd}17jm7o+WAV@R<^L$6|nMS!>KDGLmPGN$A z4vqlC*~*}p0Qd+B7$r?m%C=)LnMvpIQN+mr4rdaUPaP}K7KdduT62|^7U=yC6h$E? zR^8GGOhgfsnE=oL3X{cRDp5kr0gUN5Q4|V_`{@H=VFac9mhVG=@sn&=Mx`~Mk|X@+ zju;Bno9$b2?xUbFw7!Bd4sT_(sp<6FI8z4Kdh{J1109cg5fsMBaP=v5W|sSKZSPLw zFo5GYdNNFupofEAG;&PsTiPdMS8svTSLsoVr@a8LX?Xev_lUXN>xVEmk>@)?&|!6N zi2K6)2s3Z+mmyAaqHKWz!Jvqry^hv?SeJxUEgZp!4n<=zJ-*)`iEH~K2`w(rawr)~ z#nTBbikUcsQdv~9rMX?eDAP@hOFZFM-e zk?Q`X33f}HdwP299oLrL?$)1^4Qr{5&vb8Ufu35omU?=9*Z)$#0ag38A#p!` Qod5s;07*qoM6N<$f*b)Al>h($ literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/dark/nonew.png b/e107_plugins/forum/images/dark/nonew.png new file mode 100644 index 0000000000000000000000000000000000000000..fee8fb9a4e26ea2e589653c9823fe5ae9f156482 GIT binary patch literal 740 zcmV4h{~Ej*i^i z+}_^asHmtN9Uacj&gJFh=;-L@=jZ0;=GNBMiHV7ahljely3*3p+S=ON+uOmx!IP7d zNl8f!4Gk(PDn&&_Sy@?Lb@K`U0004WQchC4uIu{(==nPrmj{4=;nS^p`RvuB;{yC;*^7_qYlGsG5vVHv#~4 zIBn9el>k8BZ+&QQx-}aIfWEA**Y3%tIs!1C-8U{fo!IQ?9;n}Ewl9`4xciSQ^Wk*h z`qKF_Mu)@LK3@RuyX)svYpS}OoQSNld_xeALx^#cLJL8baT2LY&R2KWz- Wo;_3x-m$R&0000kOjJbx000IC1{4$&At50!FfcniJ3Kr* zGBPqEA|e$P6$l6jC@3geT3VKtmb<&V$jHdPzP_58nqXjHD=RA&78U^k0UH||M@L6; za&lc=U6hoR-{0Tm<>lt)=GocV&(F`Kq@+zvO&uK_0|Nsb92`?qQ>?74X=!P$uC8%$ zaiO81;o;%qZxw*L>9v(_cN~)@=g@uKPh=|kE)4aUAYinz+9#|=XQ2> zr>Cc%pP!hRn3a{4iHV6cG&ELLR(N=L!NI|hkdU^vw(05Vot>STnVE)$hB`VrQBhHX zf`WvEgn4;+o12?{etzKK;P3D6l9G~*jg2`uIYmW9dwY9||NlfpL|a0*o0LYt61k@3hfmjALX_3Rd{B@@9L--WNFmu|h#Tc>o^rpmvNJi}mmX%-_x7tn1V*mg^Q(Bt`VDDsdRJ2O9H0V6{_BjZ(_ zZ`?N&INyjeUQ=UbeEm(KoROjQAM*jn7aukLF*81UY|P3y&sU7GiIG9oiIMR;6UPfl zM#kN4j9++xW-|6LGQ?fI=XYJ}ywPrcp*Kq6FC~D^X9Qa52a;wyX#phO3o$YR#TmE1 zVPtRs@}E65`}S1~EYEmXg>mmUpy$P;84=(!AJAcMz(J(~6Z^yuH29VH)7M~OQJ65$ vjbLM7(ZIwB;xd2*-ylUA!tig%afuE9_;Yy|TiY9a00000NkvXXu0mjfo!|jQ literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/dark/nonew_popular_small.png b/e107_plugins/forum/images/dark/nonew_popular_small.png new file mode 100644 index 0000000000000000000000000000000000000000..6bd2a81c58536d52ca0ef39bf0f67f52ea26c1ab GIT binary patch literal 809 zcmV+^1J?YBP)@i0|O!=B4cA?ySuyB*Von6 z)opEUy}iBC($dGr$G*P4zrVkNf`T3%9u*Z8gM)+R<>lMk+qk&6ZfT4)YR1B;o-Ejv~qHCv9YnKsi~)@r&(E9fPjFrv$JMqX3)^k>+9?1 z=jV2IcBZDLo12@Il$1O?JYivBbaZr|pP!JBka&1_wzjtE>FKMht9N&In3$N8laob7 zMU0G$o}Qk5etzKK;P3D6rKP1qLqmUme|&s=dwY9}i;JkJsKms?oSdAAiHY#=@S>uk zdU|>|I5^qa+1=gUz`($upr9ioBM}i1OiWD0#l`68=#`a~EiEnL;^Ol1^7#1p^YioS z>gwd=^)ps&4$Q0?;s+q&)WEv%unx5-ZlyB z4?b6$w?DY|ICBy;7h_lD@2#pz(*@79%{C^t%G%O9qo!bI^tjjdgvT@kA9abZ<6*fH z@`VRO#!qWg;3|6R;k7w=y>&pYlKUn_V@aoJ8I$dv%D nMI`{_UPKfDAR8hAfS-te^!G%Qk#al100000NkvXXu0mjfyP0(l literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/dark/nonew_small.png b/e107_plugins/forum/images/dark/nonew_small.png new file mode 100644 index 0000000000000000000000000000000000000000..05757918c99b2af42f502631857a4936a4411952 GIT binary patch literal 727 zcmV;|0x127P)ylB_$gd4-XH0eSLs{ zfQ5yHjEszaett(sM-C1SCMG6kW@dkXe}RF4XJ=<;AU-}mv9Yn!)6?MK;O6G$;o;%b)YQbp z#I&@uVPRpuzP{Gh*6!}^_V)Jg@9*Q|gww2>+6`9m`X}Y85tP?0Rb{HG8`Nn3kwVRKePk@0004WQchC< zK<3zH00009a7bBm0017r0017r0mErjQvd(}*-1n}R45e%!LdriKmf<#|L+ddyEGMP z+QC5w5u}qKf*^vEtE-RT0|?SbaBy;S^&xx;5rjHBm_e`&SlV1_QqS*0()juP_MRJ9 z-$_XR8b0>;+J=W9)V~6dM49s#VE+_;I|zWMfV=$M4JioV)lKMJ{Jfn5(AK>&hm-7O zlmUXOH9a_^v3606#5}8whvW$68?_|YY(}%WdKHUX&^B;AVF|)ATls8GaxZBIxsLgG&3MAFfcGMOr|~t0006} zNklLfrJ1FfdqjE8cct|dgzp8iZ+0z+B@T{=;Na6vcA+A`UPpAcD?73_s;^nK^5{UhntOQNQ2+b7Et=tyZg4 zDy?qXK|hsX&ap$AEr_%dXY8<&nu>8809buj=dy_EDd$LJ%0Z|Jf5JXfdP`Nm@Kr0huyxLM?cSq-#IJ027%EHW0trNs$z>a;qYHrt+MXZO1x97H1FL;_DZkgmc<#~{J3qC!Jo)V91gn`)&)(F)b?{r$ukOseQR&{I sYZx)d%5_#ZfN5sc^ZE}PmSg7lFD5wse1kw3$p8QV07*qoM6N<$f(;-?EdT%j literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/dark/post.png b/e107_plugins/forum/images/dark/post.png new file mode 100644 index 0000000000000000000000000000000000000000..470e0c1b8c6896c02f2fd2c2ab8f3373e1d78ea5 GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^d_c_2!3-oTqJ08@6id3JuOkD)#(wTUiL5|Adx@v7 zEBj>@K@kD|7S6D8pb$@hPl)S(hW|k3v17;n|Nk#=`q^I~hp{BcFPOpM*^M+HhqJ&V zvKVN#5C}6~x?A@LD5&D;;us<^H96q`Lr+4(10!a}CjO^JO2sp0t~iv+#B4EL@SOmI Xt{TJa9~Lq#K=llsu6{1-oD!Mp=3x&}aC^xeDzsExhE)7O>#DzgN)I!8<5cP*e0 zXMsm#F$06#K@esMpUXO@geCwMOic#> literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/dark/profile.png b/e107_plugins/forum/images/dark/profile.png new file mode 100644 index 0000000000000000000000000000000000000000..48a2b85f7f40d5917e01ac8a75fc4c98e34b7b41 GIT binary patch literal 588 zcmeAS@N?(olHy`uVBq!ia0vp^l0YoP!3-p4erTNpq;yJLBTAf$QWHxu^Yau!GILWI z+=?<43@sEK3yKts3=E7F3=OPIO|1+K6m$)Mpx$jt4NxC@iKnkC`&DKM0WK-`#tAY& zA)vBdK~YXo$qzSWP60ZLu_VYZn8D%MjWi(V zyQhm|NX4z%3Af7*DG0c>d+TVf^kOMe+#+=`V^Qw^|F5l%%vken;d9Qk^|s8+AL{*r z|6RN3v~QpADT~MbyF4D2NE+WW&V0K(p+e}pT-|r0ThfdN@|)`|g6}%seDUyD<4upW zr!{Ql8fOzEC*&2bV`S6_H+6Pzc>ec|i;${{CHuXfspm|a#60gSZoGFspF2_MUSG=h zKbkCG`c~=rs;Ep#cWOx9Z7<@%5%6-W=BvF~5C0~IY?%3N5|igdlhC&^LOd?6zo$GX z`!v^Vn}+rhua&x5Zqax60w(VBnwfg@cGYIrO_AwFq9t>@A3c&>Y~mTVTBR~kB>Eu# YQ8&5Eakg8GfkD9F>FVdQ&MBb@0CQ#nt^fc4 literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/dark/quote.png b/e107_plugins/forum/images/dark/quote.png new file mode 100644 index 0000000000000000000000000000000000000000..a74de8266505c03c761bf4a441c56a799d205cc0 GIT binary patch literal 542 zcmeAS@N?(olHy`uVBq!ia0vp^l0YoP!3-p4erTNpq;yJLBTAf$QWHxu^Yau!GILWI z+=?<43@sEK3yKts3=E7F3=ORe46TeT6?6@N;9xcLN1#6T5>H=O_N&Yi0^GvtZjwKN zLYxI2k;M!QTpvJ~(P@pz44@!Ox}&cn1H;CC?mvmFKz>DlPlzj!4l1q=$}SGdu8u0M z?wPZ6?bf|}j{(8CW9QBRDIjm{+N~h47btM;`Sa)Z?g7!gbLYHylFVz&k z{Q4E$mVJRKCvxun^ObUHdks#!YfafM?fF9GiBr+fy7N7sZyZ1Ev}kVeNuT-WkIq~- zV~PBu;5ok%kFYpZ(tIZ1iXCHiK z7w!B&%WeN#FALi9=G2Y}s!hQxvRAm?_pFe5 Uno#FH1?XP}Pgg&ebxsLQ0M|$O00000 literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/dark/reply.png b/e107_plugins/forum/images/dark/reply.png new file mode 100644 index 0000000000000000000000000000000000000000..58f2f534d8355a00b43f134e37e4ba46a92da782 GIT binary patch literal 1832 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 UvIQwIuK)l507*qoM6N<$f)f+^<^TWy literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/dark/sticky.png b/e107_plugins/forum/images/dark/sticky.png new file mode 100644 index 0000000000000000000000000000000000000000..e4364d8958414008238eddcbf63afa9028be3688 GIT binary patch literal 1145 zcmX9-doh5*gQfHWknm6$7D0sVwmfg!2zxVk6FNIe*^Y{tY!Vn3Y*+;hXc086a`W+%b+mQak`d?^?(h4 z&468iE%5Otqq111kZnv7LAYwGT=cP;`GJX*fHi;}u=*n`R5EhI?AMct(}wgH>1J34 zSORz#PzZPx2J*~Lda%67q*_Pgm10fIht(^pH;#Xv1f-r&1{Nw}E?@yz_?I&F|Hj^z zza&s_ixcScCN?Cz>(2Zv!pZD=b=9#H23`Qn1Fu7cm;P9CyD)z2XjI}Uu4VR&M}^Ef z;Th(@*jWaT!zwV)dY`J@oocv`_iJ9)s&#x%d_jXo4P|2CQP?qpwlK z|LR0>W49!+3EAhTI59Q&_&DC$`Z`@N!P_!YSFz&^Ew1x9 zQqws)za{jx%YJx5+*~}H%5oIZ+6k3mOJV$pCYip1cyp+RDf@q@cpAF zkJ>DDS9i2FX1+pmY!=?KpfL?}zqrHDY&~I;$uZGbvN`Avk#lC;!4l34WTv#Sb{ui{mXQxic#~ zan|41WfLt-X>#^4A*g)a3)@yR9m z23*E9$d;tyr}g~oAd4WDo(Dh{0p)I{4+;|dAKn}5dpsuY8t7^eR`D+%bv^E&?_j)M zogkc*$%hT7T((}4mr0xp=KOA&)t70V6SFDSrIyoM(-iZi)5*F1 z)%Qnc^kLEY7d{0lDjS~vJ8TK>Ios6Y%C3JP)Z^$e@~%Gw27Rk5?OwJ&UAT8KhdoV+ zYW-(6X)rAM?YY-nx0avxot4h@zB{zbX-msOjYzhb>b&tI(WomOkMg(KKQ8QMinNlW zC!PJKH;L@p{&Z-ItBa=U+lUPX!8E1$z5fG=%e#FUMG>oJ^3#Fi>F05GXE^^qN?#x8 literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/dark/sticky_closed.png b/e107_plugins/forum/images/dark/sticky_closed.png new file mode 100644 index 0000000000000000000000000000000000000000..883d118eccdfa34ebe5351a7f0924d3ae5517e98 GIT binary patch literal 1137 zcmW+!2~bl95Z#}Efq z{Cq!9{zzhCg(;RoZhhWR1M~{L z$WFieB@hgt$_BC;)MbnDIOvL*xl!zLM{9k)4XKPLe_#DmI+y`e@qw%Y^%*-n3L{5s zzmH>|c4qX}a>@QYvS-snse5t|^b2XEbg5eCjs;K<>-93n0UOxA6$NxjVin>I-Qw`> zn&7)4f2AO#qtNTsA%`69$Eo&MC&XD7LIqWwVl3uMDxG*96(m>?N?=6`!BGc2T%LuXswQ#F0M3U&_j|YWWp0J}W{I zdv-5~lH4q)l>DXEnoSF^eIx2`k37F~qC`+uTB($`Nklc(64~ERuj8$xfefqNYu$n^ z%mmJ~w=Ib{+KjK;aa4_yLt2fxs_MK*)L3698+>pV-#)}Y<*0A|SCL*E>lE@4V~g2> zMlYMuJ4J{Zd_RQm^=O#DSpyoT@ckQ{8p3JK=%b2?6mOo7K?hITO=(J=JK?Ivq zlO5?9{to-syY2~LCV1Nhu&k`iP5sKFvy6XF8%FiUY8)SJwE zA(sUWvgLOZZcrL^d>%DmfZCRq`)EX0z@sKz^2F&c^yZh-){UpgTbIw=h@CV`5MSRT z9`n!?9PaX048&_Zc5;RfB%g0uGuH9{#!dRLcW-0y%z^S)n+a literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/dark/sticky_closed_small.png b/e107_plugins/forum/images/dark/sticky_closed_small.png new file mode 100644 index 0000000000000000000000000000000000000000..d68f791076b57db59d9d9792a799973ca12bb63b GIT binary patch literal 902 zcmV;119|+3P)_G%00M|mOjJbx000F80wWU*Q!yfXQ80~QF^yp| zeo--3G$SSz4h{$fOD!LlXEe{8Eb+k|{Lc~m&Jps$9MYgGn`$&pFCh^L1rG-VUOFef zg)sZH5&yve|H%OV(*Xa}0RPGW|H1(Mwh+aNFJwO|5()+e0RT=M6u*2e|EdZ9s{sGC z0RO-M|H}aXwgCUE0RO26#)K_UFd+v70w@FnqC_J3nh*b+0RN=`|F8i6xd8vV0ROQ7 z|E2)_n+=>~FDDlcWd#P-Ya0KV0{@c$|DOQGn;_P=9M-oT*0&zkwjIWwApeyB|B?XI zgCbZpB9ayj@`Mxrj{yIU0MMo$=)Vl*vjNas1*N;0Q8I#eorl(DH8dH z4gZG#|B3+rjR4T2G3dT4-k}In007#F0O+3p)0PPTg#i4A3yxPRm@XFhgAD(J0RMpi z|A+(7s7L6fg=( z@XG(|roV|nN+=Wt0|E~M0&D~U$8Sja?85*5_W%F?`0&TPmR?>p8V?Bt4*&pO005^s zC(fUR>)p@y@#*&Q>FnXt%CVG_XFx|K5d;7LB>(_a5CwKUB86K!hFm*zNGVM!6Ce=? z1Ofs0VlDCj0004WQchC^ zj4=*^KokXM%q9qlF`@7dUc&o&1Z#V5U}0?oXb3I^7Oc3IzHa7EzQD!L_7LFQFQV#^ zld8b9QV$;eU1S> zhX4SrOVegCDp~=L#jsK>%w~i#CubxBbk_=kCN|@_7F|XP_jlH-g3W8UF2}9|AWJgS z4Jk~-W|0aBot+@J?u@U_OQ<%zQM@xDN2Ayv4Grb7x2q#gnldg2^E=4LS)>*B5@stpo0WSb{0rml22kZuH zgXJc=IX^BsEc9bG=ia_>Y$UNBum!Lk@G4*r;6=bzz!QMS;jUf2J5hdIMhD6ySPNJK zn%wrt5BvL$#<^-YDZY59u+HFj@Nbo*c!&CQ%&Nt58jk>00#-wQVTEI4=}l9|-!-D7 zqMy~rmbG6GpaX(O1T{IThSy~a_E*pjcnI()YpNo_QZsy@=Rc+4VuWpu-g|$dL>06P zs&>WLH%Om-BSI@+c_{vpjZ=>Lx>Ie#-aVIIgjt^2>(1an4pxfsEAW>HZRyHgGU50K zG!}Dlz=+e0INkBm+qd6#rN=#=Uepuxbl`Lo-YCF>yor4h!={KxKIe>@yV$T1J$3l# zGWu?y|K5YC$&|gFf86;EeK+yZRrH)#YSA?8kVQ#piXgIh)W|2XIC~BQqZn}G{0zSM z2N#}T;7@!$hQ7AJisbi{t2r!ENRs<0;#N`G;_MLO93n0}zt#VP(U=%6WYz~T0<>?A zzTM*RJs6+&&&>H}W~V2|y1%bCC#9|zQvmA$3?lZITjh>DTgr2{SkhuLRFc=kJc=a# zI$%>V7bGlM`fNz@x(gV?|19nO&jHrCRzM6F8dm;n(`l0pN-5jbO%o>IOgt;RuPakV zSuZ@1IYHKSh+maQDcnh&Z`qA!Me;z4w?BGR>Xg^z!tR3#^Re?j(^HD)6oUt#iwka| z^?ZS#H0vXK@5629I=iUHiJWlHY4PATuhYEH42@)IQ$CcYMiH6U9}68X!>os|%`!~@ NbSZl6m3Q+F{||U3he`kd literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/dark/website.png b/e107_plugins/forum/images/dark/website.png new file mode 100644 index 0000000000000000000000000000000000000000..694ba9c6d349ff217956bc6b118305c775ac79cc GIT binary patch literal 530 zcmeAS@N?(olHy`uVBq!ia0vp^;y^6K!3-qZEw?HHDV-A6h!W?b)Wnj^{5*w_%-mE4 zx1vl1Lkk7Rf+7VY0|R3PLjx;Qb1PF*1ziImSbH#42B?p{#M9T6{VKDB0H1MU{Mizq z5NCl$WHAE+*9Q=0bXsFF11QLn?&#~tz_78O`%fY(ke?Ia6XFV_gNmzzvWtVVt9#}w zUAuMf-ebpr#M-S}m#$sAbSV%mJ$LTf^XJd+-Me?~+O=cn&TZYgbbz5|M&0T9|LN6|Nh*yYirj6jXc&fWr|Z&a@oP}Q9%0` zOM?7@862M7NCR@7c)B=-RNRWaz?pYgL4fr_;>Sr3HdHh=6kgu)eSh-*3&*m4t2$IQ zvzfT0Cmnk9Hb3dE@V5A%5Y5(9|BcK1LuYCI{c@REhADN`mxuGC4sKn&)#$yo_@!U_ zEPBu;~P-C+J~_vfY~jP)D0W|;8zI|t0XmuJ@WaXE{BA#bHt zNZ;*x`Ol2s&#wOa&8v{_=KOhYE9>QMxPG2vY|VEk|Nlf=n?SEUKW?14`*o5FdwF-{ z_8XhlrWMXTAfvW}KkZ*9XZLX#k5}v7w|^`$)xCcDM&?a5ttCO9dM0H!#ZOa|5Iphf S&0L^=89ZJ6T-G@yGywny@9$v% literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/fcap.png b/e107_plugins/forum/images/fcap.png new file mode 100644 index 0000000000000000000000000000000000000000..9bbdffda623a3bbc336b73c41ab5c55fb5d31bb8 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^Oh7Ef0V0J0rCNa$OS+@4BLl<6e(pbstUx|{iKnkC z`z0z>g%hSa%MB;L8&qdyb0FEPGiMrp5 zrP>Pw)eG3|D-37+a6R=^Z`)snRXhvMy=G%+2vT?bW3yXa`?p+fmT~cyOQ}|2af{4z di`TU<@xS@Ya+o_t!whIDgQu&X%Q~loCICn}M|A)I literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/fcap2.png b/e107_plugins/forum/images/fcap2.png new file mode 100644 index 0000000000000000000000000000000000000000..3d82038b14f95d40447ca53d07abbfc4c23a9dad GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfw!2~2@+FN~rlun6jM2T}zYGO%dex5=|W^O7& zaAJvqp{0UjL6L%yfq}7tp{bRTiIu6Lg02A&tf}^F0P15e@$_|Nzsw@cCt-d+tLqF< zh_k>WvY3H^TL^?1FWs&C0~BOQcl32+VA$Bt{U?zX$k+CCaSW-rm26S+Oh{N+Sy{l? yz|hE`=_Zdy&J2qPo+IfEU4~9qjSK=7$uoFQWqRzpWWNqj8-u5-pUXO@geCxO2sZ@) literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/finfobar.png b/e107_plugins/forum/images/finfobar.png new file mode 100644 index 0000000000000000000000000000000000000000..292688b6695dc478a51c1c54cf13fce984abf401 GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfw!2~2@+FN~rlun6jM2T}zYGO%dex5=|W^O7& zNJgoGp}B%%L6L%yfq}7tk)f55iIst+g02A&gc^LT0qSEf@$_|Nzsw>iBEh@p-riuK z5NCl$WHAE+w-5+3UbKGe-ab literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/forums_16.png b/e107_plugins/forum/images/forums_16.png new file mode 100644 index 0000000000000000000000000000000000000000..8777fd92cc77e048fa1bc8609722ab99c211bb87 GIT binary patch literal 1242 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 literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/lite/English_main_admin.png b/e107_plugins/forum/images/lite/English_main_admin.png new file mode 100644 index 0000000000000000000000000000000000000000..181454ed2b43d726384ac2af3ad85c173984fd7a GIT binary patch literal 1142 zcmV-+1d02JP)XlMkER_bF*7|zdz7n zK}&<2w1u9wm8-z7zt3!dlYf`39w;*@Gd(gqMmR%FG(SijCNYPgxQU{=nXbdK!qRVp zm4lkFcaEkXDKjQ8Iygd1FF8XxL{5R3u_!V<8znD`q`Qr#y@Q*xGd@S0vc|N<)N+NF zhMlr`k*PaIPdP+QiK4lVr@oM>z@N0pw#U|Wh?WdKxlWgs#jL}g%T$(00G8H zL_t(IjkT0NXcR#dhre%kPfkMo6R?p4LLg0Yc0wdw3OS1uk~Z3ig^gII)i$NrSXo&| z5jzDz!JHrjFXTW)gBnEUeg=8w!xys{-v0% zZLpX(=wf+?4D{K%!b9YeE~zUluy<1Xjm`%Gc-8kb7p8T>%;k-jvpI;%4{Nduf*oI z8_bYvZo5(V*(C9np7+t&7E@V^>D6HXYOZGh)2qWwC9kN(LMXFjGG8;5wMZsgg|Eet zcXdwPVl>M&_W7iK$Qbv1!6uZCf6A<%CXBqVr}f)mj(qLt3qwaYk8{i)1shR(U1t3> zV(b&0RK-*x+X6|N$6ZfFai`2o?Wu~fFZG0-cd7;wZCBa>s=w7dR)x^T$mpr6`c{Wj z4XSMug3>mDkb6RY^}AT;tm&3Se%C_-|E0Fofj8ape|*w^0l5_EBQ!+0MF0Q*07*qo IM6N<$g31O7^#A|> literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/lite/English_moderator.png b/e107_plugins/forum/images/lite/English_moderator.png new file mode 100644 index 0000000000000000000000000000000000000000..4895bb43913a8d7a7af95f312f5c145315de0620 GIT binary patch literal 1147 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 literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/lite/admin_block.png b/e107_plugins/forum/images/lite/admin_block.png new file mode 100644 index 0000000000000000000000000000000000000000..04027be1a87fb221b65dbbd29822ecdcc8167143 GIT binary patch literal 900 zcmV-~1AF|5P)hj#;>!qy0Tw;e&PJUohiD6TT zQciwYU4);eyxQRE%hBFoY>8w|jka&f>6GyKtNZz^`|OqRy>ZTJPmo+^hQ`g?%+lXY zS9+RIxAb26|9b!aoB#j4|Np=L|DONn%-i1M?QeUQmPESrH2?2T z|GQYmfkAJ1LR)n{R&6(4nM$MHOzrnI|DZs?S!aaV-s!i#&~8$m;}-hpAOEE;s**86 z*kEAmZEfglYr#@dW*sVbB!Jl>?&uc$Wj&IgsJn!Zt*SxL#`C@9q_ zDbyz?=QTCFH#cMiU)ccp#T(>KNPKc+purd2%K+)15<=D@BIBs2@XpTf$;t1}&)05l z&>9+Q3Q)`d>%$P>S3!hoUzxcV)WQJYp$#lA-Wo478Cdan`(wGlX zy1>$0NRGTW(D94%u33J-LqznAjsK~s{iLMoc6OvPHmr1_^pW<)J=RSzeWtC!-{tOq zhNqQlyZEB|`N8?@s!2 z#`DVg|M36+{{R2~|Nr&>^UnB|dA3Yad&|(?)Y|5Vjcz3R#t;ePJCizjH<81-Q(?kim!|S0004WQchC< zK<3zH00009a7bBm0017r0017r0mErjQvd(}PDw;TR4C75WME*p#Rvnk3=Av`4ClYW z1-QR5Ffts5uo)P@lo8`*MpVG^fpme7PzD1|fe)11!pInF%f4;FePCTj7CMldWk@70n?2+i&#c06a^GNj0$dH zrl>%f8!n5=qF_@f4;{r_0>$A2GcQwl8J^dMsu1ZGSd3u*mJjEg{63!KcTSnCSRE)0 z1hAUf7q9Z|$IA&2`dYR*NbMW{?6{;jpylGqC9TNE;zA}VK|CM~StScI7$j!EFHpHZ zHNo}zzX{i@v#q06pIfb9suax6*?Nbyd1S)P);HFKuImD(fKgx&-~cP|V~C{r*Q-iZm!2aV8UIx3dNV`7V@~ zvzeL0?d>x-AxV$wY1R9n^advmoJmW;;pC{ zJ9@OS=yXGV0pHd}wNH0{yt3s z@R@Ttg1b4X%WBmz@o}lLV3D&ku}q5<{qBCZ^4fYw>YmseYK!G}v$?IY>7VJ1#iFsY z{*8sg^Pfyj_Dfy!rIX+MwXN_%_-TRn1{1Ey5Nr>x&K~~58QBV?Oam7^hsG9V!bjfU zYF}KptFFH+jhOl~erP7-)7@XIiacAsC{rI#x2}wWQu?-LN3%g&&{_QzcE&7DfB8gk ka`QSp^H|WZfkBC7N$5=cyfP`e-RB~}BqYZ-?LJ)g0e|{^tpET3 literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/lite/admin_edit.png b/e107_plugins/forum/images/lite/admin_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..ef248775f9de1855a0a96f3a4b8a6dc7bc639e7d GIT binary patch literal 905 zcmV;419tq0P)hj#;>!qy0Tw;e&PJUohiD6TT zQciwYU4);eyxQRE%hBFoY>8w|jka&f>6GyKtNZz^`|OqRy>ZTJPmo+^hQ`g?%+lW^ zNjhmied${6|9b!aoB#j4|Np=L|DONn%-i1M?QeUQJXlNxP9ark zS#wi*ymG|(tN;3}|Misr?{oj}Qvdfg|DZs?S!aaV-s!i#&~8$m#~<5KcTNBH;J4bQ zG?6HIS$_14|MGnQ?PUMwNB`&~|L7L{Wj&IgsJn!Zt*SxLfi|KKNPKc+purd2%K+)q0`yilYXFM_5vKrR#V^hEoOHfJ zS088C0{YYe^~?b4!w}$CL4;~wnYkC#!T{gK0OrpF?^!-?3XTOWwE%U`EYSCyc)>|a zAY8)$;==&oyAak_K!asvlc^@hw*b*G1IN z@$vTG-|DQU#W+T0LW~|Uzz+g&ACjl7;O6hVz|?kmpi@+WR8)diR)bAWd}3vcs;|U> znV%F{H++_xyDq3S00001bW%=J06^y0W&i*H32;bRa{vGy!2kdr!2!c*R8s%|06s}X zK~yM_V`N}pxX*|HVvGz77a36i!x1RW02SB@lYr7JA5b+68UaQIaTM+ypdYxA_^%j% f0t^WLHwFd(Rrn8-AIMRI00000NkvXXu0mjf(V@?p literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/lite/admin_lock.png b/e107_plugins/forum/images/lite/admin_lock.png new file mode 100644 index 0000000000000000000000000000000000000000..c486fe4e4454af2d827fb1d9c37406476be10b61 GIT binary patch literal 759 zcmWlXdr%8-0LOo8Dr;sbx`atYxXvwaGM2)!cB|&%92a$5cinO1&O7Oj>&kPL$DA6? zWLdKwW=mQ{jXIm`)tZ*+#c_o^uJpC;zTfZXzJGoH`Q`})TN!>KeuNMPZ(D4VhyD|u zO!Z_$Bs1BANe8(JTtc2)p^xqJ_H^GYUP7F&nHo$Fm>!jw(Lsn;kdQBm1E9Ywa;W)s z)pmQOM||6awmYi$`m2ei(v28hh2fdN`3Tp+|D2awU9JUbH=D;=^-7NIZ zMbBK=S+LK7JIo^E7$qFII54x(u>i)Izod-*t5f=~F@BaZ@p=Z@gYYI0=3vXcXyZ)| zx`nWA#{1=PEc|$eev(Fx`4UGa6|d-cK}X$Wv`n?!U2D3r0o}V{O+*J5T`PZ92B!s( z6bAWHM1ht96$MHHjj!d-YSS$)+=tM05Vjp~#XdXETtFeAgjA$^K}Uz0fl3;*{+2uI zOp>h_yojD`I5XkiV-T~#rx2DOd7eu{^L%K-@pK;ai>xKwcclXSEyK4P7|6lk3G}7) z>(=yYBGDC%w_DH}0|OUUfn6S7Um)zR+G|tpx2n=Q6(UE4$XT88p(fd(;CIU6J0I`r zd?a!z5*jb@e|;PH+Uv|ecOm=K<)$k6_radeT^+*%uJ#5^i9}gaBpvu*8Tr~*c(XjO z;6aVHrM2CrP&UgS)t8m2B)2QCi>1>0>iXyH3We6`bQKprC@hq#p6Gu37#SJ)t*d)g z{_vSvt+!g8T5W?|UMrJ56^ri`70Fbp2A!@|qiJkwGs$GC>gpF7O_M@VYcLqc$HybH z#(F%bp=2cqlF6n%+W}9Z9p1LSCs=&;7~I zj+wM6)1NJ#=JPRh$ys*P0cv?hYPgW%v*u;1k(im%_?^KVb{N&?B<*yLE|(HEL~R>o l9$6Z=)3sg{@+mXan=F18*s}8X_&?7C;l&AJl`*O3{{tVmlSBXj literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/lite/admin_move.png b/e107_plugins/forum/images/lite/admin_move.png new file mode 100644 index 0000000000000000000000000000000000000000..1c14e1accbce65842d0c28689a8c45db701b6bd3 GIT binary patch literal 889 zcmV-<1BU#GP)hj#;>!qy0Tw;e&PJUohiD6TT zQciwYU4);eyxQRE%hBFoY>8w|jka&f>6GyKtNZz^`|OqRy>ZTJPmo+^hQ`g?%+lXY zS9+RIxAb26<89+=L~3+bbnCF||DONn%-i1M?QeUQmPESrH2>mC z@n}PBc6N4JKwR{w`Sq0l?{oj}Qvdfg|DZs?S!aaV-s!i#&~8$m;}-hpAODOqnYXvM zacyy=U90qr|MGnQ?PUMwNB`&~|L7L{Wj&IgsJn!Zt*SxLwkfq{Wc8B@zY z-_bhgQy^O~88fE@!Px-$#T(>KNPKc+purd2%K+)q0`!=Cocj9u(b3UfSYJj8Pf8w9 zrKP1&K2)0lv&;bN!w}$CL4;~wnYkC#!T{gK0OpW8o$2Z6^78W2)6+S=Mq zJy4ARq{9HrJtps zo}iwbo}8JSoS2+=Zg|p+(vM-XUuB8g;p@`a9G#%K88B|Ns8~|Mma#&iIyj zwoFoc%h2A`+UAIkvUqW&v8c=5-Rbb~_3`oc-{0!2ro~-Wh+=1q;O6hVz|?kmpi@+W zR8)diR)bAWd}3vcs;|V|H$cB%Z(|$TOS#9>BE?CNOwX zL4bb0LQF`f>IAiFW9yrcR2@qoQw^J{1wc{_>v#DjNdD4Uh!0;7xP6BMw*(Zs%M%cP P00000NkvXXu0mjf>@MAX literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/lite/admin_stick.png b/e107_plugins/forum/images/lite/admin_stick.png new file mode 100644 index 0000000000000000000000000000000000000000..360292d253429e80e75f82379945e98e7753dc33 GIT binary patch literal 1063 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+3?vf;>QaFeOS+@4BLl<6e(pbstUx|{iKnkC z`(;*MZV5TDtvACN7?>FXd_r6mgR%{itDUl2oQiwAihF{pr$n_(Np6{w+%qS;XHM~y zrPXuR_N?8ybnmgX$Ifj%c5d&vYv-=ryLRvSz30!LzkmP!`}gl096;jx_y7MH{*Qvu z5Exn^kgs;%446HnN`m}?ak`vAM2X=RP!(r^M`SSr12-_YaSJhCx?A@LDA?lZ;uxYa zG4(>CaFYTLTf!Ny#V#i*&i?%`f6J_V$GO^uk9Q1@9V+X(VB{h3)>3cf8MltF#&-=u zl)7$o2A{gC5N#Os)Zq0lsZ=YaqR?g4rDnDY`uk))#x6W3tl68c6}Qi8-JePBs_&Fk zUuJV&P&12}Z!2)}-{Q#^I3M^f&HrLAZN6U2zBEEs-{^vs8qhrqp00i_>zopr0RKN! AfdBvi literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/lite/admin_unlock.png b/e107_plugins/forum/images/lite/admin_unlock.png new file mode 100644 index 0000000000000000000000000000000000000000..75b178fd5c33daf16e6dee41f50f19f9ca02c3d7 GIT binary patch literal 766 zcmWksYe-XJ0R7yo)#lQyC^U80TYAugq6bTtlFQWL#>fg%iljdkWmZ1|v4~dG%B-<& zHFbBHR%(gqnwD;63YAm0d1uM$bS;G|5(80i zN5L5ZXCyq)4q9xb#BhsY--yl?u!fC44*ISV3|tQydmu#XLVR3=)==1%IEr?)YuTm@ zjyVv$^euT7Q1nU`mxtslu*LZP%sR$}&3)>0O3o z^Bv`ce|U7T$N!^mbg19&?Hl#F#(uaa{68y-wNFb->YEzpXY=3Rz6Ux(eM4t~rfAUX zt*Lo;JHPPZ1++$EXlk+k5jCc*WWM-FUuANW?2Oxy+&?~NF>VU zUI{F3{FR=#l+)+FbU1IDb59kg?%W9*FN8c(QhbqbR7o|Jywty% rsUw!d`ETr@Yn^??JC-w5oC~v$Oaw2Em^_%9!|oAjLP~tOBqQ%XDkPqH literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/lite/admin_unstick.png b/e107_plugins/forum/images/lite/admin_unstick.png new file mode 100644 index 0000000000000000000000000000000000000000..a8b375db3a4aa50fa0a4d389242e5daab5b91a9a GIT binary patch literal 903 zcmWlXeK6Yx9LB$@>b>G@yDsa@`m)+ISH((iYY$_SUP~|ZcHV+{44}gE%oFJK|(voO@xsM=t-Q=zPdi>4PcN!sv+d=j8Z1ac+vT!y5VfdWEfi zz*gI}ceui-^n#oCQuL5wcx+fHj0$Mabk;T5LQd!-j1Wc%{e&*sYGyspJ(3>I9a0R< zs1{4&qdTs1P-_k;;R&IW@Pg1xs3SZy?GbWBiIFd-U;X}|zRG9c<}WrVBS;91gcka< z(Vp|&u(I|e$OtvGRcc)pbL8Ra0A&IjcXyzWP)@i{TaS!FeyH-hr}s!|(bX8Ef^eH~ zi$*i{~ceoOI+UD%(BJ} zLM}l}W2x+`cLtdDbw_@)t9XNzu=t0NgG|!juq+C9u5kZgBf|rI zTI+ICctDE$X#SSVx1IV7%ObvW$!AXgq_A*}khL4Ffv4i@{gYeT9#=zE`K(o9e_{OX z*h%Et;(OAh+2n*AtNezq2(d=0Dcbo^-Gxeug%&K!vD}4)R?JDEDn)lJel#0QuoGVl z?Q8nAl4H7A;)Iz3%+*2N4UH13Q&^pbW*q7s%r#)jvTN2i(yl$#fic3a`$7sm;5$Yx_~tR8*h5siuuAY z@6lo9X(Xj&C;4?X+<^CFDojH^DMX$F*~n*A(d6|&xv^M;^;53 z!cN?}64ucqo0(UOrV4@$Pc;(o`~%7J^+c?pm|yk_PA0OKZ)5cAe9-o{lej)!L5>B{ zF_Do^JI!`lIe2F}hCR&bhI>d|- YwMySgeB663&9F{fUw@xR-jV751KzaO&;S4c literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/lite/aim.png b/e107_plugins/forum/images/lite/aim.png new file mode 100644 index 0000000000000000000000000000000000000000..8484983262df118fbac3d058f463f84af23f14e6 GIT binary patch literal 759 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 C=hDvr literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/lite/closed.png b/e107_plugins/forum/images/lite/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..86bc69e7fa83a2477d33a1658595b66bdd84eba2 GIT binary patch literal 1152 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 literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/lite/e.png b/e107_plugins/forum/images/lite/e.png new file mode 100644 index 0000000000000000000000000000000000000000..09385ef0aa970a8fb58dd2e594d195eb46c388b9 GIT binary patch literal 1552 zcmV+r2JiWaP)*-y@Rq><00QVxOjJeV>G8wJ(u$3wT3w4gJ%TPUfx*Vl zp{2M&M2Zs;iYhUyNm#>MZp~$V)kRUgDJ-WD4~RiSgP)_ayur&D7@JdP%X*^hi^Tts z$Nz)8{tgh7l$f`Ato3=e|97SEJxRO|5QLJJsDp>Q3=NiGf!k`Z|8TDVS8~(`291J+ zos*W$Vv6HlqW@;6{#<(7zQyAY7?)Up-dCFbPHfc;4TCsKuRdhSRCSs&Lse6Gr7}Ui zp0C>$K(I`b{%4xlIY?PkQ&VGOV>dWDF-T=;pymt=j5}wxLVDXlUxqT-D}nz^PE$lgL>n6$Dk>|Ro0}#-z9L+^C3WW=djARv3Mqg8 z9fAKTQO*`ivJ7=Vh(*MKR{)3RF)YR1E+=7isIX>f zZZBl|1026SK8vrv;R7?SJaX&t_W$(y|0_?~f1A?;KDck4^UC4>{Qdu2e&YZGk(HUm zZII9cM7(jH?$hf3gNMKbOTA5l-n-8DJx;)^#N;kxz!6HmZI0c@*7v{6@?dYu2@sk* zJ)*h3-j1c$2`s8GNVtNG)s>#zT4cnVpV6_r-*I`uKR~4+B9;;ol0-(OczeH(jP;ZN z0004WQchCa+*d@f1&K=YUWehe?e-Pi9pxmfsM z@bXDx=fw?2k~CdscTJKmw$#?ghwu6Co2Fdf%H=XFK5m>{sd%FD3m0$^i%Uyq2afm%6i{g zZt0ULHNLRc8gH$&hl~A{U9I99-<sDsjc&u(kW+!QzaZl}0b+4JG_eR%u=VVUK z~0_uXoLcUx^SXTxJbFo8EB8?R6tu@~nCAD=|?G0xT}G zCP})jv7bc`BV0A@>lkB$GWUdJk~LtUHSYO+tBDV~hGf?eN1gy{tsw#5^R09?vy&ts z(Ub%xnWx4p`5&zW!|z-5^C+(ureo%t@o^rd^~RmD6uhq#gF_6oY9h0#BYd=hxqg32 z0LGX#8TQarX_nPizW^A>v#8M$W135M&e_5fElgRL^7A z9zy^;a;M&U3s9kIjqyTeJies*tY2b66;xiJDySFBsM6CbUJNEdM^ID{5K`17J^zO| zJ+mnZd3mWc?JO9-=w>Wkx+!V$Z}MJz@IG|>|M?RDgHuWvY3H^>jMZgI;}C80Tg6Ocl32+VA$Bt{U?zX$e$D76XN=x;s2DSYqMK=f{Lqy zvWtVVtAmn@y^^!NqLQPEt9#}wUAuMf-eVvDq?fK;J7vzCo+(p$dU{%VdX61CckCPx zTzmff`MrDhu3fvfcJ10ZbLOuzMXzlsWHxec{dTQ;+^p=#V(~{7&g}?zugOYaBu=^lmXK%}JShZpP~H zw+!Nn{1`*-Jcq zUD>a2atWD9Tk}S8GcYhS1o(uw{%80Y(gmujJyOib{3@qU7wT z;_99`OTROGU%Peh*1dbzuH8Ck>C!1vrnL0*w17Yl5LCDHWLLMGJ9q8*^XJ#DT|0K{ z*wUp-i(7hV>w(rVmIV0)GdMiEkp|>&7I;J!Gca&{0AWU_H6}BF zf;uIx5hcz=sfi_-`FRQy_GJHOKH22iSk6pYBDVtXp@H0HGSMQ#Ft6X~>W5%NQr=PCuWn0ku zDdzgqbqlf^%>1^k_O$$S==h>WGro||*&AnlG&9>$c%Z~!^)g+a$C8g3YF0BGwq|bl z#C`2b6yu!hK0of6|6=>F+1p%4m*K#>1H)pDTsWZbI?F7Z5@O0DEg2$v=ZGLN@IJ%d*U047HoW7&uN&t}<6`Dfzfs-uqks=;%;l*%G`0hJYnN6X1egubG~nW&Ht$ zVeE(PoJ0<2V333Z+`til16~^My?m*AU|`DU`$4NEcM1|U71&NX0Y)GRr~?)N29$(i zCdPN9CSC`ofD9lj3+2@i3V}Vq-@rU@2TAKPM@WTG$TQ**B=C8$h>r!Ii@wWPT!h5} z@PRadLWU&c8cl~nA>&CS&I3KbdK78V-3^KYmIGe{R-~>cI3b>@5b@9jFVYlU7dm@7xjEd|(O&}j zXm4+4S@xFqR!T(*ZbP_H$Y0LKIN~&MS9`9`&CT`w(YN=Tz4Y*PSHCO0Je^y{b#^#| z!Qd5|RAeGDwT8rqvgwNT$n`&{BIXTq;dUz^c=DQ2d0pA3$#Shtxy_busjRTonD&cG zYicX8$xU}CY^f+qOtAU9ESB5_RSJ3O8ok>4b5V>Io2IN) z{%<{w>SncLXYaeoU#(4+zZq5ulUv7D8x~~t42McF^oz_cn(R9B>9v99hC1fO%qNSK zp|Zx**1vU_eOh1kOq*8L$f_Th-6_95il1q|U;5vp&jjHkWB<-_wuX(am+p=qqa@3M z`QL}@CkGC_b1)n|e$!(5vi_gi9r_F9^2kHCEcfl(#og%XHHV2{$k0g zvj^5}t9=ID<@uz$#-|^ib8hLh54U_CJyX3b`fkhg`;ZtKMQV>Jws5Ai^1>PEPx$Vm gmh7=?&j*3F2wr?qP?%|PM3dG~DT@`Zyq%8!0gP8yI{*Lx literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/lite/main_admin.png b/e107_plugins/forum/images/lite/main_admin.png new file mode 100644 index 0000000000000000000000000000000000000000..181454ed2b43d726384ac2af3ad85c173984fd7a GIT binary patch literal 1142 zcmV-+1d02JP)XlMkER_bF*7|zdz7n zK}&<2w1u9wm8-z7zt3!dlYf`39w;*@Gd(gqMmR%FG(SijCNYPgxQU{=nXbdK!qRVp zm4lkFcaEkXDKjQ8Iygd1FF8XxL{5R3u_!V<8znD`q`Qr#y@Q*xGd@S0vc|N<)N+NF zhMlr`k*PaIPdP+QiK4lVr@oM>z@N0pw#U|Wh?WdKxlWgs#jL}g%T$(00G8H zL_t(IjkT0NXcR#dhre%kPfkMo6R?p4LLg0Yc0wdw3OS1uk~Z3ig^gII)i$NrSXo&| z5jzDz!JHrjFXTW)gBnEUeg=8w!xys{-v0% zZLpX(=wf+?4D{K%!b9YeE~zUluy<1Xjm`%Gc-8kb7p8T>%;k-jvpI;%4{Nduf*oI z8_bYvZo5(V*(C9np7+t&7E@V^>D6HXYOZGh)2qWwC9kN(LMXFjGG8;5wMZsgg|Eet zcXdwPVl>M&_W7iK$Qbv1!6uZCf6A<%CXBqVr}f)mj(qLt3qwaYk8{i)1shR(U1t3> zV(b&0RK-*x+X6|N$6ZfFai`2o?Wu~fFZG0-cd7;wZCBa>s=w7dR)x^T$mpr6`c{Wj z4XSMug3>mDkb6RY^}AT;tm&3Se%C_-|E0Fofj8ape|*w^0l5_EBQ!+0MF0Q*07*qo IM6N<$g31O7^#A|> literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/lite/moderator.png b/e107_plugins/forum/images/lite/moderator.png new file mode 100644 index 0000000000000000000000000000000000000000..4895bb43913a8d7a7af95f312f5c145315de0620 GIT binary patch literal 1147 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 literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/lite/new_popular_small.png b/e107_plugins/forum/images/lite/new_popular_small.png new file mode 100644 index 0000000000000000000000000000000000000000..eb394104c0d04216d8f4447aef639d2bf2ed9090 GIT binary patch literal 895 zcmV-_1AzRAP)kOfFzd zDpXBDUu2`PwDR=y(Ae2CXINUqKRSI+U8-J;_F;|pVSwdeU$j>+XGu$BZr9!3-Q?mc zP*+8oN|NbVbka;Qc}sK6Ta*7^g7#B&@kwanM@X1VE>Bd}-QM*0^;LOnC~!o2&s(eL ze52@Xbk0#Pd`NTCSbOVJYT!p%*f~>&Vyd*Xi}?^ZN7Z_UhU2+R5$6Y{FhbLB@$A&$*O0B7 zGF?qlYi-@)SWME*p#Rvnk3=E764CfdT zKpiM>7{ssyDm(!Z+X9tifYK}<(FHy*qJjYuU}O+S;obpyjvI;p3glY`1pgZY0{~VQ V5VAP-BpUz#002ovPDHLkV1l4`mS6w? literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/lite/new_small.png b/e107_plugins/forum/images/lite/new_small.png new file mode 100644 index 0000000000000000000000000000000000000000..4ddf34500e125f1ce7dc5213e7198f261fb9a4ad GIT binary patch literal 880 zcmWktYfO^|6usru2YyhrrL-XSVIPuKYlw(H3Usv6c3)Aywl>5^O7eF8|R z+)vt#h!_ippLBJ(%gSn%N|#*jmdk4uiUz&j*U=GKT%3LL<^n}EOQn9DE@ZbaA3F4( z%{Ed}a!Dq0ljMhB@N9m5uUfsdYZvNtNRoK;C|a#pT)a|Ha9^#iR;xb-0`YLz<8<~( zrI?$G3I*=ojV2R19O!hS#e#eGpi+sOH$RX{&znqNL!p;FJ*|9xoXf?uG?YkCt3{&` z_wL1_BHXzXWisS)SJKljWoG(r-n>px!$Ki47|3R0Ru;~tXfnbs#<^etfL=qEM=v{0!wA-lBqfCarf4Of?~+IYT<#RWTw2-^t#P~Y z>Q%gP1Fv1f=H_Lm^HWB~M}XG^Q6myvaX7l!><=tfls;X1J9c$pe?R(sI52=-Z>*}S zm&Ix_7y@3e3t(EKL5~OT+`&hWFc84EZ*gJ*gFze`!n=2|t!<&8;2gk{&d#N1^v}bG zdujcxTj=-W>@0ryf^%~?HipB)*xA`zSlCRG(Z$7u_wQQ^3;QjW=-?nmqZp6J{Qe$_ zs>#cn86OW#PIgpOcvPy#jg2!;pMIU5j?B!=K6^IM(&Ex+exa!4SS)z&-X9J}ol5nS zR$H&to>eL@TCF49-SJ4|%4y+0bp9CCRJjdGre0Oignh}OGz5DM<%P^YBx%X5 zbuiTGPq}UG)Alu$mBK-QZ(*Wt`9&pz^)P2%@y>CgY2RqR@%49Wc_e&)sv$#MULP9s q!EZ-E2S4+YS!ddK;&&o5)F{p!$j&C*|2|&-DKHz$4S#)etnq&uEQ_=N literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/lite/newthread.png b/e107_plugins/forum/images/lite/newthread.png new file mode 100644 index 0000000000000000000000000000000000000000..fe2d21a022ddc2d7b04c95f18ed96de024bda55f GIT binary patch literal 1717 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 KMNUMnLSTZaV$28t literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/lite/nonew_popular_small.png b/e107_plugins/forum/images/lite/nonew_popular_small.png new file mode 100644 index 0000000000000000000000000000000000000000..82f0bf7d1dc858ee251798c3095e9c56350538fc GIT binary patch literal 781 zcmV+o1M>WdP)ARcYk+`&v$L~iW@gaP(Ch2#=jZ2kc6O$wrkk6al$4Z7 zNl9g8Wps3OpP!$QkdSzIc(%5->FMdKtE+c+cbJ%%larHyfq{&SjGmsJetv%7;Nb7? z@1>=se0+R+dwYwEi>Rom#KgpjiHY#=@S>ukdU|?CM@QM&+1=gUz`($uprFjm%*DmU z=;-K`m6fBTqxt#ygoK3R;^Ol1^7#1p^YioS>gwd=3L5U|?uud@94hc;d%3_WKMBj0_BJ!iQ9@1u(3#+Ex3d2PhDHUhi0H zD^Ow0!UV>P28>0FZ+AxDS7KyfWMrIB`0_bp?sN^OT`%HKF-TqVzA5}poiYB16!S|N z6~<-JYx#8~w=*z0$pY2x@H}=Sd8-fO3rR-Ch}&`;pN@Mle&J+9>7n3zgRN@;0n zy}iBn_xH`tkF@{*00DGTPE!Ct=GbNc000SaNLh0L03N{r03N{s!)a7g0002;Nkln_F|9dMACl$vL2k#c%OmT zJJxP%3$CBo=5y+P5d_d)K4rBM-mQ14!1GJ}b*{w*H?;y6n}T?33O(GlKgS8bYT~yT zn_-FaJcQ0jlA9K-ffW*^*&edx#7%Rs1fy&}Ka@9^NL=&4LZ`|wANcAz8P9plz%&4X zZ_U`cohqsj_<*c+_$hUf3M4s@H9%KL0sw%4^beMWQZP!m^t%86002ovPDHLkV1hK; BTG{{r literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/lite/pm.png b/e107_plugins/forum/images/lite/pm.png new file mode 100644 index 0000000000000000000000000000000000000000..3ababb1474b41074a4619ed5c82bf0c3499e68e4 GIT binary patch literal 762 zcmVWdKHUX&^B;AVF|)ATls8GaxZBIxsLgG&3MAFfcGMOr|~t0006} zNklLfrJ1FfdqjE8cct|dgzp8iZ+0z+B@T{=;Na6vcA+A`UPpAcD?73_s;^nK^5{UhntOQNQ2+b7Et=tyZg4 zDy?qXK|hsX&ap$AEr_%dXY8<&nu>8809buj=dy_EDd$LJ%0Z|Jf5JXfdP`Nm@Kr0huyxLM?cSq-#IJ027%EHW0trNs$z>a;qYHrt+MXZO1x97H1FL;_DZkgmc<#~{J3qC!Jo)V91gn`)&)(F)b?{r$ukOseQR&{I sYZx)d%5_#ZfN5sc^ZE}PmSg7lFD5wse1kw3$p8QV07*qoM6N<$f(;-?EdT%j literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/lite/post.png b/e107_plugins/forum/images/lite/post.png new file mode 100644 index 0000000000000000000000000000000000000000..470e0c1b8c6896c02f2fd2c2ab8f3373e1d78ea5 GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^d_c_2!3-oTqJ08@6id3JuOkD)#(wTUiL5|Adx@v7 zEBj>@K@kD|7S6D8pb$@hPl)S(hW|k3v17;n|Nk#=`q^I~hp{BcFPOpM*^M+HhqJ&V zvKVN#5C}6~x?A@LD5&D;;us<^H96q`Lr+4(10!a}CjO^JO2sp0t~iv+#B4EL@SOmI Xt{TJa9~Lq#K=llsu6{1-oD!Mp=3x&}aC^xeDzsExhE)7O>#3L`U*pwW+AKaGJx zoCO|{#S9E`hd`Jy??R~^P>?0v(btiIVPik{pF~z5pC`a4#PvVJe<1VNv19-L{}(v@ z>@SeRSQ6wH%;50sMjDV~;_2cTQgJIep@GrOAi;sD=Zph`aFUBqVoO#-r-8Ad(^li8 oE`vwG&6#|M^wbO-iUffQY<4qjkNfL*0H~kA)78&qol`;+026ddKL7v# literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/lite/profile.png b/e107_plugins/forum/images/lite/profile.png new file mode 100644 index 0000000000000000000000000000000000000000..badf5139ead5ddf7ef92fb044f24d69ad282ce92 GIT binary patch literal 603 zcmV-h0;K(kP)P000sQ0{{R3nec^@00004XF*Lt006O% z3;baP00007bV*G`2h#)+2{#%wTAwrk005j&OjJex0RNPwt!spgQgeG!YjaX-ds=gQ zN@HtET4PdUbBvs&t+lTzI# z&d$ch#=X70wY9aSrKOyloX*b9=jZ1D007R;|6^mEl$4aMt*wNFgnN5?|ITCo|NsBa zoW{=9004WOV=?FN@9*#Lt-Za@*4DMX#zInBLRw=g1Xwlz0004WQchCmrd;kCd{YgYYR45e%!8>l-KokJLdD^9^j{_Jg1gmr7 z93b~UMt~q)T04kf$fih2TE5IwcmePSfC|=t2>?|@0pLgcY!Mmv%o?=|3K*OmPq}ma zeY@A_zPC>eCa^c=>DysOif&ply)baWGSIxHr8o4vIEwWnTLOyoY&L_6F@&djXUUp5ggGK&iMWuvrJK!}HLoH<5D^i4 p<&sNYvu2wjB9c^uw7O?z=6_o2e5OSEH-Z2F002ovPDHLkV1jR+55NEb literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/lite/quote.png b/e107_plugins/forum/images/lite/quote.png new file mode 100644 index 0000000000000000000000000000000000000000..3db9afd185e44e823f0f79ad442f7ddb48e2c0af GIT binary patch literal 562 zcmeAS@N?(olHy`uVBq!ia0vp^l0YoP!3-p4erTNpq;yJLBTAf$QWHxu^Yau!GILWI z+=?<43@sEK3yKts3=E7F3=ORe46TeT6?6@N;9xcLN1#6T5>H=O_RB0nT#RZH^Uur& z3UL;AL>4nJaD4z_MyE95jgR3=A9lx&I`x0{M*rJ|V9E8U9aMx;DF|C#bkO zD7!c)yE>}4x@XSPwOjY@Jq85lj-5LPq=3A&Yqx^HUZB9W=g*(ty9Y$~&Ye5AckkY7 z*RBD1KqHqfT{>sZoGDYL^z`(sUAy-G|Nkv5E!EZ4$ADVizdv{F+WYtKpFe*OG-)kR z+p%+A$=R)XH(G%@8B2ovf*Bm1-ADs+-g~+@hE&{2y?8UM*+8J-p@W&iLd{IE_N_@5 zU;VaUF!{vAp#Rc(`-IzgTHYL#tK>?!S-oMAh|Hl+(GB`~rAZ*g(A97MbRM^d&$&>#`JKgct8-aPT}tvb+Vh=1&Q(Zq-TC)! zdgJv>j_snZk=cvqeP%LxASioPPp_>~Lj6ahT}8XoGS&MW1!a=JYD@<);T3K0RT|7{>lIV literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/lite/reply.png b/e107_plugins/forum/images/lite/reply.png new file mode 100644 index 0000000000000000000000000000000000000000..1f11bab156e61da2103dead0593c2c6a7525830e GIT binary patch literal 1858 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 ZBh31#AZXwRQtto&002ovPDHLkV1inN*NFfC literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/lite/sticky_small.png b/e107_plugins/forum/images/lite/sticky_small.png new file mode 100644 index 0000000000000000000000000000000000000000..bdb94e64b205b4ce808193a83989df1273efe50f GIT binary patch literal 896 zcmWlXZ&1<)9LB$BNu{KmmwBz$P3!Vf&e+(L-L`PUn_Ouo>^99mq%3l^=nBteZQdkG zL@^ap(K~f3m06ZqDy+j0&FSW!)0S@2O`_Zkw}1qGAod-;_&lF`-aRiKS#r|Hlug?< z0RV-Qz)tZxXpIfN-i)9Ha=lt7j7y9I=q&g599{42WHBc(p8TtCs6Ug+IKY1!z~@5p zL0&u}x}1(NU9a*?j*P!wDU4MfXO?E|uQ-)4+}r82FPon|sVz8JBV>#>L|OGaJmXZ) z7}eIleX=RC{tJdOPx#OL?9x+XvEZ;yx^Lw!74?9_fKz~v07n4(VYNGGuq0Z_Kj5}6 zH;aUQ7ijpyMr;SX2lxQ+XTWa28-Qx^!;7@aGdYfz)<1f>zhj5FRDsw4cpdOIpaxJ2 z*a_GItM!xyLG-ZZ_MH^&;}hGk&IhXi8v$DZZvl1zwgEN)Rs&YTBS~1LD7`f@%yuyt z%K;U@NN;^3KNN1g~x9c?TtXcA{{v zN8+!{q^sVKdT}lY3ji-|#vi#jEv>3hwHOwTsNGw||4J&FQTHj9P%$5@g@GkUV$`|W z<7pK9hK#yQG}fW9{ndiz26bJJ7t**AZi97Xd(G~L4a>Xk-D?V*sdzMd6==n(J+k4NFs_h=hN+YCAv z(ftyM=V<#KEhA`d>667>74r%Evc+V&_8xOcl;B$GM|2RDq5D@ei?i6~XGWXJ)RUUp z%G@*7C^gTGJFSZj>*A7eYNS(HC1lm*=XeO>FRfPnd0H8dsSvOgf{$bwAE@&AlLoDu zaH_R7qxYI5aY_;wSPL`9yk+C*gw(SDuj|(!8FG1RXD;Bd<9HEU*6Zn;^$_Ye@nUyj z5wD1|y?=K=$8$eF`5gVT0p6Dh_vFr98q&<3>hwNP9eNrtv}+aVC!&VKJ1nVx#+3dP0`8h?qz93eU`c$nP94rY T{mZ1my8<}zN$idf`9=Q&b|l*QBz``Z`OMMVef|m0le$#v z-b8eJu6^ql`UxZiK}@+lV{HvIb~ zcdfBqf=SONtkhgqIizWJr0(kVk>aM(o{4&I>Cme&`pqId k?6-oBSy~^KY_+Usu3IKs;d01w7SQJmp00i_>zopr02H3`JOBUy literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/images/sub_forums_16.png b/e107_plugins/forum/images/sub_forums_16.png new file mode 100755 index 0000000000000000000000000000000000000000..0c8dc9c5eddc00858ef034d0b985be430bfe917a GIT binary patch literal 1068 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLlgw3{d`U44E1-n|z-efsp}%aNfBg7$(b83W_wLQf@5#9VZNh{J2M!!Kdi3c3|Nryz^WVS!5E~nN>C&YK4<4ju z7f+wDSyooIf70Tnj@geMJ<7_;3JwnL=;*MraZ^)M)6>&y>70|1l@}cy9UdMY7#OIe zq@=E{?jIa|_UySCGiHQ@gj~J)u(-VE^5x4R;c-=UUF$Y%S-EoMnKNhR&71e_+qbIf z*43+5PntYs%G8ZTr4wajWSW|qK7RaMTwL7JF=gY%&DXC#GBq`Q@!~~s`K0XZY;A3A zZ*T978@FU+7bhj*dwcO3N#c9XqyY(IN{Ai@N%T&dyF? zP;lRV6bno!D@ua=f`Qzj02pS*zxe`8w``s+jv*Ddk|Ow6ripS3DLres-f)A*VNPsh zg2K@yIi}I^n=MoZ?ZG*j{gF2fV z4~F|3uCsJr;jGIXEzEq{#!^o5{I%AvJZFtp`R@E7F?Z4;*Ilc2Ew+-lvsvbLmwJV< zS=-WMoCd327(L-QvV7@=f~f5rTx$B$1ijM(F2^fvIy1F3ICT?y|C;(pxx-6VUjF*S z<*5rdb8AgX^>iy^mK|S2JPkH%)=w&U%#k*4*@+D`|8yz~!}3(q!p!14Z%a(LeA~NK zRB5J2&z~d0z6$eZXIxjGtCR+Pb8X6&Q;Q Mp00i_>zopr0P2-z`v3p{ literal 0 HcmV?d00001 diff --git a/e107_plugins/forum/index.php b/e107_plugins/forum/index.php new file mode 100644 index 000000000..28e7c1aef --- /dev/null +++ b/e107_plugins/forum/index.php @@ -0,0 +1,23 @@ + \ No newline at end of file diff --git a/e107_plugins/forum/languages/English/lan_forum.php b/e107_plugins/forum/languages/English/lan_forum.php new file mode 100644 index 000000000..9dd83cfcf --- /dev/null +++ b/e107_plugins/forum/languages/English/lan_forum.php @@ -0,0 +1,114 @@ +To access the full features of this forum you will need to"); +define("LAN_45", "These forums can only be posted to by registered and logged in members, please click"); +define("LAN_46", "Forum"); +define("LAN_47", "Threads"); +define("LAN_48", "Replies"); +define("LAN_49", "Last Post"); +define("LAN_51", "No forums yet, please check back soon."); +define("LAN_52", "No forums in this section yet, please check back soon."); +define("LAN_79", "New posts"); +define("LAN_80", " No new posts"); +define("LAN_81", "Closed thread"); +define("LAN_100", "articles"); +define("LAN_180", "Search"); +define("LAN_191", "Information"); +define("LAN_192", "The users of this forum have made a total of "); +define("LAN_196", "You have read "); +define("LAN_197", " of these posts."); +define("LAN_198", " All new posts have been read."); +define("LAN_199", "Mark all posts as read"); +define("LAN_204", "You can start new threads"); +define("LAN_205", "You cannot start new threads"); +define("LAN_206", "You can post replies"); +define("LAN_207", "You cannot post replies"); +define("LAN_208", "You can edit your posts"); +define("LAN_209", "You cannot edit your posts"); +define("LAN_392", "stop tracking this thread"); +define("LAN_393", "List tracked threads"); +define("LAN_394", "Closed forum"); +define("LAN_397", "Tracked threads"); +define("LAN_398", "Closed"); +define("LAN_399", "Restricted"); +define("LAN_400", "This forum can only be browsed by registered members"); +define("LAN_401", "Members only"); + +define("LAN_402", "This forum is read only"); + +define("LAN_403", "No posts yet"); +define("LAN_404", "posts"); +define("LAN_405", "Read Only"); + +define("LAN_406", "This forum is restricted to administrators only"); +define("LAN_407", "This forum is restricted to members only"); +define("LAN_408", "This is a read-only forum"); +define("LAN_409", "This is a class restricted forum"); +define("LAN_410", "Welcome guest"); + +define("LAN_411", "thread"); +define("LAN_412", "reply"); +define("LAN_413", "threads"); +define("LAN_414", "replies"); +define("LAN_415", "user is browsing the forums at the moment"); +define("LAN_416", "users are browsing the forums at the moment"); + +define("LAN_417", "member"); +define("LAN_418", "guest"); +define("LAN_419", "members"); +define("LAN_420", "guests"); + +define("LAN_421", "Show new posts"); +define("LAN_422", "New posts since your last visit"); +define("LAN_423", "Posted by"); +define("LAN_424", "New threads"); +define("LAN_425", "Re:"); + +//v.616 +define("LAN_426", "Who's Online: "); +define("LAN_427", "View detailed list."); +define("LAN_428", "Re:"); +define("LAN_429", "Top Posters"); +define("LAN_430", "Most Active Threads"); +define("LAN_431", "My Posts"); +define("LAN_432", "My Settings"); +define("LAN_433", "Forum Rules"); +define("LAN_434", "Return to forums"); +define("LAN_435", "My Profile"); +define("LAN_436", " (Will open a new window.)"); + +define("LAN_437", "register"); +define("LAN_438", "and login."); +define("LAN_439", "here"); +define("LAN_440", "to go to the registration page."); + +define("LAN_441", "View forum statistics"); + +define('FORLAN_441', 'No rules defined.'); +define('FORLAN_442', 'My Uploads'); +define('FORLAN_443', '[user deleted]'); +define('FORLAN_444', 'sub-forums'); + +?> \ No newline at end of file diff --git a/e107_plugins/forum/languages/English/lan_forum_admin.php b/e107_plugins/forum/languages/English/lan_forum_admin.php new file mode 100644 index 000000000..7b2e2cbdc --- /dev/null +++ b/e107_plugins/forum/languages/English/lan_forum_admin.php @@ -0,0 +1,208 @@ +Please be careful using this function!"); +define("FORLAN_61", "Update Options"); +define("FORLAN_62", "Forum Options"); +define("FORLAN_63", "Ranks"); +define("FORLAN_64", "Enter your levels here, if left blank generic stars will be used to denote level. Separate levels with comma. Maximum of 10 levels, lowest first."); +define("FORLAN_65", "Forum Title"); + +define("FORLAN_70", "Enable file / image attachments"); +define("FORLAN_71", "Allow users to upload file or image with their forum post,"); +define("FORLAN_72", "Update Order"); +define("FORLAN_73", "Order Updated"); + +define("FORLAN_75", "Parents"); +define("FORLAN_76", "Forums Front Page"); +define("FORLAN_77", "Create Forums"); +define("FORLAN_78", "Forum Order"); +define("FORLAN_79", "Preferences"); +define("FORLAN_80", "Options"); +define("FORLAN_81", "Are you sure you want to delete this parent? - forums of this parent will also be deleted"); +define("FORLAN_82", "Are you sure you want to delete this forum?"); +define("FORLAN_83", "Create Parents"); +define("FORLAN_84", "Members Only"); +define("FORLAN_85", "Read Only"); +define("FORLAN_86", "Admin Only"); +define("FORLAN_87", "Prune topics with no replies in this many days:"); + +define("FORLAN_88", "Prune topics with no replies in this many days:"); + +define("FORLAN_89", "Delete posts completely"); +define("FORLAN_90", "Make posts inactive"); + +define("FORLAN_91", "post(s) made inactive"); +define("FORLAN_92", "thread(s) deleted"); +define("FORLAN_93", "reply (replies) deleted"); + +define("FORLAN_94", "Set Ranks"); +define("FORLAN_95", "Ranks saved"); +define("FORLAN_96", "Forum deleted"); +define("FORLAN_97", "Parent deleted"); + +define("FORLAN_98", "Rank Name"); +define("FORLAN_99", "number of points before level change"); +define("FORLAN_100", "upload images to e107_themes/Your_Theme/forum/"); +define("FORLAN_101", "Main Site Admin"); +define("FORLAN_102", "Threshold"); +define("FORLAN_103", "Site Admin"); +define("FORLAN_104", "Rank Image"); +define("FORLAN_105", "Forum Moderator"); + + +define("FORLAN_106", "Prune Type:"); +define("FORLAN_107", "Forum"); +define("FORLAN_108", " deleted"); +define("FORLAN_109", "days:"); +define("FORLAN_110", "Prune"); +define("FORLAN_111", "deactivate"); + +define("FORLAN_112", "Enable Redirect"); +define("FORLAN_113", "Tick this to make browser redirect to forum page after replying"); +define("FORLAN_114", "User Custom Title"); +define("FORLAN_115", "Tick this to allow users to change their Custom Title"); +define("FORLAN_116", "Reported Posts"); +define("FORLAN_117", "This will delete the record of the reported post. Not the post itself."); +define("FORLAN_118", "Reported post deleted"); +// define("FORLAN_119", "Clicking links will open forum in a new window."); +define("FORLAN_120", "Tick this to allow users to change their Custom Title"); +define("FORLAN_121", "No reported posts"); +define("FORLAN_122", "Click here to email admin when someone reports a forum post"); +define("FORLAN_123", "Forum Rules"); +define("WMGLAN_1", "Rules for Guests"); +define("WMGLAN_2", "Rules for Members"); +define("WMGLAN_3", "Rules for Administrators"); +define("WMGLAN_4", "Submit"); +define("WMGLAN_5", "Set Forum Rules"); +define("WMGLAN_6", "Activate?"); +define("FORLAN_126", "Show Tooltips"); +define("FORLAN_127", "Tick here to show a tooltip containing the first post of the thread when mouse hovers over thread name. "); +define("FORLAN_128", "Length of tooltip"); +define("FORLAN_129", "This will determine the number of characters to display in the tooltip. "); +define("FORLAN_130", "click here"); +define("FORLAN_131", "to set max file size, allowed types etc"); +define("FORLAN_132", "Emphasize Sticky Threads"); +define("FORLAN_133", "Give extra emphasis to sticky threads (separate thread sections and headers)"); +define("FORLAN_134", "Maximum width of uploaded image"); +define("FORLAN_135", "Leave blank to disable auto resizing of images"); +define("FORLAN_136", "Create link to full size image"); +define("FORLAN_137", "Enabling this will resize larger images and also create a link to the original full size image. If disabled, original image will be discarded"); +define("FORLAN_138", "Prune these forums"); +define("FORLAN_139", "To use this setting you also need to tick 'Enable image posting' on the images page"); +define("FORLAN_140", "View"); +define("FORLAN_141", "Post"); +define("FORLAN_142", "Post permission"); +define("FORLAN_143", "Indicates who can post to the forum"); +define("FORLAN_144", "Moderators set"); +define("FORLAN_145", "Configure sub-forums"); +define("FORLAN_146", "No sub-forums yet"); +define("FORLAN_147", "Update sub-forums"); +define("FORLAN_148", "Create sub-forums"); +define("FORLAN_149", "sub-forums"); +define("FORLAN_150", "sub-forum"); +define("FORLAN_151", "ID"); +define("FORLAN_152", "posts"); +define("FORLAN_153", "Tools"); +define("FORLAN_154", "Reply Deleted"); +define("FORLAN_155", "Forum Categories"); + +define("FORLAN_156", "Select forum(s) to perform action on"); +define("FORLAN_157", "All Forums"); +define("FORLAN_158", "Recalculate forum lastpost info"); +define("FORLAN_159", "Select to recalculate lastpost info"); +define("FORLAN_160", "Select to perform this on forums only, not threads"); +define("FORLAN_161", "Recalculate post / reply counts"); +define("FORLAN_162", "Select to recalculate forum thread/reply counts"); +define("FORLAN_163", "Recalculate user forum posts counts"); +define("FORLAN_164", "Select to recalculate user forum counts"); +define("FORLAN_165", "Execute functions"); +define("FORLAN_166", "Forum Tools"); +define("FORLAN_167", "Counts updated for forum"); +define("FORLAN_168", "Lastpost info updated for forum"); +define("FORLAN_169", "User forum counts updated"); +define("FORLAN_170", "Reports"); +define("FORLAN_171", "Report on forum post"); +define("FORLAN_172", "Delete This Report"); +define("FORLAN_173", "Thread title"); +define("FORLAN_174", "Reported by user"); +define("FORLAN_175", "Report submitted"); +define("FORLAN_176", "Report"); + +define("FORLAN_177", "email notification ON by default"); +define("FORLAN_178", "Tick this to allow make the email notification checkbox be on by default"); + +define("FORLAN_179", "(Adding a * to the beginning of the forum name will make this forum a container for sub-forums only. The forum theme must support this option also.)"); +define("FORLAN_180", "Confirm delete operation"); +define("FORLAN_181", "Confirm Delete"); +define("FORLAN_182", "also recalculate replies for all threads in selected forum"); +define("FORLAN_183", "(this function is not allowed when selecting 'all forums' due to the number of queries it will generate)"); + +?> \ No newline at end of file diff --git a/e107_plugins/forum/languages/English/lan_forum_conf.php b/e107_plugins/forum/languages/English/lan_forum_conf.php new file mode 100644 index 000000000..f835678c4 --- /dev/null +++ b/e107_plugins/forum/languages/English/lan_forum_conf.php @@ -0,0 +1,44 @@ +Once deleted it cannot be retrieved."); +define("FORLAN_14", "Cancel"); +define("FORLAN_15", "Confirm Delete Forum Post"); +define("FORLAN_16", "Confirm Delete Poll"); +define("FORLAN_17", "posted by"); +define("FORLAN_18", "Are you absolutely certain you want to delete this forum"); +define("FORLAN_19", "thread and it's related posts?"); +define("FORLAN_20", "the poll will also be deleted"); +define("FORLAN_21", "Once deleted they"); +define("FORLAN_22", "post?
    Once deleted it"); +define("FORLAN_23", "cannot
    be retrieved"); +define("FORLAN_24", "Move thread to forum"); +define("FORLAN_25", "Move Thread"); +define("FORLAN_26", "Reply deleted"); + +define("FORLAN_27", "moved"); + +define("FORLAN_28", "Do not rename thread title"); +define("FORLAN_29", "Add"); +define("FORLAN_30", "to title"); +define("FORLAN_31", "Rename to:"); +define("FORLAN_32", "Rename thread options:"); + + +?> \ No newline at end of file diff --git a/e107_plugins/forum/languages/English/lan_forum_frontpage.php b/e107_plugins/forum/languages/English/lan_forum_frontpage.php new file mode 100644 index 000000000..c12a8eaf1 --- /dev/null +++ b/e107_plugins/forum/languages/English/lan_forum_frontpage.php @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/e107_plugins/forum/languages/English/lan_forum_post.php b/e107_plugins/forum/languages/English/lan_forum_post.php new file mode 100644 index 000000000..c2b6713f8 --- /dev/null +++ b/e107_plugins/forum/languages/English/lan_forum_post.php @@ -0,0 +1,115 @@ +Please note
    Allowed file types:"); +define("LAN_394", "Any other file types uploaded will be instantly deleted."); +define("LAN_395", "Maximum file size"); +define("LAN_396", "bytes"); +define("LAN_397", "This thread is locked."); +define("LAN_398", "This forum is read only"); +define("LAN_399", "You are not authorized to post to this forum."); +define("LAN_400", "post thread as"); +define("LAN_401", "Jump"); + +define("LAN_402", "poll"); +define("LAN_403", "announcement"); +define("LAN_404", "sticky"); +define("LAN_405", "Forums"); +define("LAN_406", "Re:"); + +//v.616 +define("LAN_407", "Redirect"); +define("LAN_408", "If your browser does not support meta redirection please click"); +define("LAN_409", "HERE"); +define("LAN_410", "to be redirected"); +define("LAN_411", "here"); +define("LAN_412", "to go to the registration page."); + +define("LAN_413", "Your poll has been successfully posted."); +define("LAN_414", "Click Here to view your poll"); +define("LAN_415", "Your reply has been successfully posted."); + +define("LAN_416", "Attach file"); +define("LAN_417", "Add another attachment"); + +define("POLL_506", "Allow multiple choices?"); +define("POLL_507", "yes"); +define("POLL_508", "no"); + +define("LAN_FORUM_1", "Uploads disabled: ".e_FILE."public directory is not writable"); +define("LAN_FORUM_2", "Duplicate post"); + + +?> \ No newline at end of file diff --git a/e107_plugins/forum/languages/English/lan_forum_search.php b/e107_plugins/forum/languages/English/lan_forum_search.php new file mode 100644 index 000000000..db8298207 --- /dev/null +++ b/e107_plugins/forum/languages/English/lan_forum_search.php @@ -0,0 +1,19 @@ + \ No newline at end of file diff --git a/e107_plugins/forum/languages/English/lan_forum_stats.php b/e107_plugins/forum/languages/English/lan_forum_stats.php new file mode 100644 index 000000000..8be76923d --- /dev/null +++ b/e107_plugins/forum/languages/English/lan_forum_stats.php @@ -0,0 +1,39 @@ + \ No newline at end of file diff --git a/e107_plugins/forum/languages/English/lan_forum_uploads.php b/e107_plugins/forum/languages/English/lan_forum_uploads.php new file mode 100644 index 000000000..52c18e2ee --- /dev/null +++ b/e107_plugins/forum/languages/English/lan_forum_uploads.php @@ -0,0 +1,25 @@ + \ No newline at end of file diff --git a/e107_plugins/forum/languages/English/lan_forum_viewforum.php b/e107_plugins/forum/languages/English/lan_forum_viewforum.php new file mode 100644 index 000000000..74cd72f8c --- /dev/null +++ b/e107_plugins/forum/languages/English/lan_forum_viewforum.php @@ -0,0 +1,94 @@ +can start new threads"); +define("LAN_205", "You cannot start new threads"); +define("LAN_206", "You can post replies"); +define("LAN_207", "You cannot post replies"); +define("LAN_208", "You can edit your posts"); +define("LAN_209", "You cannot edit your posts"); +define("LAN_316", "Goto page: "); +define("LAN_317", "None"); +define("LAN_321", "Moderators: "); +define("LAN_395", "[popular]"); +define("LAN_396", "Announcement"); + +define("LAN_397", "This forum is read only"); + +define("LAN_398", "Unstick thread"); +define("LAN_399", "Lock thread"); +define("LAN_400", "Unlock thread"); +define("LAN_401", "Stick thread"); +define("LAN_402", "Move thread"); +define("LAN_403", "Jump to forum"); +define("LAN_404", "This forum is moderated by"); + +define("LAN_405", "user is browsing this forum at the moment"); +define("LAN_406", "users are browsing this forum at the moment"); +define("LAN_407", "member"); +define("LAN_408", "guest"); +define("LAN_409", "members"); +define("LAN_410", "guests"); + +//v.616 +define("LAN_411", "Important Threads"); +define("LAN_412", "Forum Threads"); +define("LAN_431", "Syndicate this forum: rss 0.92"); +define("LAN_432", "Syndicate this forum: rss 2.0"); +define("LAN_433", "Syndicate this forum: RDF"); + +define("LAN_434", "Are you sure you want to delete this thread and any replies?"); +define("LAN_435", "Delete thread"); + +//v.617 +define("FORLAN_CLOSE", "Thread closed."); +define("FORLAN_OPEN", "Thread reopened."); +define("FORLAN_STICK", "Thread made sticky."); +define("FORLAN_UNSTICK", "Thread unstuck."); +define("FORLAN_6", "Thread deleted"); +define("FORLAN_7", "replies deleted"); +define("FORLAN_8", "here"); +define("FORLAN_9", "to sign up or login from the login menu."); + +define("FORLAN_10", "Begin New Thread"); +define("FORLAN_11", "New Posts"); +define("FORLAN_12", "No New Posts"); +define("FORLAN_13", "New Posts on Popular Thread"); +define("FORLAN_14", "No New Posts on Popular Thread"); +define("FORLAN_15", "Sticky Thread"); +define("FORLAN_16", "Closed Sticky Thread"); +define("FORLAN_17", "Announcement Thread"); +define("FORLAN_18", "Closed Thread"); +define('FORLAN_19', '[user deleted]'); +define('FORLAN_20', 'Sub-forum'); +define('FORLAN_21', 'Threads'); +define('FORLAN_22', 'Last Post'); + +?> \ No newline at end of file diff --git a/e107_plugins/forum/languages/English/lan_forum_viewtopic.php b/e107_plugins/forum/languages/English/lan_forum_viewtopic.php new file mode 100644 index 000000000..5a808746b --- /dev/null +++ b/e107_plugins/forum/languages/English/lan_forum_viewtopic.php @@ -0,0 +1,89 @@ +Do not use this form to contact the admin for any other reason."); +define("LAN_419", "Send Report"); +define("LAN_420", "Click to view post"); +define("LAN_421", "Forum thread report from"); +define("LAN_422", "This post has been reported from site "); +define("LAN_423", "Message could not be sent. "); +define("LAN_424", "Post has been reported to moderator.
    Thank You."); +define("LAN_425", "Message from: "); +define("LAN_426", "Reporting post in topic: "); +define("LAN_427", "Error sending mail"); +define("LAN_428", "Post has been reported"); +define("LAN_429", "Click here to return to forum"); +define("LAN_430", "poll"); +define("FORLAN_26", "Reply deleted"); +define("FORLAN_10", "Begin New Thread"); +define("LAN_29", "Edited"); + +define("LAN_431", "Syndicate this thread: rss 0.92"); +define("LAN_432", "Syndicate this thread: rss 2.0"); +define("LAN_433", "Syndicate this thread: RDF"); + +define("FORLAN_101", "Email Thread"); +define("FORLAN_102", "Print View"); +define('FORLAN_103', '[user deleted]'); +define('FORLAN_104', 'Thread not found'); +define("FORLAN_HIDDEN", "HIDDEN - LOGIN AND REPLY TO REVEAL"); +?> diff --git a/e107_plugins/forum/languages/English/lan_newforumposts_menu.php b/e107_plugins/forum/languages/English/lan_newforumposts_menu.php new file mode 100755 index 000000000..75d1d3645 --- /dev/null +++ b/e107_plugins/forum/languages/English/lan_newforumposts_menu.php @@ -0,0 +1,32 @@ + \ No newline at end of file diff --git a/e107_plugins/forum/newforumposts_menu.php b/e107_plugins/forum/newforumposts_menu.php new file mode 100755 index 000000000..18d51f649 --- /dev/null +++ b/e107_plugins/forum/newforumposts_menu.php @@ -0,0 +1,99 @@ +db_Select_gen($query2); + +if(!$results) +{ + // no posts yet .. + $text = NFP_2; +} +else +{ + $text = ""; + $forumArray = $sql->db_getList(); + foreach($forumArray as $fi) + { + $datestamp = $gen->convert_date($fi['thread_datestamp'], "short"); + $topic = ($fi['parent_name'] ? "Re: {$fi['parent_name']}" : "{$fi['thread_name']}"); + $topic = strip_tags($tp->toHTML($topic, TRUE, "emotes_off, no_make_clickable, parse_bb", "", $pref['menu_wordwrap'])); + $id = $fi['thread_id']; + + if($fi['user_name']) + { + $poster = $fi['user_name']; + } + else + { + $x = explode(chr(1), $fi['thread_user']); + $tmp = explode(".", $x[0], 2); + if($tmp[1]) + { + $poster = $tmp[1]; + } + else + { + $poster = "[deleted]"; + } + } + + $fi['thread_thread'] = strip_tags($tp->toHTML($fi['thread_thread'], TRUE, "emotes_off, no_make_clickable", "", $pref['menu_wordwrap'])); + + if (strlen($fi['thread_thread']) > $menu_pref['newforumposts_characters']) + { + $fi['thread_thread'] = substr($fi['thread_thread'], 0, $menu_pref['newforumposts_characters']).$menu_pref['newforumposts_postfix']; + } + + if ($menu_pref['newforumposts_title']) + { + $text .= " ".$topic."
    ".$fi['thread_thread']."
    ".NFP_11." ".$poster."
    ".$datestamp."

    "; + } + else + { + $text .= " ".NFP_11." ".$poster."
    ".$fi['thread_thread']."
    ".$datestamp."

    "; + } + } +} + +$ns->tablerender($menu_pref['newforumposts_caption'], $text, 'nfp_menu'); + +?> \ No newline at end of file diff --git a/e107_plugins/forum/newforumposts_menu_config.php b/e107_plugins/forum/newforumposts_menu_config.php new file mode 100755 index 000000000..443ae9efb --- /dev/null +++ b/e107_plugins/forum/newforumposts_menu_config.php @@ -0,0 +1,99 @@ +db_Update("core", "e107_value='$tmp' WHERE e107_name='menu_pref' "); + $ns->tablerender("", "
    ".NFP_3."
    "); +} + +$text = "
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ".NFP_4.": + +
    ".NFP_5.": + + +
    ".NFP_6.": + +
    ".NFP_7.": + + +
    ".NFP_8.": + + + +
    +
    +
    "; +$ns->tablerender(NFP_10, $text); +require_once(e_ADMIN."footer.php"); +?> \ No newline at end of file diff --git a/e107_plugins/forum/plugin.php b/e107_plugins/forum/plugin.php new file mode 100644 index 000000000..81e368b41 --- /dev/null +++ b/e107_plugins/forum/plugin.php @@ -0,0 +1,138 @@ + "1", + "forum_postfix" => "[more...]", + 'forum_poll' => '0', + 'forum_popular' => '10', + 'forum_track' => '0', + 'forum_eprefix' => '[forum]', + 'forum_enclose' => '1', + 'forum_title' => 'Forums', + 'forum_postspage' => '10', + 'forum_hilightsticky' => '1' + ); + +// List of table names ----------------------------------------------------------------------------------------------- +$eplug_table_names = array( +"forum", + "forum_t" ); + +// List of sql requests to create tables ----------------------------------------------------------------------------- +$eplug_tables = array( +"CREATE TABLE ".MPREFIX."forum ( + forum_id int(10) unsigned NOT NULL auto_increment, + forum_name varchar(250) NOT NULL default '', + forum_description text NOT NULL, + forum_parent int(10) unsigned NOT NULL default '0', + forum_sub int(10) unsigned NOT NULL default '0', + forum_datestamp int(10) unsigned NOT NULL default '0', + forum_moderators text NOT NULL, + forum_threads int(10) unsigned NOT NULL default '0', + forum_replies int(10) unsigned NOT NULL default '0', + forum_lastpost_user varchar(200) NOT NULL default '', + forum_lastpost_info varchar(40) NOT NULL default '', + forum_class varchar(100) NOT NULL default '', + forum_order int(10) unsigned NOT NULL default '0', + forum_postclass tinyint(3) unsigned NOT NULL default '0', + PRIMARY KEY (forum_id) + ) TYPE=MyISAM AUTO_INCREMENT=1;", + "CREATE TABLE ".MPREFIX."forum_t ( + thread_id int(10) unsigned NOT NULL auto_increment, + thread_name varchar(250) NOT NULL default '', + thread_thread text NOT NULL, + thread_forum_id int(10) unsigned NOT NULL default '0', + thread_datestamp int(10) unsigned NOT NULL default '0', + thread_parent int(10) unsigned NOT NULL default '0', + thread_user varchar(250) NOT NULL default '', + thread_views int(10) unsigned NOT NULL default '0', + thread_active tinyint(3) unsigned NOT NULL default '0', + thread_lastpost int(10) unsigned NOT NULL default '0', + thread_s tinyint(1) unsigned NOT NULL default '0', + thread_edit_datestamp int(10) unsigned NOT NULL default '0', + thread_lastuser varchar(30) NOT NULL default '', + thread_total_replies int(10) unsigned NOT NULL default '0', + PRIMARY KEY (thread_id), + KEY thread_parent (thread_parent), + KEY thread_datestamp (thread_datestamp), + KEY thread_forum_id (thread_forum_id) + ) TYPE=MyISAM AUTO_INCREMENT=1;"); + +// Create a link in main menu (yes=TRUE, no=FALSE) ------------------------------------------------------------- +$eplug_link = TRUE; +$eplug_link_name = "Forum"; +$eplug_link_url = e_PLUGIN.'forum/forum.php'; + +// Text to display after plugin successfully installed ------------------------------------------------------------------ +$eplug_done = 'Your forum is now installed'; + +$eplug_upgrade_done = 'Forum successfully upgraded, now using version: '.$eplug_version; + +$upgrade_alter_tables = array( +"ALTER TABLE ".MPREFIX."forum ADD forum_postclass TINYINT( 3 ) UNSIGNED DEFAULT '0' NOT NULL ;" +); + +if (!function_exists('forum_uninstall')) { + function forum_uninstall() { + global $sql; + $sql -> db_Update("user", "user_forums='0'"); + } +} + +if (!function_exists('forum_install')) { + function forum_install() { + global $sql; + $sql -> db_Update("user", "user_forums='0'"); + } +} + +?> \ No newline at end of file diff --git a/e107_plugins/forum/search/search_advanced.php b/e107_plugins/forum/search/search_advanced.php new file mode 100644 index 000000000..6c43269a0 --- /dev/null +++ b/e107_plugins/forum/search/search_advanced.php @@ -0,0 +1,47 @@ + 'all', 'title' => FOR_SCH_LAN_3); + +$advanced_caption['id'] = 'forum'; +$advanced_caption['title']['all'] = FOR_SCH_LAN_3; + +if ($sql -> db_Select_gen("SELECT f.forum_id, f.forum_name FROM #forum AS f LEFT JOIN #forum AS fp ON fp.forum_id = f.forum_parent WHERE f.forum_parent != 0 AND fp.forum_class IN (".USERCLASS_LIST.") AND f.forum_class IN (".USERCLASS_LIST.")")) { + while ($row = $sql -> db_Fetch()) { + $advanced['forum']['list'][] = array('id' => $row['forum_id'], 'title' => $row['forum_name']); + $advanced_caption['title'][$row['forum_id']] = FOR_SCH_LAN_1.' -> '.$row['forum_name']; + } +} + +$advanced['date']['type'] = 'date'; +$advanced['date']['text'] = LAN_SEARCH_50.':'; + +$advanced['author']['type'] = 'author'; +$advanced['author']['text'] = LAN_SEARCH_61.':'; + +$advanced['match']['type'] = 'dropdown'; +$advanced['match']['text'] = LAN_SEARCH_52.':'; +$advanced['match']['list'][] = array('id' => 0, 'title' => FOR_SCH_LAN_4); +$advanced['match']['list'][] = array('id' => 1, 'title' => LAN_SEARCH_54); + +?> \ No newline at end of file diff --git a/e107_plugins/forum/search/search_parser.php b/e107_plugins/forum/search/search_parser.php new file mode 100644 index 000000000..5333305fa --- /dev/null +++ b/e107_plugins/forum/search/search_parser.php @@ -0,0 +1,78 @@ +=' : '<=')." '".(time() - $_GET['time'])."' AND"; +} + +if (isset($_GET['author']) && $_GET['author'] != '') { + $advanced_where .= " (u.user_id = '".$tp -> toDB($_GET['author'])."' OR u.user_name = '".$tp -> toDB($_GET['author'])."') AND"; +} + +if (isset($_GET['match']) && $_GET['match']) { + $search_fields = array('t.thread_name'); +} else { + $search_fields = array('t.thread_name', 't.thread_thread'); +} + +// basic +$return_fields = 'tp.thread_name AS parent_name, t.thread_id, t.thread_name, t.thread_thread, t.thread_forum_id, t.thread_parent, t.thread_datestamp, t.thread_user, u.user_id, u.user_name, f.forum_class, f.forum_id, f.forum_name'; +$weights = array('1.2', '0.6'); +$no_results = LAN_198; + +$where = "f.forum_class REGEXP '".e_CLASS_REGEXP."' AND fp.forum_class REGEXP '".e_CLASS_REGEXP."' AND".$advanced_where; +$order = array('thread_datestamp' => DESC); +$table = "forum_t AS t LEFT JOIN #user AS u ON SUBSTRING_INDEX(t.thread_user,'.',1) = u.user_id + LEFT JOIN #forum AS f ON t.thread_forum_id = f.forum_id + LEFT JOIN #forum AS fp ON f.forum_parent = fp.forum_id + LEFT JOIN #forum_t AS tp ON t.thread_parent = tp.thread_id"; + +$ps = $sch -> parsesearch($table, $return_fields, $search_fields, $weights, 'search_forum', $no_results, $where, $order); +$text .= $ps['text']; +$results = $ps['results']; + +function search_forum($row) { + global $con; + $datestamp = $con -> convert_date($row['thread_datestamp'], "long"); + if ($row['thread_parent']) { + $title = $row['parent_name']; + } else { + $title = $row['thread_name']; + } + + $link_id = $row['thread_id']; + + $res['link'] = e_PLUGIN."forum/forum_viewtopic.php?".$link_id.".post"; + $res['pre_title'] = $title ? FOR_SCH_LAN_5.": " : ""; + $res['title'] = $title ? $title : LAN_SEARCH_9; + $res['pre_summary'] = ""; + $res['summary'] = $row['thread_thread']; + $res['detail'] = LAN_SEARCH_7."".$row['user_name']."".LAN_SEARCH_8.$datestamp; + return $res; +} + +?> \ No newline at end of file diff --git a/e107_plugins/forum/templates/forum_icons_template.php b/e107_plugins/forum/templates/forum_icons_template.php new file mode 100644 index 000000000..80bdefdce --- /dev/null +++ b/e107_plugins/forum/templates/forum_icons_template.php @@ -0,0 +1,71 @@ +"); +define("IMAGE_new", "".LAN_199.""); +define("IMAGE_nonew", ""); +define("IMAGE_new_small", "".FORLAN_11.""); +define("IMAGE_nonew_small", "".FORLAN_12.""); +define("IMAGE_new_popular", "".FORLAN_13.""); +define("IMAGE_nonew_popular", "".FORLAN_14.""); +define("IMAGE_new_popular_small", "".FORLAN_13.""); +define("IMAGE_nonew_popular_small", "".FORLAN_14.""); +define("IMAGE_sticky", "".FORLAN_15.""); +define("IMAGE_stickyclosed", "".FORLAN_16.""); +define("IMAGE_sticky_small", "".FORLAN_16.""); +define("IMAGE_stickyclosed_small", "".FORLAN_16.""); +define("IMAGE_announce", "".FORLAN_17.""); +define("IMAGE_announce_small", "".FORLAN_17.""); +define("IMAGE_closed_small", "".FORLAN_18.""); +define("IMAGE_closed", "".FORLAN_18.""); +define("IMAGE_profile", "".LAN_398.""); +define("IMAGE_email", "".LAN_397.""); +define("IMAGE_pm", "".LAN_399.""); +define("IMAGE_website", "".LAN_396.""); +define("IMAGE_edit", "".LAN_400.""); +define("IMAGE_quote", "".LAN_401.""); +define("IMAGE_admin_edit", "".LAN_406.""); +define("IMAGE_admin_move", "".LAN_402.""); +define("IMAGE_admin_move2", "".LAN_408.""); +define("IMAGE_post", ""); +define("IMAGE_post2", ""); +define("IMAGE_report", "".LAN_413.""); + +// Admin Icons + +define("IMAGE_admin_delete", "src='".img_path('admin_delete.png')."' alt='".LAN_435."' title='".LAN_435."' style='border:0' "); +define("IMAGE_admin_unstick", "src='".img_path('admin_unstick.png')."' alt='".LAN_398."' title='".LAN_398."' style='border:0' "); +define("IMAGE_admin_stick", "src='".img_path('sticky_small.png')."' alt='".LAN_401."' title='".LAN_401."' style='border:0' "); +define("IMAGE_admin_lock", "src='".img_path('admin_lock.png')."' alt='".LAN_399."' title='".LAN_399."' style='border:0' "); +define("IMAGE_admin_unlock", "src='".img_path('admin_unlock.png')."' alt='".LAN_400."' title='".LAN_400."' style='border:0' "); + +// Multi Language Images + +define("IMAGE_newthread", "".FORLAN_10.""); +define("IMAGE_reply", ""); +define("IMAGE_rank_moderator_image", ""); +define("IMAGE_rank_main_admin_image", ""); +define("IMAGE_rank_admin_image", ""); + +?> \ No newline at end of file diff --git a/e107_plugins/forum/templates/forum_post_template.php b/e107_plugins/forum/templates/forum_post_template.php new file mode 100644 index 000000000..8802830f1 --- /dev/null +++ b/e107_plugins/forum/templates/forum_post_template.php @@ -0,0 +1,246 @@ + +".LAN_61." + + + +"; +} + +if(!$subjectbox) +{ +$subjectbox = " +".LAN_62." + + + +"; +} + +// the poll is optional, be careful when changing the values here, only change if you know what you're doing ... +if(!$poll_form) +{ + if(is_readable(e_PLUGIN."poll/poll_class.php")) { + require_once(e_PLUGIN."poll/poll_class.php"); + $pollo = new poll; + $poll_form = $pollo -> renderPollForm("forum"); + } +} + +// finally, file attach is optional, again only change this if you know what you're doing ... +if(!$fileattach) +{ +$fileattach = " + + ".($pref['image_post'] ? LAN_390 : LAN_416)." + + + ".LAN_392." + ".LAN_393." | ".$allowed_filetypes." |
    ".LAN_394."
    ".LAN_395.": ".($pref['upload_maxfilesize'] ? $pref['upload_maxfilesize'].LAN_396 : ini_get('upload_max_filesize'))." +
    +
    + + + +
    + + + +"; +// +// +} +// If the upload directory is not writable, we need to alert the user about this. +if(!$fileattach_alert) +{ + $fileattach_alert = " + + ".($pref['image_post'] ? LAN_390 : LAN_416)." + + + ".LAN_FORUM_1." + \n"; +} +// ------------ + +if(!$FORUMPOST) +{ +$FORUMPOST = " +
    +
    +{FORMSTART} + + + + +{USERBOX} +{SUBJECTBOX} + + + + + +{POLL} + +{FILEATTACH} + + + + +
    {BACKLINK} +
    {POSTTYPE} +{POSTBOX}
    {EMAILNOTIFY}
    {POSTTHREADAS} +
    +{BUTTONS} +
    +{FORMEND} + + + + + +
    +{FORUMJUMP} +
    +
    +"; +} + +if(!$FORUMPOST_REPLY) +{ +$FORUMPOST_REPLY = " +
    +
    +{FORMSTART} + + + + +{USERBOX} +{SUBJECTBOX} + + + + + +{POLL} + +{FILEATTACH} + + + + +
    {BACKLINK} +
    {POSTTYPE} +{POSTBOX}
    {EMAILNOTIFY}
    {POSTTHREADAS} +
    +{BUTTONS} +
    +{FORMEND} + + + + + +
    +{FORUMJUMP} +
    +
    +
    +{THREADTOPIC} +{LATESTPOSTS} +
    +"; +} + +if(!$LATESTPOSTS_START) +{ +$LATESTPOSTS_START = " + + + +"; +} + +if(!$LATESTPOSTS_POST) +{ +$LATESTPOSTS_POST = " + + + + +"; +} + +if(!$LATESTPOSTS_END) +{ +$LATESTPOSTS_END = " +
    ". +LAN_101."{LATESTPOSTSCOUNT}".LAN_102." +
    {POSTER} +
    ".IMAGE_post2." ".LAN_322."{THREADDATESTAMP}
    + {POST} +
    +"; +} + +if(!$THREADTOPIC_REPLY) +{ +$THREADTOPIC_REPLY = " + + + + + + + + +
    ".LAN_100."
    {POSTER} +
    ".IMAGE_post2." ".LAN_322."{THREADDATESTAMP}
    {POST} +
    +"; +} + +$FORUM_CRUMB['sitename']['value'] = "{SITENAME}"; +$FORUM_CRUMB['sitename']['sep'] = " :: "; + +$FORUM_CRUMB['forums']['value'] = "{FORUMS_TITLE}"; +$FORUM_CRUMB['forums']['sep'] = " :: "; + +$FORUM_CRUMB['parent']['value'] = "{PARENT_TITLE}"; +$FORUM_CRUMB['parent']['sep'] = " :: "; + +$FORUM_CRUMB['subparent']['value'] = "{SUBPARENT_TITLE}"; +$FORUM_CRUMB['subparent']['sep'] = " :: "; + +$FORUM_CRUMB['forum']['value'] = "{FORUM_TITLE}"; +$FORUM_CRUMB['forum']['sep'] = " :: "; + +$FORUM_CRUMB['thread']['value'] = "{THREAD_TITLE}"; + +?> \ No newline at end of file diff --git a/e107_plugins/forum/templates/forum_posted_template.php b/e107_plugins/forum/templates/forum_posted_template.php new file mode 100644 index 000000000..64990c533 --- /dev/null +++ b/e107_plugins/forum/templates/forum_posted_template.php @@ -0,0 +1,58 @@ + + +".LAN_133." + +".IMAGE_e."  + +
    ".LAN_413."
    +".LAN_414."
    +".LAN_326."


    +"; + +$FORUMTHREADPOSTED = " + + + + + +
    ".LAN_133."
    ".IMAGE_e."  +
    ".LAN_324."
    +".(defined("F_MESSAGE") ? F_MESSAGE."
    " : "")." +".LAN_325."
    +".LAN_326."


    +
    "; + + +$FORUMREPLYPOSTED = " + + + + + +
    ".LAN_133."
    ".IMAGE_e."  +
    ".LAN_415."
    +".(defined("F_MESSAGE") ? F_MESSAGE."
    " : "")." +".LAN_325."
    +".LAN_326."


    +
    "; + +?> \ No newline at end of file diff --git a/e107_plugins/forum/templates/forum_preview_template.php b/e107_plugins/forum/templates/forum_preview_template.php new file mode 100644 index 000000000..d00bb171e --- /dev/null +++ b/e107_plugins/forum/templates/forum_preview_template.php @@ -0,0 +1,36 @@ + + + +" : " ( ".LAN_62.$tsubject." )")." + + + + +
    ".LAN_323. +($action != "nt" ? "
    ".$poster." +
    ".IMAGE_post2." ".LAN_322.$postdate."
    ".$tpost."
    +